android studio 程式碼混淆
原文連結 http://blog.csdn.net/ttccaaa/article/details/47687241 侵刪
關於程式碼混淆的作用,就不多解釋了,整個過程大致如下:
-
在app下的build.gradle檔案中新增如下程式碼(minifyEnabled 表示是否混淆,預設是false,這裡要記得設定成true):
其中proguard-android.txt檔案是本地sdk/tools/proguard資料夾下的預設檔案;prguard-rules.pro檔案就是用來編寫混淆程式碼的; -
接下來就是在prguard-rules.pro檔案中編寫混淆程式碼:
關於其中程式碼的理解,可以參考這篇文章:
編寫完混淆程式碼,混淆也就算完成了,接下來就是打包了,但是,混淆的時候可能會遇到各種問題,主要是混淆程式碼,因為涉及到有的類不需要混淆,混淆了就會報錯執行不了,所以在編寫混淆程式碼的時候一定要小心,其實一般注意這幾點就好了:
-
不需要匯入第三方類庫的程式碼,如上圖註釋的部分:-libraryjars libs/BaiduLBS_Android.jar等,按照網上說的,需要在混淆檔案中匯入第三方類庫,防止混淆時讀取包內容出錯,但是如果那樣做的話,會報如下錯誤:
是的,他說這個包被指定了兩次原因是,在build.gradle檔案中已經指定了第三方類庫,這裡再次指定,就會重複,所以,在此應該不需要導第三方包的程式碼
-
過濾掉第三方包,也就是不需要混淆第三方包,比如常見的 android-support-v4.jar:
-ignorewarnings
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
- 1
- 2
- 3
- 4
- 5
- 6
下面是一個專案中我過濾掉的第三方包:
-keep class org.apache.**{*;}//過濾commons-httpclient-3.1.jar
-keep class com.fasterxml.jackson.**{*;}//過濾jackson-core-2.1.4.jar等
-keep class com.lidroid.xutils.**{*;}//過濾xUtils-2.6.14.jar
--keep class com.baidu.** {*;}//過濾BaiduLBS_Android.jar
- 1
- 2
- 3
- 4
- 5
通常關於第三方包的混淆程式碼,一般在其github主頁上或者simple中會有提示,比如 xUtils的混淆就建議不要混淆Annotation,即:`-keep class * extends java.lang.annotation.Annotation{*;}
還有百度地圖,在其官方文件中有說明,需要如下混淆程式碼:
-dontwarn com.baidu.**
-keep class com.baidu.**{*;}
-keep class vi.com.**{*;}
- 1
- 2
- 3
- 接下來需要注意的就是一些固定格式的程式碼了,比如常見的Activity等不要混淆,Bean不要混淆等,看程式碼:
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
這裡的內容大致就是對一些Android元件保持原樣,不進行混淆
總結一下混淆
在prguard-rules.pro檔案中寫的,其實就是混淆規則,規定哪些東西不需要混淆。自己編寫的程式碼中大致就是一些重要的類需要混淆,而混淆的本質就是精簡類名,用簡單的a,b,c等單詞來代替之前寫的如DataUtil等易懂的類名。
所以,理解了這點,也就好理解這個混淆檔案該怎麼寫了,大致思路就是:不混淆第三方庫,不混淆系統元件,一般也可以不混淆Bean等模型類,因為這些對別人都是沒用的,畢竟都是開源的。。。
下面是整個混淆檔案的程式碼:
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\sdt1\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#-----------------混淆配置設定------------------------------------------------------------------------
-optimizationpasses 5 #指定程式碼壓縮級別
-dontusemixedcaseclassnames #混淆時不會產生形形色色的類名
-dontskipnonpubliclibraryclasses #指定不忽略非公共類庫
-dontpreverify #不預校驗,如果需要預校驗,是-dontoptimize
-ignorewarnings #遮蔽警告
-verbose #混淆時記錄日誌
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #優化
#-----------------匯入第三方包,但是在當前版本中使用會報 input jar file is specified twice 錯誤,所以註釋掉
#-libraryjars libs/android.support.v4.jar
#-libraryjars libs/BaiduLBS_Android.jar
#-libraryjars libs/commons-httpclient-3.1.jar
#-libraryjars libs/jackson-annotations-2.1.4.jar
#-libraryjars libs/jackson-core-2.1.4.jar
#-libraryjars libs/jackson-databind-2.1.4.jar
#-libraryjars libs/xUtils-2.6.14.jar
#-----------------不需要混淆第三方類庫------------------------------------------------------------------
-dontwarn android.support.v4.** #去掉警告
-keep class android.support.v4.** { *; } #過濾android.support.v4
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
-keep class org.apache.**{*;} #過濾commons-httpclient-3.1.jar
-keep class com.fasterxml.jackson.**{*;} #過濾jackson-core-2.1.4.jar等
-dontwarn com.lidroid.xutils.** #去掉警告
-keep class com.lidroid.xutils.**{*;} #過濾xUtils-2.6.14.jar
-keep class * extends java.lang.annotation.Annotation{*;} #這是xUtils文件中提到的過濾掉註解
-dontwarn com.baidu.** #去掉警告
-dontwarn com.baidu.mapapi.**
-keep class com.baidu.** {*;} #過濾BaiduLBS_Android.jar
-keep class vi.com.gdi.bgl.android.**{*;}
-keep class com.baidu.platform.**{*;}
-keep class com.baidu.location.**{*;}
-keep class com.baidu.vi.**{*;}
#-----------------不需要混淆系統元件等-------------------------------------------------------------------
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep class com.classtc.test.entity.**{*;} #過濾掉自己編寫的實體類
#----------------保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在------------------------------------
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}