混淆配置

2018-02-24 16:12 更新

ProGuard?是一個(gè)在Android項(xiàng)目中廣泛使用的壓縮和混淆打包的源碼的工具。

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

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

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

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

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

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

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

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

防止 ProGuard?混淆?一些類(lèi)和成員,添加?keepnames:

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

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)