在android中设置proguard规则,它只能加密代码吗?

时间:2016-10-14 01:05:43

标签: java android proguard android-proguard

我的应用程序中使用了多个库,minifyEnabledtrue后,它无法生成APK。经过一些研究,我找到了规则并将其逐个添加到.pro文件中。

这是图书馆清单

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.squareup.picasso:picasso:2.3.2'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.daimajia.slider:library:1.1.5@aar'
compile 'org.apache.httpcomponents:httpmime:4.3.5'//Volley
compile 'org.apache.httpcomponents:httpcore:4.2.4'//Volley
compile 'com.mcxiaoke.volley:library:1.0.17'//Volley
compile 'com.github.bumptech.glide:glide:3.6.1'//Gradle
compile 'com.baoyz.swipemenulistview:library:1.3.0'//Swipe Menu li stview
compile 'org.lucasr.twowayview:twowayview:0.1.4' //horizontal listview
compile 'com.android.support:recyclerview-v7:+'

对于JAR,它是PayPalAndroidSDK-2.9.11.jar

简而言之,我想知道是不是可以逐个为库添加规则,因为有些库似乎没有提到如何为它们设置proguard?它可以加密而不是优化代码并删除一些有用的代码吗?

非常感谢。

3 个答案:

答案 0 :(得分:9)

  

我想知道是否有可能不逐一添加规则   库,因为有些库似乎没有提到如何设置   为他们做准备?

是的可能,不是为您在项目中使用的每个库逐个添加规则。请尝试在proguard-rules.pro文件中添加以下内容。

-keep class !com.example.myproject.** { *; }

这个想法只是在你的proguard-rules.pro中使用正则表达式。

但是如果你没有混淆你的代码,那么使用proguard是什么意思。您可能希望在混淆后保持项目中的某些类不变。你只需要像其他库一样保留它们。例如 -

// I want to keep the classes in the `Models` package to remain unchanged
-keep class com.example.myproject.Models.** { *; }
-keepclassmembers class com.example.myproject.Model.** { *; }

无论如何,逐个添加规则并不是很难,因为在混淆时你会有更多的控制权。这是我的proguard-rules.pro。你可以看看它。

-useuniqueclassmembernames
-allowaccessmodification
-keep class com.google.** { *; }
-keep class com.journeyapps.** { *; }
-keep class com.makeramen.** { *; }
-keep class com.github.** { *; }
-keep class org.apache.** { *; }
-keep class com.flipboard.** { *; }
-keep class com.android.** { *; }
-keep class com.mikepenz.** { *; }
-keep class junit.** { *; }
-keep class org.mockito.** { *; }
-keep class android.support.v7.widget.SearchView { *; }
-keep class com.example.myproject.Models.** { *; }
-keepclassmembers class com.example.myproject.Model.** { *; }

-keepattributes Signature
-keepattributes *Annotation*

-dontwarn com.google.**
-dontwarn org.apache.**
-dontwarn android.support.**
-dontwarn org.junit.**
-dontwarn org.mockito.**
-dontwarn com.makeramen.**

-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
    public static *** i(...);
    public static *** e(...);
}

答案 1 :(得分:3)

您可以不添加任何proguard规则,但如果应用程序的某些部分或其库使用反射,泛型,依赖注入或任何形式的软/间接引用,则应用程序将崩溃。因此,最好的选择是构建应用程序一次,测试所有应用程序,并检查是否有什么东西变成kaboom。如果是,请为每个库添加proguard引用。如果库没有任何推荐的配置,请从字典中的logcat(outputs / proguard)中检查受影响的类。

答案 2 :(得分:1)

如果要在不进行最小化的情况下进行模糊处理,可以使用-dontshrink选项。正如@Reaz Murshed在他的回答中提出的论点一样,值得花时间为每个库正确配置proguard。有时它可能会令人烦恼,但是在较小的APK和较低的方法数量下,shirnking可以带来切实的好处。