在Android Studio當(dāng)中混淆APK實(shí)在是太簡(jiǎn)單了涩笤,借助SDK中自帶的Proguard工具嚼吞,只需要修改build.gradle中的一行配置即可盒件〉疟蹋可以看到,現(xiàn)在build.gradle中minifyEnabled的值是false炒刁,這里我們只需要把值改成true恩沽,打出來(lái)的APK包就會(huì)是混淆過(guò)的了。如下所示:
其中minifyEnabled用于設(shè)置是否啟用混淆翔始,proguardFiles用于選定混淆配置文件罗心。注意這里是在release閉包內(nèi)進(jìn)行配置的,因此只有打出正式版的APK才會(huì)進(jìn)行混淆城瞎,Debug版的APK是不會(huì)混淆的渤闷。當(dāng)然這也是非常合理的,因?yàn)镈ebug版的APK文件我們只會(huì)用來(lái)內(nèi)部測(cè)試脖镀,不用擔(dān)心被人破解飒箭。
那么現(xiàn)在我們來(lái)打一個(gè)正式版的APK文件,在Android Studio導(dǎo)航欄中點(diǎn)擊Build->Generate Signed APK蜒灰,然后選擇簽名文件并輸入密碼弦蹂,如果沒(méi)有簽名文件就創(chuàng)建一個(gè),最終點(diǎn)擊Finish完成打包强窖,生成的APK文件會(huì)自動(dòng)存放在app目錄下凸椿。除此之外也可以在build.gradle文件當(dāng)中添加簽名文件配置,然后通過(guò)gradlew assembleRelease來(lái)打出一個(gè)正式版的APK文件翅溺,這種方式APK文件會(huì)自動(dòng)存放在app/build/outputs/apk目錄下脑漫。如果我們需要反編譯大可以去網(wǎng)上找一些軟件進(jìn)行反編譯髓抑,這里不再一一贅述。
重點(diǎn):混淆規(guī)則是在哪里定義的呢优幸?其實(shí)就是剛才在build.gradle的release閉包下配置的proguard-android.txt文件启昧,這個(gè)文件存放于/tools/proguard目錄下,我們打開(kāi)來(lái)看一下:
# This is a configuration file for ProGuard.# http://proguard.sourceforge.net/index.html#manual/usage.html-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose# Optimization is turned off by default. Dex does not like code run# through the ProGuard optimize and preverify steps (and performs some# of these optimizations on its own).-dontoptimize
-dontpreverify# Note thatifyou want to enable optimization, you cannot just# include optimization flags in your own project configuration file;# instead you will need to point to the# "proguard-android-optimize.txt" file instead of this one from your# project.properties file.-keepattributes *Annotation*
-keeppublicclasscom.google.vending.licensing.ILicensingService
-keeppublicclasscom.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernamesclass* {
native ;
}# keep setters in Views so that animations can still work.# see http://proguard.sourceforge.net/manual/examples.html#beans-keepclassmemberspublicclass* extends android.view.View {voidset*(***);
***get*();
}# We want to keep methods in Activity that could be used in the XML attribute onClick-keepclassmembers class * extends android.app.Activity {publicvoid*(android.view.View);
}# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations-keepclassmembersenum* {publicstatic**[]values();publicstatic**valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {publicstaticfinal android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {publicstatic;
}# The support library contains references to newer platform versions.# Dont warn about those in case this app is linking against an older# platform version.? We know about them, and they are safe.-dontwarn android.support.**
我就問(wèn)你 是不是感覺(jué)頭很大劈伴,哈哈 別著急下面還有解釋密末。
這個(gè)就是默認(rèn)的混淆配置文件了,我們來(lái)一起逐行閱讀一下跛璧。
-dontusemixedcaseclassnames表示混淆時(shí)不使用大小寫混合類名严里。
-dontskipnonpubliclibraryclasses表示不跳過(guò)library中的非public的類。
-verbose表示打印混淆的詳細(xì)信息追城。
-dontoptimize表示不進(jìn)行優(yōu)化刹碾,建議使用此選項(xiàng),因?yàn)楦鶕?jù)proguard-android-optimize.txt中的描述座柱,優(yōu)化可能會(huì)造成一些潛在風(fēng)險(xiǎn)迷帜,不能保證在所有版本的Dalvik上都正常運(yùn)行。
-dontpreverify表示不進(jìn)行預(yù)校驗(yàn)色洞。這個(gè)預(yù)校驗(yàn)是作用在Java平臺(tái)上的戏锹,Android平臺(tái)上不需要這項(xiàng)功能,去掉之后還可以加快混淆速度火诸。
-keepattributes *Annotation*表示對(duì)注解中的參數(shù)進(jìn)行保留锦针。
表示不混淆R文件中的所有靜態(tài)字段,我們都知道R文件是通過(guò)字段來(lái)記錄每個(gè)資源的id的置蜀,字段名要是被混淆了奈搜,id也就找不著了。
-dontwarn android.support.**表示對(duì)android.support包下的代碼不警告盯荤,因?yàn)閟upport包中有很多代碼都是在高版本中使用的馋吗,如果我們的項(xiàng)目指定的版本比較低在打包時(shí)就會(huì)給予警告。不過(guò)support包中所有的代碼都在版本兼容性上做足了判斷秋秤,因此不用擔(dān)心代碼會(huì)出問(wèn)題宏粤,所以直接忽略警告就可以了。
好了航缀,這就是proguard-android.txt文件中所有默認(rèn)的配置商架,而我們混淆代碼也是按照這些配置的規(guī)則來(lái)進(jìn)行混淆的。經(jīng)過(guò)我上面的講解之后芥玉,相信大家對(duì)這些配置的內(nèi)容基本都能理解了蛇摸。
回到Android Studio項(xiàng)目當(dāng)中,APK雖然已經(jīng)成功混淆了灿巧,但是混淆的規(guī)則都是按照proguard-android.txt中默認(rèn)的規(guī)則來(lái)的赶袄,當(dāng)然我們也可以修改proguard-android.txt中的規(guī)則揽涮,但是直接在proguard-android.txt中修改會(huì)對(duì)我們本機(jī)上所有項(xiàng)目的混淆規(guī)則都生效,那么有沒(méi)有什么辦法只針對(duì)當(dāng)前項(xiàng)目的混淆規(guī)則做修改呢饿肺?當(dāng)然是有辦法的了蒋困,你會(huì)發(fā)現(xiàn)任何一個(gè)Android Studio項(xiàng)目在app模塊目錄下都有一個(gè)proguard-rules.pro文件,這個(gè)文件就是用于讓我們編寫只適用于當(dāng)前項(xiàng)目的混淆規(guī)則的敬辣,
混淆第三方庫(kù)雪标,目前我們使用了兩種方式來(lái)引入第三方庫(kù),一種是通過(guò)本地jar包引入的溉跃,一種是通過(guò)remote引入的提鸟,其實(shí)這兩種方式?jīng)]什么區(qū)別汤踏,要保留代碼都可以使用**這種通配符來(lái)實(shí)現(xiàn),如下所示:
-keepclassorg.litepal.** {*;}-keepclassandroid.support.** {*;}
在這里還有一個(gè)問(wèn)題如果有一些第三方數(shù)據(jù)庫(kù)需要混攪怎么整迄薄,以litepal為例子嘲更。如下配置:
-keepclass*extendsorg.litepal.crud.DataSupport{*;
}
LitePal作為開(kāi)源庫(kù)并不需要混淆严拒,上面的配置已經(jīng)演示了如何不混淆LitePal代碼奴曙,然后所有代碼中的Model是需要進(jìn)行反射的由驹,也不能混淆,
因?yàn)長(zhǎng)itePal中所有的Model都是應(yīng)該繼承DataSupport類的炫惩,所以這里我們將所有繼承自DataSupport的類都進(jìn)行保留就可以了僻弹。
如果幫到了您,請(qǐng)給我點(diǎn)個(gè)喜歡唄诡必。奢方。本文參考自郭霖大神的博客搔扁。爸舒。。稿蹲。