1. 程式人生 > >Android程式碼混淆

Android程式碼混淆

 程式碼混淆      1、這麼做有什麼意義?      我們開發的App,在第三方軟體的輔助下,往往幾分鐘就能反編譯出來,從來得到我們辛苦幾個月的原始碼成果。不做任何處理     的程式碼是極度不安全的,這就需要我們去做一些安全措施;最基礎的便是程式碼混淆。然而程式碼混淆並不能使程式絕對的安全,但 是     用來防止一些非專業的人足夠了。  2、混淆的作用範圍     我們對程式碼進行混淆的主要作用是對我們的程式碼加一層防護,使得外部人員無法得知我們的原始碼內容。所以,           我們混淆的物件設定在編寫的原始碼即可,至於第三方引入的內容,不用做處理。  3、混淆處理的命令
     1) 保持不混淆 -keep class 或 -keep public class xx.xx.類名,如             -keep public class * extends android.app.Activity       2)第三方jar包引用 -libraryjars libs/xx.jar,如 -libraryjars libs/volley.jar       3)忽略作用域下的警告 -dontwarn xx.xx.xx.類名,如 -dontwarn android.webkit.WebView       4)忽略所有警告 -ignorewarnings
      5)保持類不被混淆,並指明作用域,如 -keep class com.umai.taok.manager.ClientAPI {                 public *;             }       6)保持類物件域不被混淆,如 -keepclassmembers class com.umai.taok.manager.ClientAPI {                 public *;             } 4、混淆步驟       1) 對於android原生的類,不必做混淆處理              -keep public class * extends android.app.Fragment  
            -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.app.backup.BackupAgentHelper             -keep public class * extends android.preference.Preference             -keep public class * extends android.support.v4.**             -keep public class com.android.vending.licensing.ILicensingService       2) 對於第三方引用的jar包,需要宣告             -libraryjars libs/xUtils-2.6.14.jar             -libraryjars libs/volley.jar             -libraryjars libs/umeng-analytics-v5.5.3.jar             -libraryjars libs/umeng_social_sdk.jar             -libraryjars libs/sun.misc.BASE64Decoder.jar             -libraryjars libs/SocialSDK_WeiXin_1.jar             -libraryjars libs/SocialSDK_WeiXin_2.jar             -libraryjars libs/SocialSDK_Sina.jar             -libraryjars libs/SocialSDK_QQZone_1.jar             -libraryjars libs/SocialSDK_QQZone_2.jar             -libraryjars libs/SocialSDK_QQZone_3.jar             -libraryjars libs/jpush-sdk-release1.8.1.jar             -libraryjars libs/httpmime-4.1.1.jar             -libraryjars libs/core-3.0.0.jar             -libraryjars libs/Android_Location_V1.3.2.jar             -libraryjars libs/Android_2DMapApi_V2.4.1.jar             -libraryjars libs/AMap_3DMap_V2.4.1.jar       3) 第三方的jar包原始碼,不必做混淆處理 -keep public class com.umeng.socialize.* {*;}              -keep class com.facebook.**              -keep class com.amap.api.mapcore.**{*;}               -keep class com.amap.api.maps.**{*;}               -keep class com.autonavi.amap.mapcore.*{*;}                -keep class cn.jpush.** { *; } 4)WebView相關的混淆處理             -keepclassmembers class com.umai.taok.manager.JSBridge$AndroidAPI {                   public *;             }            -keepclassmembers class com.umai.taok.manager.ClientAPI {                  public *;             }             -keep class com.umai.taok.manager.JSBridge$AndroidAPI {                 public *;               }            -keep class com.umai.taok.manager.ClientAPI {                 public *;              }             -dontwarn bolts.**                -keepattributes *Annotation*             -keepattributes *JavascriptInterface*   說明備註: 1、混淆配置的檔案proguard-project.txt和project.properties。在project.properties中系統已經添加了混淆檔案的配置(#為註釋符)。 # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir,       user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt project.properties中紅色標註部分的註釋放開即可。在proguard-project.txt中,我們可以進行混淆的新增。 2、不同的框架都提供了不同的混淆新增部分,這部分引用我們可以從開發平臺copy到程式碼中。需要我們去新增的有三部分: (1) 第三方jar包的引用宣告  (2)WebVIew的相關配置(說明見_3)(3)根據錯誤資訊進行遺漏配置的補全以及警告隱藏 3、WebView的混淆需要進行配置,特別是webview與Js進行互動時,在混淆後有可能會失去效果。首先,我們需要先對進行Js互動的類進行保持處理,(由於我用JSBridge進行互動,所以需要兩個Js介面類,如下 -keepclassmembers 包名.類名 { // 該類為Js呼叫方法的承載類    public *; // 公共方法    *; // 所有方法 } -keepclassmembers class 包名.類名 {    public *; } 如果Js呼叫方法的承載類為內部類,則需要如下新增 -keepclassmembers 包名.類名1$類名2 { // 類1 = 承載類的外部類,類2 = 承載類    public *; // 公共方法    *; // 所有方法 } -keepclassmembers class 包名.類名1$類名2 {    public *; } 在進行上述保持不混淆處理後,還需要新增以下配置 -keepattributes *Annotation*   -keepattributes *JavascriptInterface*  4、如果程式碼中使用了Facebook的Fresco框架,為了保證不混淆,需要新增如下配置  -keep class com.facebook.** { *; }  -dontwarn com.facebook.** 5、新增之後打包會出現些許的Bug,詳見console. 我們可以根據Bug反饋進行進一步處理       1)如果出現找不到引用的情況,我們需要檢查該引用是否被混淆,如果是,則需要新增保持             -keep class com.aps.** { *; }         2) 如果出現不必要的警告的提示,我們需要對這些警告設定忽略提示             -dontwarn com.aps.** 上述內容皆非原創,為開發過程中對網路資料進行的總結...