Realm 도입으로 APK 비대화 방지 (Split APK)

12352 단어 안드로이드Realm
Twitter 클라이언트의 내부 DB를 SQLite에서 Realm으로 마이그레이션 할 때의 노하우 요약 - Qiita

Realm 공식의 해설대로 아래와 같이 build.gradle 에 기술해 Realm 를 도입하면 APK 사이즈가 몇MB 정도 커집니다.

build.gradle
compile 'io.realm:realm-android:0.82.0'

이는 Realm의 Core 부분이 NDK로 작성되었으며 모든 아키텍처에 대한 .so 파일이 포함되어 있기 때문입니다.

그래서 아키텍처별로 APK를 준비(분할)함으로써 APK 크기의 증가량을 700KB 정도까지 억제할 수 있었습니다.

공식 정보는 Reducing your Android APK size when using native libraries — how we made Realm 76% smaller in your apps - Realm is a mobile database: a replacement for SQLite & Core Data입니다.

Our distribution package (available on our website under Download->Java) contains a folder called 'eclipse'. This folder contains a split version of the Realm library. All you need to do is to copy the small jar file into the libs folder of your app and copy the four folders in the src/main/jniLibs directory.

ZIP 버전 다운로드 및 배치



gradle에 compile의 1행으로 도입하는 것은 간편합니다만, 불행하게도 모든 아키텍쳐의 .so 파일을 포함한 jar 가 이용되기 때문에 APK가 비대화해 버립니다.

그런 다음 ZIP 버전을 확장하여 아키텍처별 .so 파일을 배치합니다.

  • 공식 사이트 상단의 링크에서 ZIP 버전을 다운로드합니다.
  • ZIP을 확장하고 eclipse 폴더의 realm-0.82.0.jar을 앱의 libs 폴더에 복사하고 각 아키텍처의 폴더를 src/main/jniLibs 디렉토리에 복사합니다.

  • Gyazo - a81c942d2fff3e56fd3fea4bec55ec31.png

    Gyazo - 242c886314f7d7f11bc2dec81727f34f.png

    APK 분할 설정하기



    공식적으로 쓰여진 대로 아래와 같이 기술합니다.

    build.gradle
    android {
        // Some other configuration here...
    
        splits {
            abi {
                enable true
                reset()
                include 'x86', 'armeabi', 'armeabi-v7a'
                universalApk false
            }
        }
    }
    

    위를 기술한 후에 "Sync Project with Gradle Files"를 실행하면 assembleFreeArmabiRelease 등의 태스크를 할 수 있습니다.

    Gyazo - aef68fd47207bf63ff7a97f614b4f3a2.png

    아키텍처별 버전 코드 변경



    이후는 Play 스토어에서 공개하기 위한 작법입니다.

    Play 스토어에서 아키텍처별로 여러 APK를 등록하는 경우 각 아키텍처의 APK는 서로 다른 버전 코드를 가져야 합니다. 그래서 아래와 같이 기술하여 버전 코드를 자동 설정하도록 했습니다.

    build.gradle
    ext {
        versionCode = 458
        versionName = '8.1.2'
    
        // map for the version code
        versionCodes = ['armeabi':0, x86:1]
    }
    

    app/build.gradle
        android.applicationVariants.all { variant ->
            // assign different version code for each output
            variant.outputs.each { output ->
                def arch = output.getFilter(com.android.build.OutputFile.ABI)
                output.versionCodeOverride = android.defaultConfig.versionCode * 10 + rootProject.ext.versionCodes.get(arch)
            }
        }
    

    이렇게 작성한 APK를 스토어의 어드밴스드 모드 쪽으로 등록하면 아래와 같이 되었습니다.

    호호, APK 분할하면 스토어에서는 이렇게 등록할까. 피 c. 라고 r. 이 m/flSytm49vl — 타케우치 유아키 (@takke) August 3, 2015

    APK 파일 이름 변경



    각 아키텍처마다 APK 파일의 이름을 바꾸기 위해 다음과 같이 수행합니다.

    build.gradle
        applicationVariants.all { variant ->
            if (variant.buildType.name.equals("release")) {
    
                variant.outputs.each { output ->
                    if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                        System.println("* output filename update : [${variant.buildType.name}]" +
                                "[${variant.productFlavors[0].name}]" +
                                "[${variant.productFlavors[0].applicationId}]"
                        )
    
                        def file = output.outputFile
                        def d = new java.text.SimpleDateFormat("yyyyMMdd_HHmm").format(new Date())
                        def flavor = variant.productFlavors[0]
                        def shortVersionName = defaultConfig.versionName.replaceAll('\\.', '')
                        def arch = output.getFilter(com.android.build.OutputFile.ABI)
                        def newName = "TwitPane_${flavor.name}_${shortVersionName}_${d}_${arch}.apk"
                        output.outputFile = new File(file.parent, newName)
                    }
                }
            }
        }
    

    참고



  • Android - Twitter 클라이언트의 내부 DB를 SQLite에서 Realm으로 마이그레이션 할 때의 노하우 정리 - Qiita
  • Reducing your Android APK size when using native libraries — how we made Realm 76% smaller in your apps - Realm is a mobile database: a replacement for SQLite & Core Data
  • Apk Splits - Android Tools Project Site
  • 좋은 웹페이지 즐겨찾기