2017-10-20 10 views
0

J'ai une erreur après le passage de Dagger 2.5 à 2.12 lors de l'utilisation de proguard sur ma version release.Dagger 2.12 et proguard issue

DaggerGraph.java:662: erreur: impossible de trouver le symbole ReportingService_MembersInjector.injectA (instance, provideDataLayerProvider.get());

J'ai une bibliothèque Android qui est compilée et obscurcie et une application Android qui comprend cette bibliothèque.

Le graphique est généré à l'aide de composants des deux modules.

Des indices?

Merci

PS. Avec Dagger 2.5, cela fonctionne sans problème. PPS. La version de débogage sans proguard fonctionne également bien avec Dagger 2.12

+0

Utilisez-vous les paramètres affichés sur https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-dagger.pro? –

+0

Oui, je les ai comme pour Dagger 2.5 fonctionne bien. – Sebastian

Répondre

1

Réponse spéculative: Cela peut avoir moins à voir avec Proguard et plus avec optimizations made specifically in Dagger 2.12. Parce que vous exécutez Dagger sur la bibliothèque que vous avez créée, puis en consommant cette bibliothèque à partir d'une application Dagger différente, Dagger a deux chances de s'exécuter: d'abord pour la bibliothèque, qui crée votre ReportingService_MembersInjector, puis une seconde qui consomme probablement ce même ReportingService. Entre ces étapes, Proguard peut effectivement faire ce qu'il veut pour les classes que vous n'avez pas marquées avec -keep et les commutateurs connexes. Mon intuition est que Dagger devait conserver votre méthode injectA à partir de la version 2.5, mais les optimisations 2.12 n'ont plus besoin de garder cette méthode, donc Proguard l'élimine. Dans votre application Android qui consomme la bibliothèque, Dagger détecte une classe nommée ReportingService_MembersInjector. Elle ne crée donc pas d'autre copie et suppose à tort qu'elle contient toutes les méthodes qu'elle génère. Je pense que la racine du problème est que votre bibliothèque expose une classe @Inject -annotated que votre graphique Dagger externe (app) est évidemment consommer directement, puis vous gardez également les classes Factory et MembersInjector que Dagger fournit à côté de il. Même si vous utilisiez correctement les classes MembersInjector, Provider et Factory générées, vous pourriez rencontrer des différences de version entre la bibliothèque obfusquée interne et la copie externe de Dagger qui provoquerait différents types de problèmes. Au lieu de cela, fournissez une usine ou une autre manière officielle de créer votre classe de bibliothèque depuis l'extérieur de la bibliothèque, donc il n'y a aucune raison pour que les deux passages de Dagger puissent interférer les uns avec les autres.

+0

Merci! Vous avez pointé dans la bonne direction Il semble que les membres privés du paquet ont été obscurcis dans la bibliothèque et lorsque Graph a été généré utilisait ces noms et essayait de trouver les méthodes d'injection dans la bibliothèque. Je suppose que avant 2.12 (2.11 fonctionnait également) les méthodes d'injection ont été générées plus tôt dans le flux et n'ont pas été affectées par l'obfuscation des membres. – Sebastian