J'ai une application Android assez volumineuse qui repose sur de nombreux projets de bibliothèques. Le compilateur Android a une limitation de 65536 méthodes par fichier .dex et je dépasse ce nombre.
Il y a essentiellement deux chemins que vous pouvez choisir (du moins que je connaisse) lorsque vous atteignez la limite de méthode.
1) Réduisez votre code
2) Créez plusieurs fichiers dex ( voir cet article de blog )
J'ai regardé dans les deux et essayé de découvrir ce qui faisait monter mon nombre de méthodes si haut. L'API Google Drive prend la plus grande part avec la dépendance Guava à plus de 12000. Le nombre total de bibliothèques pour Drive API v2 atteint plus de 23 000!
Ma question est, je suppose, que pensez-vous que je devrais faire? Dois-je supprimer l'intégration de Google Drive en tant que fonctionnalité de mon application? Existe-t-il un moyen de réduire l'API (oui, j'utilise proguard)? Dois-je emprunter la route dex multiple (qui semble plutôt pénible, en particulier avec des API tierces)?
la source
apk
forme pseudo ?Réponses:
Il semble que Google ait enfin mis en œuvre une solution de contournement / correctif pour dépasser la limite de méthode de 65K des fichiers dex.
Voir: Créer des applications avec plus de 65 000 méthodes
Vous devriez toujours éviter d'atteindre la limite de la méthode 65K en utilisant activement proguard et en examinant vos dépendances.
la source
vous pouvez utiliser la bibliothèque de prise en charge multidex pour cela, pour activer le multidex
1) l' inclure dans les dépendances:
2) Activez-le dans votre application:
3) si vous avez une classe d' application pour votre application, remplacez la méthode attachBaseContext comme ceci:
4) si vous n'avez une demande de classe pour votre application puis enregistrez android.support.multidex.MultiDexApplication que votre application dans votre fichier manifeste. comme ça:
et cela devrait bien fonctionner!
la source
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 n'avez probablement besoin que du
base
,games
et peut-êtredrive
.la source
Dans les versions des services Google Play antérieures à la version 6.5, vous deviez compiler l'intégralité du package d'API dans votre application. Dans certains cas, cela rendait plus difficile de maintenir le nombre de méthodes dans votre application (y compris les API de framework, les méthodes de bibliothèque et votre propre code) sous la limite de 65 536.
À partir de la version 6.5, vous pouvez à la place compiler de manière sélective les API du service Google Play dans votre application. Par exemple, pour inclure uniquement les API Google Fit et Android Wear, remplacez la ligne suivante dans votre fichier build.gradle:
avec ces lignes:
pour plus de références, vous pouvez cliquer ici
la source
Utilisez proguard pour alléger votre apk car les méthodes inutilisées ne seront pas dans votre version finale. Vérifiez que vous avez ce qui suit dans votre fichier de configuration proguard pour utiliser proguard avec la goyave (mes excuses si vous l'avez déjà, cela n'était pas connu au moment de la rédaction):
En outre, si vous utilisez ActionbarSherlock, le passage à la bibliothèque de support v7 appcompat réduira également considérablement le nombre de vos méthodes (en fonction de votre expérience personnelle). Les instructions se trouvent:
la source
Warning: butterknife.internal.ButterKnifeProcessor: can't find superclass or interface javax.annotation.processing.AbstractProcessor
en courant./gradlew :myapp:proguardDevDebug
Vous pouvez utiliser Jar Jar Links pour réduire d'énormes bibliothèques externes comme les services Google Play (méthodes 16K!)
Dans votre cas , vous tout simplement rip Google Play jar les services , sauf
common
internal
etdrive
sous-packages.la source
Pour les utilisateurs d'Eclipse n'utilisant pas Gradle, il existe des outils qui décomposent le fichier des services Google Play et le reconstruisent avec uniquement les pièces que vous souhaitez.
J'utilise strip_play_services.sh par dextorer .
Il peut être difficile de savoir exactement quels services inclure car il existe des dépendances internes, mais vous pouvez commencer petit et ajouter à la configuration s'il s'avère que les éléments nécessaires manquent.
la source
Je pense qu'à long terme, casser votre application en plusieurs dex serait le meilleur moyen.
la source
Le support multi-dex
serala solution officielle à ce problème. Voir ma réponse ici pour les détails.la source
Sinon, utiliser multidex, ce qui rend le processus de construction très lent. Vous pouvez faire ce qui suit. Comme yahska l'a mentionné, utilisez une bibliothèque de services google play spécifique. Dans la plupart des cas, seul cela est nécessaire.
Voici tous les packages disponibles Compilation sélective des API dans votre exécutable
Si cela ne suffit pas, vous pouvez utiliser le script gradle. Mettez ce code dans le fichier 'strip_play_services.gradle'
}
Ensuite, appliquez ce script dans votre build.gradle, comme ceci
la source
Si vous utilisez les services Google Play, vous savez peut-être qu'il ajoute plus de 20 000 méthodes. Comme déjà mentionné, Android Studio a la possibilité d'inclure modulairement des services spécifiques, mais les utilisateurs bloqués avec Eclipse doivent prendre la modularisation en main :(
Heureusement, il existe un script shell qui rend le travail assez facile. Extrayez simplement le répertoire jar des services google play, modifiez le fichier .conf fourni si nécessaire et exécutez le script shell.
Un exemple de son utilisation est ici .
la source
Comme il l'a dit, je remplace
compile 'com.google.android.gms:play-services:9.0.0'
juste par les bibliothèques dont j'avais besoin et cela a fonctionné.la source