web-dev-qa-db-fra.com

Android prend en charge la mise en œuvre de la bibliothèque multidex

J'ai atteint la limite de magic dex car mon application utilise beaucoup de pots (API de lecteur, greendao, texte en pdf, support ..).

Ma solution actuelle était que j'ai littéralement créé un deuxième apk juste pour Google Drive que j'ai appelé depuis l'apk principal. Mais maintenant, j'ai découvert que Android prend enfin cela en charge avec cette bibliothèque. Mon problème est juste que je ne sais pas comment l'implémenter (de préférence sans gradle). Je ne trouve aucun bon tutoriels pour cela.

Okey je perds la tête en essayant de mettre en œuvre cela ... J'ai trouvé ceci

Et j'ai ajouté:

 Android:name="Android.support.multidex.MultiDexApplication"

Vers mon fichier manifeste et

protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
}

À mon activité principale.Java

Plugin Gradle également installé pour Eclipse, exporté Gradle pour obtenir le fichier build.gradle que j'ai changé en:

apply plugin: 'Android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':Android-support-v7-appcompat')
    compile project(':Sync')
    compile project(':gdrive:google-play-services_lib')
}


Android {
    compileSdkVersion 14
    buildToolsVersion "21.1.1"


    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src-gen','src']
            resources.srcDirs = ['src-gen','src']
            aidl.srcDirs = ['src-gen','src']
            renderscript.srcDirs = ['src-gen','src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/Java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/Java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    dexOptions {
      preDexLibraries = false
   }
}

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

Mais l'erreur est toujours la même :(

13
Tadej Vengust

Le blog était l'ancienne solution.

Avec Android Studio 0.9.2 & Gradle Plugin 0.14.1, il vous suffit de:

  1. Ajoutez à AndroidManifest.xml:

.

Android:name="Android.support.multidex.MultiDexApplication" 

ou

Ajouter

MultiDex.install(this);

dans la méthode attachBaseContext de votre application personnalisée

ou votre application personnalisée étendre MultiDexApplication

  1. ajouter multiDexEnabled = true dans votre build.gradle

.

Android {
    defaultConfig {
        ...
        multiDexEnabled = true
    }
}

Terminé.

Désolé pour mon mauvais anglais

Ressources associées:

http://developer.Android.com/tools/building/multidex.html

https://plus.google.com/+XavierDucrohet/posts/1FnzwdcBnyC

19
darktiny

Il y a quelques choses que vous devez faire,

1- Dans votre gradle, vous devez spécifier multidex et ajouter la bibliothèque de support:

Android {
    defaultConfig {
        ...
        multiDexEnabled true
        ...
    }
}

dependencies {
  ...
  compile 'com.Android.support:multidex:1.0.0'
  ...
}

2- Dans votre manifeste, vous devez définir votre application sur une application multidex:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.package.name">
    <application
        ...
        Android:name="com.package.name.my_application">
        ...
    </application>
</manifest>

3.1- Dans votre classe d'application, vous devez soit étendre MultiDexApplication:

public class my_application extends MultiDexApplication
{
    ...
}

3.2- Ou remplacer la méthode attachBaseContext():

public class my_application extends Application
{
    protected void attachBaseContext(Context base)
    {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

Limitations de la bibliothèque de support multidex

La bibliothèque de support multidex a certaines limitations connues que vous devez connaître et tester lorsque vous l'incorporez dans la configuration de construction de votre application:

  • L'installation de fichiers .dex lors du démarrage sur la partition de données d'un périphérique est complexe et peut entraîner des erreurs d'application ne répondant pas (ANR) si les fichiers dex secondaires sont volumineux. Dans ce cas, vous devez appliquer des techniques de réduction de code avec ProGuard pour réduire la taille des fichiers dex et supprimer les parties de code inutilisées.
  • Les applications qui utilisent multidex peuvent ne pas démarrer sur des appareils qui exécutent des versions de la plateforme antérieures à Android 4.0 (API niveau 14) en raison d'un bogue Dalvik linearAlloc (problème 22586). Si vous ciblez des niveaux d'API antérieurs à 14, assurez-vous d'effectuer des tests avec ces versions de la plate-forme car votre application peut avoir des problèmes au démarrage ou lorsque des groupes particuliers de classes sont chargés. La réduction du code peut réduire, voire éliminer, ces problèmes potentiels.
  • Les applications utilisant une configuration multidex qui effectuent des demandes d'allocation de mémoire très volumineuses peuvent se bloquer pendant l'exécution en raison d'une limite Dalvik linearAlloc (problème 78035). La limite d'allocation a été augmentée dans Android 4.0 (niveau 14 de l'API), mais les applications peuvent toujours rencontrer cette limite sur les versions Android avant Android 5.0 (niveau API 21).
  • Il existe des exigences complexes concernant les classes nécessaires dans le fichier dex principal lors de l'exécution dans le runtime Dalvik. Les mises à jour des outils de construction Android gèrent les exigences Android, mais il est possible que d'autres bibliothèques incluses aient des exigences de dépendance supplémentaires, notamment l'utilisation de l'introspection ou de l'invocation des méthodes Java à partir du code natif. Certaines bibliothèques peuvent ne pas être utilisables tant que les outils de génération multidex ne sont pas mis à jour pour vous permettre de spécifier des classes qui doivent être incluses dans le fichier dex principal.

ressources: http://developer.Android.com/tools/building/multidex.html

16
Nicolas Tyler

Selon les documents à https://developer.Android.com/studio/build/multidex.html#avoid

Si vous êtes minSdkVersion a 21 ans et plus, tout ce que vous devez faire est

Android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

si vous avez minSdkVersion a 20 ans ou moins, vous devez utiliser la bibliothèque de support

Android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.Android.support:multidex:1.0.1'
}

Avec

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.myapp">
    <application
            Android:name="Android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>
2
Sanket Berde