web-dev-qa-db-fra.com

Android proguard, garder la classe interne

Mon programme Android possède un class A, qui a deux static inner class. Ils se trouvent être dépouillés de .dex après avoir appliqué proguard.

public class A{

  ...
  static class B{
    ...
  }

  static class C{
    ...
  }
}

J'ai mis les lignes suivantes dans proguard.flags, mais ne semble pas avoir de chance.

-keep class com.xxx.A
-keep class com.xxx.A$*

Un indice?

50
David Guan

Essayez d'ajouter InnerClasses aux attributs keep. par exemple:

-keepattributes Exceptions, InnerClasses, ...

Essayez également d'ajouter un corps à l'appel "keep" avec un astérisque, comme ceci:

-keep class com.xxx.A$* {
    *;
}
57
Alexander Lucas

C'est ce que je devais faire pour ma config

-keep class com.xxx.A { *; }
-keep class com.xxx.A$B { *; }
-keep class com.xxx.A$C { *; }
38
ajma

Cela a fait l'affaire pour moi

-keepattributes InnerClasses
 -keep class com.yourpackage.YourClass**
 -keepclassmembers class com.yourpackage.YourClass** {
    *;
 }

C'est peut-être un peu exagéré avec les caractères génériques, mais je voulais m'assurer de ne rien manquer. L'essentiel est que vous ayez besoin des attributs InnerClasses à garder sur la classe et des membres keepclass sur la classe.

9
GameSalutes

si vous ne voulez pas que toutes les classes internes et tous les membres d'un paquet soient obscurcis, vous pouvez ajouter des lignes dans proguard-rules.pro

    -keep class com.xxx.task.*$* {
        *;
    }
7
Mr235

Votre configuration semble correcte. Vous devez vérifier que vous n'avez pas mal orthographié les noms de classe. Si l'orthographe est incorrecte, ProGuard devrait imprimer une note à ce sujet. Vous pouvez également spécifier -printseeds seeds.txt, et voyez si vos classes sont répertoriées dans le fichier résultant. S'ils sont répertoriés, les classes figurent également dans le code traité.

Comme Alexander Lucas l'a mentionné, vous pouvez également conserver les champs et les méthodes de ces classes - cela dépend de vos besoins.

5
Eric Lafortune