proguard-rules 常用第三方庫的混淆配置
阿新 • • 發佈:2019-02-19
轉載來源http://blog.csdn.net/yuhanghate/article/details/51656804
Android 工程中有時候需要混淆,減少包大小及增加反編譯難度。
AS中建立工程時預設建立了proguard-android.txt檔案,自己如果需要增加一些第三方庫需要自己在proguard-rules.txt檔案中配置混淆檔案。
ProGuard簡介
JAVA中預設使用ProGuard進行混淆。 ProGuard能夠對Java類中的程式碼進行壓縮(Shrink),優化(Optimize),混淆(Obfuscate),預檢(Preveirfy)。1. 壓縮(Shrink):在壓縮處理這一步中,用於檢測和刪除沒有使用的類,欄位,方法和屬性。
2. 優化(Optimize):在優化處理這一步中,對位元組碼進行優化,並且移除無用指令。
3. 混淆(Obfuscate):在混淆處理這一步中,使用a,b,c等無意義的名稱,對類,欄位和方法進行重新命名。
4. 預檢(Preveirfy):在預檢這一步中,主要是在Java平臺上對處理後的程式碼進行預檢。
Proguard-android使用
在Gradle.builde檔案中指定混淆檔案- buildTypes {
- release {
- minifyEnabled true
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
如果需gradle.builde檔案的基本配置,請點選這裡
第三方庫及基本混淆配置
Glide配置:google官方出的圖片載入庫,流暢度目前最高
-
-keep public
- -keep publicenum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
- **[] $VALUES;
- public *;
- }
-
</pre><h5><span style="font-family:microsoft yahei; color:#362e2b">Retrofit 2.0配置:基於Resetful api的網路庫,基於支援NIO的Okhttp。效能很高並支援Rxjava</span></h5></div><div><span style=
- -keep class retrofit2.** { *; }
- -keepattributes Signature
- -keepattributes Exceptions
stetho配置:Facebook出的黑科技。使用Okhttp框架支援Chrome顯示app日誌及資料庫等資料
- -keep class com.facebook.stetho.** { *; }
- -dontwarn org.mozilla.javascript.**
- -dontwarn org.mozilla.classfile.**
- -keep class org.mozilla.javascript.** { *; }
Gson配置:Json轉POJO。官方出品的Json經典庫
- -keep publicclass com.google.gson.**
- -keep publicclass com.google.gson.** {publicprivateprotected *;}
- -keep class sun.misc.Unsafe { *; }
- -keepattributes Signature
- -keepattributes *Annotation*
butterknife配置:大神JakeWharton出的View註解庫。簡單好用效能極高,因為沒有使用反射
- -keepclasseswithmembernames class * {
- @butterknife.* <fields>;
- }
- -keepclasseswithmembernames class * {
- @butterknife.* <methods>;
- }
View配置:系統自帶和google支援庫
- -dontwarn android.support.**
- -dontwarn com.google.android.maps.**
- -dontwarn com.slidingmenu.lib.app.SlidingMapActivity
- -keep class android.support.** { *; }
- -keep class com.actionbarsherlock.** { *; }
- -keep interface com.actionbarsherlock.** { *; }
- -keep class com.slidingmenu.** { *; }
- -keep interface com.slidingmenu.** { *; }
序列化配置:Serializable和Parcelable
- -keepclassmembers class * implements java.io.Serializable {
- staticfinallong serialVersionUID;
- privatestaticfinal java.io.ObjectStreamField[] serialPersistentFields;
- privatevoid writeObject(java.io.ObjectOutputStream);
- privatevoid readObject(java.io.ObjectInputStream);
- java.lang.Object writeReplace();
- java.lang.Object readResolve();
- }
- -keep publicclass * implements java.io.Serializable {*;}
- -keepclassmembers class * implements android.os.Parcelable {
- public <fields>;
- private <fields>;
- }
- -keep class * implements android.os.Parcelable {
- publicstaticfinal android.os.Parcelable$Creator *;
- }
java8 retrolambda 配置:支援Java8的部分新特性。當然如果使用google自帶的java8也可以,但不支援apt。詳細說明請點選這裡
- -dontwarn java.lang.invoke.*
新浪微博:很草蛋,沒有官方給的混淆。自己上
- -keep class com.sina.weibo.sdk.* { *; }
- -keep class android.support.v4.* { *; }
- -keep class com.tencent.* { *; }
- -keep class com.baidu.* { *; }
- -keep class lombok.ast.ecj.* { *; }
- -dontwarn android.support.v4.**
- -dontwarn com.tencent.**s
- -dontwarn com.baidu.**
Okio:基於NIO的流。大公司出品,不解釋
- -dontwarn com.squareup.**
- -dontwarn okio.**
- -keep publicclass org.codehaus.* { *; }
- -keep publicclass java.nio.* { *; }
Ormlite配置:資料庫。其實不想用這個,接手的時候用這個。有空換高效能的GreenDao2庫,畢竟google在接手了穩定性及支援力度第靠譜
- -keepattributes *DatabaseField*
- -keepattributes *DatabaseTable*
- -keepattributes *SerializedName*
- -keep class com.j256.**
- -keepclassmembers class com.j256.** { *; }
- -keep enum com.j256.**
- -keepclassmembers enum com.j256.** { *; }
- -keep interface com.j256.**
- -keepclassmembers interface com.j256.** { *; }
Rxjava:很好用的庫。目前國內很多專案都開始用這個了。個人推薦,贊
- -dontwarn sun.misc.**
- -keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
- long producerIndex;
- long consumerIndex;
- }
- -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
- rx.internal.util.atomic.LinkedQueueNode producerNode;
- }
- -keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
- rx.internal.util.atomic.LinkedQueueNode consumerNode;
- }
WebView配置
- -keepclassmembers class fqcn.of.javascript.interface.for.webview {
- public *;
- }
- -keepclassmembers class * extends android.webkit.webViewClient {
- publicvoid *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
- publicboolean *(android.webkit.WebView, java.lang.String);
- }
- -keepclassmembers class * extends android.webkit.webViewClient {
- publicvoid *(android.webkit.webView, jav.lang.String);
- }
自己專案配置:使用Gson時需要配置Gson的解析物件及變數都不混淆。不然Gson會找不到變數。
注意:替換成自己工程下指定目錄即可。我使用的是自己工程下- 包名:net.shopnc.shop
指定目錄下的所有檔案:net.shopnc.shop.http.params.**
- -keep publicclass net.shopnc.shop.http.params.** {publicprivateprotected *;}
- -keep publicclass net.shopnc.shop.http.result.** {publicprivateprotected *;}
如果對ProGuard不太瞭解,可以檢視這篇文章。http://blog.csdn.net/ljd2038/article/details/51308768#reply