2015-10-15 39 views
10

kullanarak tüm sınıflarımı tek bir pakette nasıl yerleştireceğim SDK geliştiriyorum, ortamım SDK kütüphanesi ve onu kullanan bir test projesi var.Android Proguard

Kütüphane kodlarımı kütüphane kullanıcılarımdan korumak istiyorum ve onu gizlemem gerekiyor, ama sadece.

Yani benim kütüphane Modülünde Android Studio, proguard-rules.pro dosyasında sonraki senaryoyu ekledi:

-dontpreverify 
-optimizations !code/simplification/arithmetic 

-keep class !com.example.**{ *; } 
-keep public class com.example.sdk.Example{*;} 
-keep public class com.example.sdk.IExampleCallback{*;} 
-keep public class com.example.sdk.ui.ExampleActivity 

-dontwarn android.util.Log 

-repackageclasses 'com.example.security' 
-allowaccessmodification 

sınıflar Karartılmış olsun ama onların paketi değiştirilmez. Ben allowaccessmodification eklemek için Eric Lafortune (Proguard yazarın) öneriyi nadatıyorum, ama yardımcı olmadı. Ayrıca flattenpackagehierarchy kullanmayı deneyin, ancak hiçbir etkisi yoktu.

Tüm sınıflarımın tek bir pakete nasıl yerleştirileceğini bana yardım edin.

cevap

7

bunu çözüldü: bu satırları ekledikten sonra o iş yaptı

-useuniqueclassmembernames 
-keeppackagenames doNotKeepAThing 

Bu benim tam script

-optimizationpasses 30 
-mergeinterfacesaggressively 
-dontpreverify 
-optimizations !code/simplification/arithmetic 

-repackageclasses 'com.example' 
-allowaccessmodification 
-useuniqueclassmembernames 
-keeppackagenames doNotKeepAThing 

-keep class !com.example.**{ *; } 
-keep public class com.sdk.example{ 
    *; 
} 
-keep public class com.sdk.IExampleCallback{ 
    *; 
} 
-keepclasseswithmembernames public class com.sdk.ui.activity.ExampleActivity{ 
    public <methods>; 
    protected <methods>; 
} 
-keepclasseswithmembernames public class com.example.sdk.ExampleReciever{ 
    public <methods>; 
} 

-assumenosideeffects class android.util.Log { 
    public static boolean isLoggable(java.lang.String, int); 
    public static int v(...); 
    public static int i(...); 
    public static int w(...); 
    public static int d(...); 
    public static int e(...); 
}