J'essaie d'encourager la startup pour laquelle je travaille à passer de SQLite à Realm. La plus grosse objection est la taille de l'application. L'APK de la version compilée passe de 3,5 Mo à 7,5 Mo après Realm (une différence de 4 Mo). La taille post-installation sur un appareil physique semble varier, mais tourne autour de 19MB sur un Nexus 6P (une différence de 6MB par rapport à la version SQLite) et 16MB sur le Nexus 5.
Cela semble beaucoup plus important que ce à quoi je dois m'attendre d'après la documentation de Realm, mais il semble que je ne puisse pas faire grand-chose. J'ai essayé de diviser l'APK comme documenté à https://realm.io/docs/java/latest/#how-big-is-the-realm-library mais lorsque je lance la commande gradlew installDebug, j'obtiens ces erreurs :
Skipping device 'Nexus 5 - 5.1.1' for 'app:release': Could not find build of variant which supports density 480 and an ABI in armeabi-v7a, armeabi
Skipping device 'Nexus 6P - 6.0.1' for 'app:release': Could not find build of variant which supports density 560 and an ABI in arm64-v8a, armeabi-v7a, armeabi
Existe-t-il un moyen de diviser l'APK de manière à ce que seul le code natif du processeur de l'appareil concerné soit nécessaire, ou y a-t-il autre chose que je puisse faire pour réduire la taille de l'APK ? Je réalise que l'impact sur la taille n'est pas énorme, mais cela concerne mes supérieurs, et ajouter 50% à la taille d'une application est assez substantiel.
Le fichier Build.gradle, au cas où cela aiderait :
// Manifest version information!
def versionMajor = 1
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0 // bump for dogfood builds, public betas, etc.
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'io.fabric'
apply plugin: 'realm-android'
android {
def globalConfiguration = rootProject.extensions.getByName("ext")
compileSdkVersion globalConfiguration.getAt("androidCompileSdkVersion")
buildToolsVersion globalConfiguration.getAt("androidBuildToolsVersion")
defaultConfig {
applicationId "com.gane"
minSdkVersion globalConfiguration.getAt("androidMinSdkVersion")
targetSdkVersion globalConfiguration.getAt("androidTargetSdkVersion")
versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
vectorDrawables.useSupportLibrary = false
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
packagingOptions {
exclude 'LICENSE.txt'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/ASL2.0'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
}
lintOptions {
quiet true
abortOnError false
ignoreWarnings true
disable 'InvalidPackage' //Some libraries have issues with this.
disable 'OldTargetApi'
//Lint gives this warning but SDK 20 would be Android L Beta.
disable 'IconDensities' //For testing purpose. This is safe to remove.
disable 'IconMissingDensityFolder' //For testing purpose. This is safe to remove.
}
signingConfigs {
debug {
}
release {
storeFile file('matrix')
storePassword KEYSTORE_PASSWORD
keyAlias 'matrix'
keyPassword KEY_PASSWORD
}
}
buildTypes {
debug {
applicationIdSuffix '.debug'
versionNameSuffix '-debug'
debuggable true
minifyEnabled false
shrinkResources false
// build.gradle testCoverageEnabled true causes debugger to be unable to view local variables/watches
// https://code.google.com/p/android/issues/detail?id=93730
// https://code.google.com/p/android/issues/detail?id=123771
testCoverageEnabled false
ext.enableCrashlytics = false
}
release {
debuggable false
minifyEnabled true
shrinkResources true
testCoverageEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
alpha.initWith(buildTypes.release)
alpha {
minifyEnabled false
shrinkResources false
}
beta.initWith(buildTypes.release)
beta {
minifyEnabled false
shrinkResources false
}
}
splits {
abi {
enable true
reset()
include 'arm', 'arm-v7a', 'arm64', 'mips', 'x86', 'x86_64'
}
}
}
dependencies {
def appDependencies = rootProject.ext.appDependencies
def appTestDependencies = rootProject.ext.appTestDependencies
compile appDependencies.supportAppCompact
compile appDependencies.supportCardView
compile appDependencies.supportDesign
compile appDependencies.supportPercent
compile appDependencies.supportCustomTabs
apt appDependencies.daggerCompiler
compile appDependencies.dagger
compile appDependencies.butterKnife
compile appDependencies.gson
compile appDependencies.okHttp
compile appDependencies.okHttpUrlConnection
compile appDependencies.picasso
compile appDependencies.rxJava
compile appDependencies.rxAndroid
provided appDependencies.javaxAnnotation
provided appDependencies.autoValue
apt appDependencies.autoValue
compile(appDependencies.crashlytics) {
transitive = true;
}
compile(appDependencies.hapiTenantLibrary) {
transitive = true
exclude module: 'android'
exclude module: 'gson'
exclude module: 'okhttp'
exclude module: 'okhttp-urlconnection'
exclude module: 'rxjava'
}
testCompile appTestDependencies.junit
testCompile appTestDependencies.hamcrest
// Robolectric to help us test Android based components (Activity, Service, BroadcastReceivers, etc)
testCompile(appTestDependencies.robolectric) {
exclude group: 'commons-logging', module: 'commons-logging'
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
testCompile appTestDependencies.mockito
testCompile 'org.apache.maven:maven-ant-tasks:2.1.3' // fixes issue on linux/mac
}
android.applicationVariants.all { variant ->
def appName
//Check if an applicationName property is supplied; if not use the name of the parent project.
if (project.hasProperty("applicationName")) {
appName = applicationName
} else {
appName = parent.name
}
if (variant.buildType.name != "debug" && variant.outputs.zipAlign) {
variant.outputs.each { output ->
def timestamp = new Date().format("yyyyMMdd-HHmm", TimeZone.getTimeZone("UTC"));
def newApkName
newApkName = "${appName}-${variant.versionName}-${timestamp}.apk"
output.outputFile = new File(output.outputFile.parent, newApkName)
}
}
}