Realm 도입으로 APK 비대화 방지 (Split APK)
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 버전을 다운로드합니다.
APK 분할 설정하기
공식적으로 쓰여진 대로 아래와 같이 기술합니다.
build.gradleandroid {
// Some other configuration here...
splits {
abi {
enable true
reset()
include 'x86', 'armeabi', 'armeabi-v7a'
universalApk false
}
}
}
위를 기술한 후에 "Sync Project with Gradle Files"를 실행하면 assembleFreeArmabiRelease 등의 태스크를 할 수 있습니다.
아키텍처별 버전 코드 변경
이후는 Play 스토어에서 공개하기 위한 작법입니다.
Play 스토어에서 아키텍처별로 여러 APK를 등록하는 경우 각 아키텍처의 APK는 서로 다른 버전 코드를 가져야 합니다. 그래서 아래와 같이 기술하여 버전 코드를 자동 설정하도록 했습니다.
build.gradleext {
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 {
// Some other configuration here...
splits {
abi {
enable true
reset()
include 'x86', 'armeabi', 'armeabi-v7a'
universalApk false
}
}
}
이후는 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)
}
}
}
}
참고
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
Reference
이 문제에 관하여(Realm 도입으로 APK 비대화 방지 (Split APK)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takke/items/8f7ca95d35e6f942eba2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)