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.bat classes.dex命令,回车,会在这个目录下生成一个classes-dex2jar.jar文件,然后使用jd-gui工具的jd-gui.exe工具打开生成的jar文件,显示效果如上面的混淆结果。