Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

혼자서 앱 만드는 개발자 함께하는 AI 세상

16KB 페이지 크기 지원 문제 해결 기록 본문

카테고리 없음

16KB 페이지 크기 지원 문제 해결 기록

혼앱사 2025. 12. 11. 17:09
반응형

16KB 페이지 크기 지원 문제 해결 기록

문제 개요

Google Play Console에서 "앱이 16KB 메모리 페이지 크기를 지원하지 않습니다" 오류 발생

Google Play 요구사항

  • 시행일: 2025년 11월 1일부터
  • 대상: Android 15 (API 35) 이상을 타겟팅하는 모든 신규 앱 및 업데이트
  • 요구사항: 64비트 기기에서 16KB 페이지 크기 지원 필수

근본 원인

써드파티 라이브러리의 네이티브 라이브러리(.so 파일)가 16KB ELF 정렬을 지원하지 않음

문제 라이브러리 (mobile_scanner 3.5.2)

libbarhopper_v3.so: align 2**12 (4KB) ❌
libimage_processing_util_jni.so: align 2**12 (4KB) ❌
libdatastore_shared_counter.so: align 2**14 (16KB) ✅

해결 방법

❌ 실패한 시도들

1. 32비트 ABI 제거만으로 해결 시도

ndk {
    abiFilters.clear()
    abiFilters.addAll(listOf("arm64-v8a", "x86_64"))
}
  • 결과: 실패 - 써드파티 라이브러리는 여전히 4KB 정렬

2. useLegacyPackaging = true (압축 모드)

packaging {
    jniLibs {
        useLegacyPackaging = true
    }
}
  • 결과: 빌드는 성공하지만 Google Play 검증 여전히 실패
  • 이유: 압축 모드는 설치 공간만 증가시킬 뿐, ELF 정렬 문제 해결 안 됨

3. extractNativeLibs 속성 변경

android:extractNativeLibs="true"
  • 결과: 실패 - 근본적인 ELF 정렬 문제 해결 안 됨

4. NDK 버전 업그레이드만으로 해결 시도

ndkVersion = "28.0.12674087"  // NDK r28
  • 결과: 실패 - 자체 빌드 라이브러리는 16KB 정렬되지만 써드파티는 그대로

5. gradle.properties 설정

android.bundle.enableUncompressedNativeLibs=true  // Deprecated
  • 결과: AGP 8.1에서 제거된 옵션, 효과 없음

✅ 최종 해결책: mobile_scanner 업그레이드

pubspec.yaml

# 변경 전
mobile_scanner: ^3.5.2

# 변경 후
mobile_scanner: ^7.1.3

코드 수정 (API 변경 대응)

lib/screens/qr_scan_screen.dart:

// 변경 전
IconButton(
  icon: ValueListenableBuilder(
    valueListenable: cameraController.torchState,
    builder: (context, state, child) {
      switch (state) {
        case TorchState.off:
          return const Icon(Icons.flash_off, color: Colors.grey);
        case TorchState.on:
          return const Icon(Icons.flash_on, color: Colors.yellow);
      }
    },
  ),
  onPressed: () => cameraController.toggleTorch(),
)

// 변경 후 (torchState API 제거됨)
IconButton(
  icon: const Icon(Icons.flash_off, color: Colors.grey),
  onPressed: () => cameraController.toggleTorch(),
)

검증 결과

ELF 정렬 확인 (mobile_scanner 7.1.3)

# NDK llvm-objdump로 확인
libapp.so: align 2**16 (64KB) ✅
libflutter.so: align 2**16 (64KB) ✅
libbarhopper_v3.so: align 2**14 (16KB) ✅  # 4KB에서 개선!
libimage_processing_util_jni.so: align 2**14 (16KB) ✅  # 4KB에서 개선!
libdatastore_shared_counter.so: align 2**14 (16KB) ✅
libsurface_util_jni.so: align 2**14 (16KB) ✅

ZIP 정렬 검증

$ zipalign -c -P 16 -v 4 app-release.aab
Verification successful ✅

최종 빌드 설정

android/app/build.gradle.kts

android {
    compileSdk = 36
    ndkVersion = "28.0.12674087"  // NDK r28: 16KB 기본 지원

    defaultConfig {
        targetSdk = 35
        ndk {
            abiFilters.clear()
            abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a", "x86_64"))
        }
    }

    packaging {
        jniLibs {
            useLegacyPackaging = false  // 압축 해제 사용
        }
    }
}

plugins {
    id("com.android.application") version "8.11.1"
}

android/app/src/main/AndroidManifest.xml

<application
    android:extractNativeLibs="false">

android/gradle.properties

org.gradle.jvmargs=-Xmx8G
android.useAndroidX=true

교훈

1. 써드파티 라이브러리가 핵심 문제

  • 자체 빌드 코드는 NDK r28로 자동 16KB 정렬
  • Google ML Kit, Google Play Services 등의 네이티브 라이브러리가 16KB 미지원
  • 패키지 업데이트로 해결 가능

2. AGP/NDK 업그레이드만으로는 부족

  • NDK r28은 자체 빌드 라이브러리만 16KB 정렬
  • 사전 빌드된 써드파티 라이브러리는 패키지 업데이트 필요

3. 압축 모드는 임시 방편일 뿐

  • useLegacyPackaging = true는 설치 공간만 증가
  • Google Play 검증은 ELF 정렬을 확인하므로 근본 해결 안 됨

4. 검증 도구 활용

# ELF 정렬 확인
llvm-objdump -p libXXX.so | grep LOAD

# ZIP 정렬 확인
zipalign -c -P 16 -v 4 app-release.aab

참고 프로젝트

  • cleaning_dot: 동일한 문제 해결 완료
    • mobile_scanner 미사용 (barcode_scan2 주석 처리)
    • 압축 해제 모드 사용
    • 모든 라이브러리 16KB 정렬 확인됨

타임라인

  • 2025.11.01: Google Play 16KB 지원 필수화
  • 2025.12.11: mobile_scanner 7.1.3 업그레이드로 해결
  • 버전: 1.0.17+17

참고 문서

728x90
반응형
Comments