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)行成功。 這意味著以下兩種可能:
檢查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è)版本,如果用戶(hù)遇到一個(gè)bug,同時(shí)提交了一個(gè)混淆過(guò)的堆棧跟蹤。 通過(guò)保留mapping.txt
文件,來(lái)確定你可以調(diào)試的問(wèn)題。
DexGuard?若果你需要核心工具來(lái)優(yōu)化,和專(zhuān)門(mén)混淆的發(fā)布代碼,考慮使用DexGuard, 一個(gè)商業(yè)軟件,ProGuard 也是有他們團(tuán)隊(duì)開(kāi)發(fā)的。 它會(huì)很容易將Dex文件分割,來(lái)解決65K個(gè)方法限制問(wèn)題。
更多建議: