eclipse中對(duì)Android代碼進(jìn)行混淆操作步驟如下:
- 首先將project.properties中打開(去掉注釋符“#”)
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
其中,${sdk.dir}/tools/proguard/proguard-android.txt為Android SDK中提供的基本混淆規(guī)則。
- 修改proguard-project.txt
proguard-project.txt是基于項(xiàng)目的混淆規(guī)則,需要我們根據(jù)項(xiàng)目的具體情況進(jìn)行添加。
混淆規(guī)則可以查看后面的詳細(xì)說(shuō)明,此處提供一個(gè)簡(jiǎn)單的示例
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep class android.support.v4.** {*;}
-keep class com.stt.photoapk.jni.JniTest {*;}
示例中,keep了需要在manifest中注冊(cè)的Android組件類;keep了support.v4包中所以類;keep了jni的Native接口類JniTest。
- 導(dǎo)出Apk
debug模式,混淆是不會(huì)起作用用的,只有我們導(dǎo)出我們的項(xiàng)目的時(shí)候,混淆才會(huì)起作用,導(dǎo)出apk需要進(jìn)行簽名,我們還需要設(shè)置一下簽名信息。如果你的proguard配置沒有出現(xiàn)問題,那么導(dǎo)出后的apk已經(jīng)被進(jìn)行了混淆操作。 - 注意事項(xiàng)
Project所在的目錄不可用有空格或者一些特殊字符(如“(”)等出現(xiàn),否則混淆會(huì)出錯(cuò)。 - 混淆規(guī)則:
Android代碼混淆常用的規(guī)則:
指定代碼的壓縮級(jí)別
-optimizationpasses 5
包明不混合大小寫
-dontusemixedcaseclassnames
不去忽略非公共的庫(kù)類
-dontskipnonpubliclibraryclasses
優(yōu)化 不優(yōu)化輸入的類文件
-dontoptimize
預(yù)校驗(yàn)
-dontpreverify
混淆時(shí)是否記錄日志
-verbose
混淆時(shí)所采用的算法
-optimizations !code/simplification/arithmetic,!field/,!class/merging/
保護(hù)注解
-keepattributes Annotation
保持哪些類不被混淆
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-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
如果有引用v4包可以添加下面這行
-keep public class * extends android.support.v4.app.Fragment
忽略警告
-ignorewarning
記錄生成的日志數(shù)據(jù),gradle build時(shí)在本項(xiàng)目根目錄輸出
apk 包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)
-dump class_files.txt
未混淆的類和成員
-printseeds seeds.txt
列出從 apk 中刪除的代碼
-printusage unused.txt
混淆前后的映射
-printmapping mapping.txt
proguard 配置最常用的配置選項(xiàng)包括:
-include {filename} 從給定的文件中讀取配置參數(shù)
-basedirectory {directoryname} 指定基礎(chǔ)目錄為以后相對(duì)的檔案名稱
-injars {class_path} 指定要處理的應(yīng)用程序jar,war,ear和目錄
-outjars {class_path} 指定處理完后要輸出的jar,war,ear和目錄的名稱
-libraryjars {classpath} 指定要處理的應(yīng)用程序jar,war,ear和目錄所需要的程序庫(kù)文件
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的庫(kù)類。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可見的庫(kù)類的成員。
保留選項(xiàng)
-keep {Modifier} {class_specification} 保護(hù)指定的類文件和類的成員
-keepclassmembers {modifier} {class_specification} 保護(hù)指定類的成員,如果此類受到保護(hù)他們會(huì)保護(hù)的更好
-keepclasseswithmembers {class_specification} 保護(hù)指定的類和類的成員,但條件是所有指定的類和類成員是要存在。
-keepnames {class_specification} 保護(hù)指定的類和類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護(hù)指定的類的成員的名稱(如果他們不會(huì)壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護(hù)指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之后)
-printseeds {filename} 列出類和類的成員-keep選項(xiàng)的清單,標(biāo)準(zhǔn)輸出到給定的文件
壓縮
-dontshrink 不壓縮輸入的類文件
-printusage {filename}
-dontwarn 如果有警告也不終止
-whyareyoukeeping {class_specification}
優(yōu)化
-dontoptimize 不優(yōu)化輸入的類文件
-assumenosideeffects {class_specification} 優(yōu)化時(shí)假設(shè)指定的方法,沒有任何副作用
-allowaccessmodification 優(yōu)化時(shí)允許訪問并修改有修飾符的類和類的成員
混淆
-dontobfuscate 不混淆輸入的類文件
-printmapping {filename}
-applymapping {filename} 重用映射增加混淆
-obfuscationdictionary {filename} 使用給定文件中的關(guān)鍵字作為要混淆方法的名稱
-overloadaggressively 混淆時(shí)應(yīng)用侵入式重載
-useuniqueclassmembernames 確定統(tǒng)一的混淆類的成員名稱來(lái)增加混淆
-flattenpackagehierarchy {package_name} 重新包裝所有重命名的包并放在給定的單一包中
-repackageclass {package_name} 重新包裝所有重命名的類文件中放在給定的單一包中
-dontusemixedcaseclassnames 混淆時(shí)不會(huì)產(chǎn)生形形色色的類名
-keepattributes {attribute_name,...} 保護(hù)給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and
InnerClasses.
-renamesourcefileattribute {string} 設(shè)置源文件中給定的字符串常量