混淆配置

2018-02-24 16:12 更新

ProGuard?是一個在Android項目中廣泛使用的壓縮和混淆打包的源碼的工具。

你是否使用ProGuard取決你項目的配置,當(dāng)你構(gòu)建一個release版本的apk時,通常你應(yīng)該配置gradle文件。

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

為了決定哪些代碼應(yīng)該被保留,哪些代碼應(yīng)該被混淆,你不得不指定一個或多個實體類在你的代碼中。 這些實體應(yīng)該是指定的類包含main方法,applets,midlets,activities,等等。 Android framework 使用一個默認(rèn)的配置文件,可以在SDK_HOME/tools/proguard/proguard-android.txt?目錄下找到。自定義的工程指定的 project-specific 混淆規(guī)則,如在my-project/app/proguard-rules.pro中定義, 會被添加到默認(rèn)的配置中。

關(guān)于 ProGuard 一個普遍的問題,是看應(yīng)用程序是否崩潰并報ClassNotFoundException?或者?NoSuchFieldException?或類似的異常, 即使編譯是沒有警告并運行成功。 這意味著以下兩種可能:

  1. ProGuard 已經(jīng)移除了類,枚舉,方法,成員變量或注解,考慮是否是必要的。
  2. ProGuard 混淆了類,枚舉,成員變量的名稱,但是這些名字又被拿原始名稱使用了,比如通過Java的反射。

檢查app/build/outputs/proguard/release/usage.txt文件看有問題的對象是否被移除了。 檢查app/build/outputs/proguard/release/mapping.txt?文件看有問題的對象是否被混淆了。

In order to prevent ProGuard from?stripping away?needed classes or class members, add a?keep?options to your proguard config: 以防 ProGuard?剝離?需要的類和類成員,添加一個?keep選項在你的 proguard 配置文件中:

-keep class com.futurice.project.MyClass { *; }

防止 ProGuard?混淆?一些類和成員,添加?keepnames:

-keepnames class com.futurice.project.MyClass { *; }

查看this template's ProGuard config?中的一些例子。 更多例子請參考Proguard。

在構(gòu)建項目之初,發(fā)布一個版本?來檢查ProGuard規(guī)則是否正確的保持了重要的部分。 同時無論何時你添加了新的類庫,做一個發(fā)布版本,同時apk在設(shè)備上跑起來測試一下。 不要等到你的app要發(fā)布 "1.0"版本了才做版本發(fā)布,那時候你可能會碰到好多意想不到的異常,需要一些時間去修復(fù)他們。

Tips每次發(fā)布新版本都要寫?mapping.txt。每發(fā)布一個版本,如果用戶遇到一個bug,同時提交了一個混淆過的堆棧跟蹤。 通過保留mapping.txt文件,來確定你可以調(diào)試的問題。

DexGuard?若果你需要核心工具來優(yōu)化,和專門混淆的發(fā)布代碼,考慮使用DexGuard, 一個商業(yè)軟件,ProGuard 也是有他們團隊開發(fā)的。 它會很容易將Dex文件分割,來解決65K個方法限制問題。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號