Android 将类混淆成中文、混淆资源文件和反编译

1.配置proguard-rules.pro和module文件混淆成中文:

  1. 在proguard-rules.pro的配置:

       #中文混淆
       -classobfuscationdictionary ./proguard-keys.txt
       -packageobfuscationdictionary ./proguard-keys.txt
       -obfuscationdictionary ./proguard-keys.txt
    

    在module的目录下创建proguard-keys.txt文件,里面写上一堆中文:
    Android 将类混淆成中文、混淆资源文件和反编译
    混淆成中文,参考文档链接:https://blog.csdn.net/jiangwei0910410003/article/details/61618945

    2.混淆资源文件,使用微信的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文件:

Android 将类混淆成中文、混淆资源文件和反编译
具体的可以参考AndResGuard的开源地址:https://github.com/shwenzhang/AndResGuard

2.混淆成中文遇到的问题:

  1. 在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

  1. 调整完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配置的简体字体,最后的混淆效果:
Android 将类混淆成中文、混淆资源文件和反编译

3反编译获取资源文件和源代码文件的命令行:

  1. 准备工具:

       apktool  
            作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
       dex2jar
            作用:将apk反编译成java源码(classes.dex转化成jar文件)
       jd-gui
            作用:查看APK中classes.dex转化成出的jar文件,即源码文件
    

配置系统环境:在系统变量中新建变量APK_TOOL,变量值是工具所在的文件夹路径:
Android 将类混淆成中文、混淆资源文件和反编译
将配置的APK_TOOL环境变量加入Path变量中,我们就可以开始进行反编译了。
Android 将类混淆成中文、混淆资源文件和反编译
2. 使用cmd命令行进入到保存工具的目录:
Android 将类混淆成中文、混淆资源文件和反编译
输入apktool.bat d apk名.apk ,等待提取完成:
Android 将类混淆成中文、混淆资源文件和反编译
会在当前目录下生成一个apk名的文件夹,进入文件夹下的res文件夹中可以查看资源文件:
Android 将类混淆成中文、混淆资源文件和反编译
Android 将类混淆成中文、混淆资源文件和反编译
虽然我们可以将apk文件的后缀改成zip,解压后能够的到目录,但是打开文件里面显示乱码:
Android 将类混淆成中文、混淆资源文件和反编译
3.将apk的 后缀名改成.zip或者rar,解压文件,拿到对应的classes.dex文件,并将文件复制到dex2jar.jar解压后对应的文件夹下。然后使用命令行跳转到dex2jar.jar解压后的文件夹路径下:
Android 将类混淆成中文、混淆资源文件和反编译
在该命令行下输入d2j-dex2jar classes.dex命令,回车,会在这个目录下生成一个classes-dex2jar.jar文件,然后使用jd-gui工具的jd-gui.exe工具打开生成的jar文件,显示效果如上面的混淆结果。