1.配置proguard-rules.pro和module文件混淆成中文:
-
在proguard-rules.pro的配置:
#中文混淆 -classobfuscationdictionary ./proguard-keys.txt -packageobfuscationdictionary ./proguard-keys.txt -obfuscationdictionary ./proguard-keys.txt
在module的目錄下創建proguard-keys.txt文件,裏面寫上一堆中文:
混淆成中文,參考文檔鏈接:https://blog.csdn.net/jiangwei0910410003/article/details/616189452.混淆資源文件,使用微信的AndResGuard:
1.在項目的build.gradle文件中加上AndResGuard的配置:dependencies { // 微信的資源混淆工具:不僅能全面混淆資源文件,還能縮減資源文件的整體體積 classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10' }
2.在module的目錄下創建一個and_res_guard.gradle文件,文件內容如下:
apply plugin: 'AndResGuard' andResGuard { // mappingFile = file("./resource_mapping.txt") mappingFile = null use7zip = true useSign = true // 打開這個開關,會keep住所有資源的原始路徑,只混淆資源的名字 keepRoot = false whiteList = [ // for your icon "R.drawable.icon", // for fabric "R.string.com.crashlytics.*", // for google-services "R.string.google_app_id", "R.string.gcm_defaultSenderId", "R.string.default_web_client_id", "R.string.ga_trackingId", "R.string.firebase_database_url", "R.string.google_api_key", "R.string.google_crash_reporting_api_key" ] compressFilePattern = [ "*.png", "*.jpg", "*.jpeg", "*.gif", ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.2.15' //path = "/usr/local/bin/7za" } /** * 可選: 如果不設置則會默認覆蓋assemble輸出的apk **/ // finalApkBackupPath = "${project.rootDir}/final.apk" /** * 可選: 指定v1簽名時生成jar文件的摘要算法 * 默認值爲“SHA-1” **/ // digestalg = "SHA-256" }
3.在module的build.gradle文件中引用and_res_guard.gradle文件:
具體的可以參考AndResGuard的開源地址:https://github.com/shwenzhang/AndResGuard
2.混淆成中文遇到的問題:
-
在proguard-rules.pro文件中配置-classobfuscationdictionary ./proguard-keys.txt這個,在gradle版本是2.3及以上時,打簽名包報的錯誤信息:
Caused by: java.io.IOException: Failed to read zip file 'E:\project\workepace\myself\Collection\app\build\intermediates\transforms\proguard\release\jars\3\1f\main.jar'. at com.android.apkzlib.zip.ZFile.<init>(ZFile.java:450) at com.android.apkzlib.zip.ZFile.<init>(ZFile.java:387) at com.android.builder.files.RelativeFiles.fromZip(RelativeFiles.java:122) at com.android.builder.files.IncrementalRelativeFileSets.fromZip(IncrementalRelativeFileSets.java:106) at com.android.builder.files.IncrementalRelativeFileSets.fromZip(IncrementalRelativeFileSets.java:84) at com.android.build.gradle.tasks.PackageAndroidArtifact.doFullTaskAction(PackageAndroidArtifact.java:334) at com.android.build.gradle.tasks.PackageApplication.doFullTaskAction(PackageApplication.java:56) at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:88) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) ... 91 more
解決方式是將gradle版本改成2.2.3的,具體原因和解釋參考鏈接:https://blog.csdn.net/SilentWeek/article/details/78520090
-
調整完gradle版本後,try again時報錯:
Gradle DSL method not found: 'google()'Gradle DSL method not found: 'google()' Possible causes:<ul><li>The project 'Collection' may be using a version of the Android Gradle plug-in that does not contain the method (e.g. 'testCompile' was added in 1.1.0). Upgrade plugin to version 3.1.4 and sync project</li><li>The project 'Collection' may be using a version of Gradle that does not contain the method. Open Gradle wrapper file</li><li>The build file may be missing a Gradle plugin. Apply Gradle plugin</li>
將項目的build.gradle文件裏的google()替換成:
repositories { // google() maven { url 'https://maven.google.com/' name 'Google' } }
加上一混淆的優化點:在proguard-rules.pro文件中加上:
#把你的代碼以及所使用到的各種第三方庫代碼統一移到同一個包下,加上包名可以更好的保護不能被混淆的類
-repackageclasses com.myself.collection
具體解釋和使用AndResGuard資源混淆解釋,參考鏈接:https://blog.csdn.net/hqiangtai/article/details/76037244
最後遇到還未解決的問題,希望有大佬能幫忙。在混淆後類名亂碼和字體樣式變了,顯示的不是proguard-keys.txt配置的簡體字體,最後的混淆效果:
3反編譯獲取資源文件和源代碼文件的命令行:
-
準備工具:
apktool 作用:資源文件獲取,可以提取出圖片文件和佈局文件進行使用查看 dex2jar 作用:將apk反編譯成java源碼(classes.dex轉化成jar文件) jd-gui 作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件
配置系統環境:在系統變量中新建變量APK_TOOL,變量值是工具所在的文件夾路徑:
將配置的APK_TOOL環境變量加入Path變量中,我們就可以開始進行反編譯了。
2. 使用cmd命令行進入到保存工具的目錄:
輸入apktool.bat d apk名.apk ,等待提取完成:
會在當前目錄下生成一個apk名的文件夾,進入文件夾下的res文件夾中可以查看資源文件:
雖然我們可以將apk文件的後綴改成zip,解壓後能夠的到目錄,但是打開文件裏面顯示亂碼:
3.將apk的 後綴名改成.zip或者rar,解壓文件,拿到對應的classes.dex文件,並將文件複製到dex2jar.jar解壓後對應的文件夾下。然後使用命令行跳轉到dex2jar.jar解壓後的文件夾路徑下:
在該命令行下輸入d2j-dex2jar classes.dex命令,回車,會在這個目錄下生成一個classes-dex2jar.jar文件,然後使用jd-gui工具的jd-gui.exe工具打開生成的jar文件,顯示效果如上面的混淆結果。