Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Studio 混淆,多渠道打包,反編譯 使用

Android Studio 混淆,多渠道打包,反編譯 使用

編輯:關於Android編程

混淆

簡單配置

build.gradle的android節點下添加:

buildTypes {
        release {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
        }
    }

或者

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

這樣配置需要通過Build-Generate Signed Apk…進行對應的release或debug打包。proguard-rules.pro文件的配置稍候會給出。

帶簽名的配置

和簡單配置的區別是即使在debug版本下生成的包也是帶簽名的。

首先需要在app目錄下添加簽名文件,注意一定是要在app目錄下,如圖:
添加簽名文件

build.gradle配置:

buildTypes {
        debug {
            minifyEnabled false
            signingConfig signingConfigs.debug
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            proguardFiles 'proguard-rules.pro'
        }
        release {
            minifyEnabled true
            signingConfig signingConfigs.debug
//            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            proguardFiles 'proguard-rules.pro'
        }
    }
    signingConfigs {
        debug {
            storeFile file('newpro.keystore')//你的簽名文件
            storePassword "123456" //簽名密碼
            keyAlias "newpro" //Alias名稱
            keyPassword "123456" //Alias密碼
        }
    }

這樣生成的包就是帶有簽名文件的包。

混淆配置文件

現在來配置proguard-rules.pro文件:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-ignorewarnings
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep class android.** {*; }
-keep public class * extends android.app.Activity
-keep public class * extends android.view.View
-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 com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native ;
}

-keepclasseswithmembers class * {
    public (android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public (android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class * {
   public  (org.json.JSONObject);
}

-keepclassmembers class fqcn.of.javascript.interface.for.webview {
   public *;
}

#########################################################################################

#不混淆注解類型
# For using Eventbus @Subscribe annotation
-keepattributes *Annotation*


##---------------Begin: proguard configuration for glide  ----------
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
     **[] $VALUES;
     public *;
}
##---------------End: proguard configuration for glide  ----------


##---------------Begin: proguard configuration for xutils  ----------
-keepattributes Signature,*Annotation*
-keep public class org.xutils.** {
    public protected *;
}
-keep public interface org.xutils.** {
    public protected *;
}
-keepclassmembers class * extends org.xutils.** {
    public protected *;
}
-keepclassmembers @org.xutils.db.annotation.* class * {*;}
-keepclassmembers @org.xutils.http.annotation.* class * {*;}
-keepclassmembers class * {
    @org.xutils.view.annotation.Event ;
}
##---------------End: proguard configuration for xutils  ----------

##---------------Begin: proguard configuration for BQMM  ----------
-dontwarn com.melink.**
-dontwarn com.thirdparty.**
-keep class com.melink.** {*;}
-keep class com.thirdparty.** {*;}
##---------------End: proguard configuration for BQMM  ----------

##---------------Begin: proguard configuration for Umeng  ----------
-keep public class com.umeng.** { *;}
-dontwarn com.tencent.mm.**
-keep class com.tencent.mm.**{*;}
-dontwarn com.tencent.android.**
-keep class com.tencent.android.**{*;}
-keepclassmembers class * {
   public (org.json.JSONObject);
}
##---------------End: proguard configuration for Umeng  ----------

-dontwarn org.apache.http.**
-keep class org.apache.http.** { *; }
-keep class de.greenrobot.event.** {*;}

“#########################################################################################”上面的是基本配置,必須有的。之下的要根據你項目集成的jar或者第三方庫相應添加。

這裡有個技巧,混淆打包的時候難免出現錯誤,像下面截圖這種錯誤是很常見的。
混淆報錯1
混淆報錯2

看起來有好多的警告,其實就只涉及到org.apache.http這個類,我們只要不混淆這個類就可以了。
此時我們可以根據報錯提示來決定不混淆哪個類,逐個排除。比如針對截圖的情況,可以這樣配置,就ok了。

#按壓警告
-dontwarn org.apache.http.**
#保持類不被混淆
-keep class org.apache.http.** { *; }

如果你沒有混淆(minifyEnabled false),那就不需要考慮了。
需要說明一下,混淆完以後整個項目需要全面測試一下,尤其是第三方的東西,因為有的第三方的在混淆的是很不會報錯,有的類也只有在運行起來的時候才會發現沒有相關類。

多渠道打包

在清單文件application節點下配置:

 

build.gradle的android節點下添加:

productFlavors {

        baidu {}//百度
        anzhi {}//安智
        yingyongbao {}//騰訊應用寶
        qihu360 {}//360
        wandoujia {}//豌豆莢
        mumayi {}//木螞蟻
        appchina {}//應用匯
        leshi {}//樂視
        huawei {}//華為
        xiaomi {}//小米
        meizu {}//魅族
        oppo {}//oppo
        vivo {}//vivo
        pp {}//pp助手
        gfan {}//機鋒市場
        nduo {}//n多市場
        lenovo {}//樂商店
        eoe {}//優億市場
        gionee {}//金立
        coolpad {}//酷派
        myzte {}//中興

        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }

    }

顯然,兩者之間是通過UMENG_CHANNEL_VALUE建立聯系的,此時我們Build-Generate Signed Apk…,在打包的時候會發現多了一欄Flavors,列表項就是我們添加的打包渠道,選擇你需要的渠道包,點擊Finish,studio便會開始自動打包模式。

多渠道打包

打包完成後apk文件會自動命名:
打包完成

反編譯

有混淆就有反編譯,我們畢竟要查看一下混淆成果。我給大家提供了反編譯的工具下載:
點擊:反編譯工具下載

安裝產生這麼兩個東西,一個是產生jar文件的,一個是打開看混淆文件的。
反編譯工具

使用說明:
*首先將apk文件,將後綴改為zip,解壓,得到其中的classes.dex,它就是java文件編譯再通過dx工具打包而成的;
將classes.dex拖動到dex2jar.bat上,會彈出一個命令框,無需理會,等待命令框消失。
消失以後在classes.dex所在的目錄下會生成一個jar文件classes-dex2jar.jar
然後用jd_gui.exe直接File-Open File…打開即可。*

拖動classes.dex:
拖動classes.dex

正在生成jar文件,等待3~4秒:
正在生成jar文件

在和classes.dex同級目錄下生成jar文件:
生成jar文件

下面這兩個截圖分別是未混淆和混淆後的,效果很顯然:
未混淆的

混淆後的

謝謝閱覽!!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved