Comment faire pour réduire code - 65k méthode limite en dex
J'ai une assez grande application Android qui s'appuie sur de nombreux projets de la bibliothèque. Le Android compilateur a une limitation de 65536 méthodes par .dex fichier et je suis dépassement de ce nombre.
Il y a deux chemins, vous pouvez choisir (à moins que je sache) quand vous frappez la méthode de limite.
1) de réduire vos code
2) générer plusieurs fichiers dex (consultez cet article de blog)
Je l'ai regardé en deux et essayé de savoir quelle était la cause de ma méthode de comptage d'aller si haut. Le Google Drive de l'API prend le plus gros morceau avec la Goyave dépendance à plus de 12 000. Total des libs pour le Lecteur API v2 atteindre plus de 23 000!
Ma question je suppose, qu'en pensez-vous dois-je faire? Dois-je enlever intégration à Google Drive comme une caractéristique de mon application? Est-il un moyen pour réduire l'API vers le bas (oui, j'utilise proguard)? Dois-je aller les multiples dex route (ce qui est plutôt douloureux, et notamment avec le tiers Api)?
- Je suis à l'amour de votre application. Avez-vous pensé à faire un téléchargement requis de tous les libs dans un pseudo
apk
forme? Personnellement, je voudrais voir en Voiture de l'intégration - Hmm, pouvez-vous expliquer pourquoi proguard n'est pas de résoudre le problème?
- Proguard aide mais pas de beaucoup, il me semble. Pour tester, j'ai créé le projet à partir de la guide de démarrage rapide. J'ai ajouté l'a suggéré config de proguard et le résultat m'a sauvé environ 2-3k méthodes. Qui aide, mais le projet est encore au-dessus de 22 000 qui est un gros morceau.
- Facebook a récemment documenté leur solution de contournement pour ce qui semble être une presque identique problème dans leur application Android. Peut être utile: facebook.com/notes/facebook-engineering/...
- De départ à la tête de la plusieurs dex route. J'ai réussi à créer un secondaire dex fichier de travailler avec Google Drive. Je me sens mal pour quelqu'un qui a besoin de goyave comme une dépendance. 😛 C'est toujours un assez gros problème pour moi si
- Salut, je rencontre des problèmes similaires que vous. Cependant, je suis bloqué lors de l'éclipse de fourmi de transition. Avez-vous l'esprit de prendre un coup d'oeil? stackoverflow.com/questions/18629021/...
- si vous utilisez actionbarsherlock, passer à ACtionBarAppCompat.
- Quelle est la version de goyave utilisez-vous maintenant?
- comment comptez-vous les méthodes?
- gist.github.com/JakeWharton/6002797 cat $dexfile | head -c 92 | tail-c 4 | hexdump-e '1/4 "%d\n"'
- Quelques notes supplémentaires ici: stackoverflow.com/questions/21490382 (y compris un lien vers un utilitaire qui liste la méthode des références dans un APK). Remarque la limite de 64 ko est pas liée à l'Facebook problème lié à quelques observations.
- Voici un script que j'ai écrit pour les méthodes de comptage dans un dossier jar gist.github.com/toms972/c83504df2da1176a248a
- Juste pour tout "les néophytes" qui sont nés dans le Mac OS X à l'époque. Cette 64K dex limite absolument me rappelle de la fin de Mac OS 8/9 ère: CodeWarrior de 64 ko TOC limite: compgroups.net/comp.mac.codewarrior/toc-size-to-big-how-to-fix/... Non seulement des variables globales, mais des fonctions virtuelles dans les classes et d'autres choses augmentation de la table des matières de la taille de trop, donc si vous avez tout simplement eu un assez grand exécutable, vous avez été vissé. Une décennie après que je rencontre une limite de 64 ko de nouveau. L'ART est de remplacer Dalvik, j'espère ne pas avoir de limite.
- L'ART ne change pas la limite.
- Nooon! BTW, pas pour tatillonne, mais 65536 est de 64 ko, pas 65K. Bien que même Google se réfère à 65K developer.android.com/tools/building/multidex.html
- Nous avons écrit un plugin Gradle qui vous donne la méthode de comptage après chaque génération @Bri6ko
- 65K se réfère à 65 000
- Il est de 64 ko, pas 65k. 65535.
Vous devez vous connecter pour publier un commentaire.
On dirait que Google a enfin la mise en œuvre d'une solution de contournement/fix pour dépassement de la 65K méthode limite de dex fichiers.
Voir: La création d'Applications avec Plus de 65K Méthodes
Vous devriez toujours éviter de heurter la 65K méthode limite en utilisant activement proguard et l'examen de vos dépendances.
vous pouvez utiliser le multidex bibliothèque de prise en charge pour que, afin de permettre À multidex
1) l'inclure dans les dépendances:
2) l'Activer dans votre application:
3) si vous avez un application classe de votre application, puis Remplacer le attachBaseContext méthode comme ceci:
4) si vous ne pas ont un application classe pour votre application, puis de l'enregistrer android.de soutien.multidex.MultiDexApplication que votre application dans votre fichier manifeste. comme ceci:
et il devrait fonctionner très bien!
Play Services
6.5+ aide à:http://android-developers.blogspot.com/2014/12/google-play-services-and-dex-method.html
...
C'est une bonne nouvelle, pour un jeu simple, par exemple, vous aurez probablement besoin de l'
base
,games
et peut-êtredrive
.Dans les versions de Google Play services avant 6.5, vous avez eu à compiler l'ensemble des Api dans votre application. Dans certains cas, ce faisant, il est plus difficile de garder le nombre de méthodes dans votre application (y compris le cadre d'Api, de la bibliothèque de méthodes, et votre propre code) sous la limite de 65 536.
À partir de la version 6.5, vous pouvez au lieu de compiler de manière sélective Google Play service Api dans votre application. Par exemple, pour inclure uniquement les Google Fit et Android Wear Api, remplacez la ligne suivante dans votre construction.gradle fichier:
avec ces lignes:
pour plus d'information, vous pouvez cliquer sur ici
Utilisation proguard pour alléger vos apk en tant que méthodes qui sont inutilisés ne seront pas dans votre version finale. Double vérifier que vous avez les éléments suivants dans votre proguard fichier de configuration à utiliser proguard avec goyave (toutes mes excuses si vous avez déjà présent, il n'est pas connu au moment de la rédaction) :
En outre, si vous utilisez ActionbarSherlock, de passer à la v7 appcompat bibliothèque de prise en charge permettra également de réduire votre méthode de comptage par beaucoup (basée sur l'expérience personnelle). Instructions :
Warning: butterknife.internal.ButterKnifeProcessor: can't find superclass or interface javax.annotation.processing.AbstractProcessor
lors de l'exécution de./gradlew :myapp:proguardDevDebug
Vous pouvez utiliser Jar Jar Liens pour réduire les énormes bibliothèques externes comme Google Play Services (16K méthodes!)
Dans votre cas, vous venez de ripper tout à partir de Google Play Services jar sauf
common
internal
etdrive
sous-packages.Pour Eclipse n'est pas les utilisateurs à l'aide de Gradle, il existe des outils qui permet de briser les Google Play Services de pot et de le reconstruire avec uniquement les pièces que vous souhaitez.
- Je utiliser strip_play_services.sh par dextorer.
Il peut être difficile de savoir exactement quels services afin d'inclure car il y a des dépendances internes, mais vous pouvez commencer petit et ajouter à la configuration si il s'avère que des choses nécessaires sont manquants.
Je pense que dans le long terme, la rupture de votre application dans de multiples dex serait la meilleure façon.
Multi-dex soutien est
va êtrela solution officielle pour cette question. Voir ma réponse ici pour plus de détails.Si ne pas utiliser multidex qui faire construire processus très lent.
Vous pouvez effectuer les opérations suivantes.
Comme yahska mentionné utilisation de google play service de la bibliothèque.
Pour la plupart des cas, seulement ce qui est nécessaire.
Voici tous les paquets disponibles De manière sélective la compilation des Api dans votre exécutable
Si ce sera pas suffisant, vous pouvez utiliser gradle script. Placer ce code dans le fichier 'strip_play_services.gradle'
}
Ensuite appliquer ce script dans votre construction.gradle, à l'instar de ce
Si vous utilisez Google Play Services, vous savez qu'il ajoute 20k+ méthodes. Comme déjà mentionné, Android Studio est doté de l'option modulaire pour l'inclusion de certains services, mais les utilisateurs coincé avec Eclipse prendre la modularisation dans leurs propres mains 🙁
Heureusement il y a un script shell qui rend la tâche assez facile. Il suffit d'extraire les google play services jar répertoire, modifier le fourni .conf fichier en tant que de besoin et d'exécuter le script shell.
Un exemple de son utilisation est ici.
Tout comme il l'a dit, je remplace
compile 'com.google.android.gms:play-services:9.0.0'
juste avec les bibliothèques que j'ai besoin et cela a fonctionné.