3 votes

Impossible de réduire la taille que Realm ajoute à l'application

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)
        }
    }
}

1voto

Chad Schultz Points 1930

Le problème était apparemment double :

  1. L'information sur la répartition des APK n'incluait pas les constructions pour les appareils Nexus. Realm a mis à jour sa documentation, ce problème est donc résolu.
  2. Mon fichier Gradle avait une section ajoutée pour renommer les fichiers APK.

Maintenant la division de l'APK fonctionne, ce qui rend l'APK d'une taille gérable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X