1. 程式人生 > >android studio 程式碼混淆

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);
}