array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 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文件,显示效果如上面的混淆结果。

相关文章: