1、简单来说,Android进行ProGuard,可以起到压缩,混淆,预检,优化的功能,虽然不能说更安全但还是一个不容忽视的环节。
2、首先在build.gradle中将混淆的开关打开,即minifyEnabled置为true然后就要去proguard-rules.pro写入我们的混淆的规则(如文件其名),防止重要的类被混淆移除了。
3、省事第一步,先套个模板,就是找到网上博客上别人分享好的模板,像四大组件,主流开源库,JNI调用本地方法,R资源等的混淆规则都一般有了,注意一点就是套模板,也要套个时间比较近的,没有翻车的模板,可以能比较禅迹节省自己的时间,毕竟这么多行不一定能快速看出来,打个包出来才发现有问题就尴尬啦。
4、一般来说,用了混淆的模板后,我们还会有很多项目专属的需要混淆的部分,例如我们的自定义View,Json解析的实体类,反射用到的类,还有我们依赖的非主流的开源框架,SDK等等。
5、对于自定义View,很多的模板都会将继承与View的类用keep指令防止被混淆。
6、有个偷懒的方法就是把自定义View放入同一个包,再把这个包的类都写入混淆规则,就可以搞定了。
7、对于贺判并Json解析的实体类,反射用到的类都是同理可得,找到那些不能被移除的,把它们写入自己的混淆规则里面。
8、所以如果在做项目时,有提前想到要给项目做混淆的,在导入依赖时就顺手把对应混淆规则写了,那事后就快活似神仙了。
9、首先,先判断下它是否内置了混淆规则。
10、如果不声明它的混淆规则也正常运行,说明已经它带了混淆。
11、但是生活往往不会一帆风顺,一般来说会有各种报错,所以还是需要对它声明混淆。
12、简单的办法就是找到依赖的这个包,就这个包的类都写入混淆规则。
13、例如、项目里导入了一个非主流的开源库,然后我需要对它写入混淆规则,它能正常工作。
14、这时候不可以认为直接去使用它的地方,将有关它import的类keepclass就可以。
15、因为可能它内部还会使用包内其他类,所以好仔细排查,简(tou)单(lan)就是把这个包的类都用keep指令,防止它们被混淆。
16、如下所示、一般来说就可以防止这个开源库里的类被混淆了。
17、例如先使用-libraryjars命令,对导入的jar包和so文件进行声明保留它冲橡们。
18、如果依旧出错,尝试去Externallibrary文件夹或者使用这个SDK的地方找到这个SDK的包找到,并把这个包里的类都用keep指令保持不被移除。
19、如、根据包名,写入混淆规则一般来说,这样就可以避免这个SDK的类被混淆啦好了,后附上一份自己做的项目的混淆规则(伪模板)。
二、android开发代码混淆都混淆哪些1、简单来说,Android进行ProGuard,可以起到压缩,混淆,预检,优化的功能,虽然不能说更安全但还是一个不容忽视的环节。
三、Android 开发怎样做代码加密或混淆1、Proguard对一般用途来说足够了,但是也需要注意一些程序风格,增强proguard的效果、特定类的public函数不做实际的事情,只做简单处理后调用private函数。
2、proguard对会对一些特定类的public函数不做混淆,以便被AndroidManifest.xml和各种layout引用。
3、会被AndroidMinifest.xml和layout引用的类放在浅层的包中,需要隐藏的类放在较深处,以便proguard混淆包名带来好处。
4、如果一个包中有需要不混淆的内容,则整个包名都不会被混淆。
5、将函数根据功能分细切短也会有些益处。
6、如果隐藏代码的要求比较高,还是用native好了。
四、如何使用proguard对Android源码进行混淆保护1、在Eclipse中新建proguard_demo的Android工程,里面只有MainActivity.java和Person.java。因为MainActivity是启动类,是不能被混淆的。我将演示下如何将Person混淆掉。。
2、首先打开“project.properties”文件,然后在文件中添加一行:proguard.config=./proguard-project.txt。文件中之前就有一行,不过是被注释掉了。这句话的意思是:使用当前目录下的proguard-project.txt作为混淆配置文件。。
3、打开“proguard-project.txt”文件,在文件末尾添加:-dontpreverify-repackageclasses'-allowaccessmodification-optimizations!code/simplification/arithmetic-keepattributes*Annotation*-keeppublicclass*extendsandroid.app.Activity-keeppublicclass*extendsandroid.app.Application-keeppublicclass*extendsandroid.app.Service-keeppublicclass*extendsandroid.content.BroadcastReceiver-keeppublicclass*extendsandroid.content.ContentProvider-keeppublicclass*extendsandroid.view.View{ public(android.content.Context); public(android.content.Context,android.util.AttributeSet); public(android.content.Context,android.util.AttributeSet,int); publicvoidset*(...);}-keepclasseswithmembersclass*{ public(android.content.Context,android.util.AttributeSet);}-keepclasseswithmembersclass*{ public(android.content.Context,android.util.AttributeSet,int);}-keepclassmembersclass*implementsandroid.os.Parcelable{ staticandroid.os.Parcelable$CreatorCREATOR;}-keepclassmembersclass**.R$*{ publicstatic;}。
4、然后运行,可以看到界面上有一个文本框,上面写着“hello,world”。然后用dex2jar反编译生成的apk,可以看到有MainActivity和Person类。。
5、也就是说直接运行的方式是不能应用proguard的。正确的方式是使用Eclipse的导出功能。在工程上右键->"Export..."->“ExportAndroidApplication”,导出apk包。可以使用Eclipse默认的keystore,具体的使用方法请参考小编前面一个文档http://jingyan.baidu.com/article/3a2f7c2e61395d26afd611html。。
6、用dex2jar反编译导出的proguard_demo.apk,然后用jd-jui打开。可以看到Person被混淆掉了。。
7、查看Eclipse在工程的根目录下面生成了一个progurad的文件夹。打开这个文件夹可以看到4个文件。其中有一个是“mapping.txt”,这里面列出了混淆前后的对应关系。可以看到我们的Person被混淆成了bJ,里面的成员变量name被混淆成了a。在MainActivity中也能看出来。同时,proguard还把方法调用优化成了直接引用成员变量。。
8、是不是很简单,如果觉得有用,请点击投票,小编会继续努力谢谢你的支持哦。。
五、android 混淆 什么意思1、在Eclipse中新建proguard_demo的Android工程,里面只有MainActivity.java和Person.java。
2、因为MainActivity是启动类,是不能被混淆的。
3、我将演示下如何将Person混淆掉。
六、Android混淆技术1、Java类名、方法名混淆Dalvik字节码包含了大量的调试信息,如类名、方法名、字段名、参数名、变量名等,使用反编译工具可以还原这些信息。由于类名、方法名等通常都会遵循一定的命名规范,破解者很容易根据这些信息来猜测代码功能,阅读起来就跟查看源代码一样。从Android 3开始,Google在SDK中加入了一款叫ProGuard的Android混淆工具,ProGuard会删除这些调试信息,并用无意义的字符序列来替换类名、方法名等,使得使用反编译出来的代码难以阅读,提升逆向难度。使用ProGuard 对Android混淆过后,反编译出来的类名和方法名无法阅读,但是反编译出来的功能代码仍然是容易阅读的,和源代码差不多,破解者仍通过阅读功能代码来自行标记类名、方法名等,然后逆向破解。。
2、Java代码混淆通过对功能代码流程进行乱序混淆,实际运行时乱序Android混淆后的代码流程却和原始代码流程是一样的,但反编译出来的代码流程静态阅读时与原始流程有很大差异,使破解者很难通过静态分析理解代码功能,从而保护Android混淆代码不被逆向分析。比如,原始的代码流程是1->2->3->4->5->6->经过乱序Android混淆后静态反汇编查看到的代码流程可能变成2->7->5->1->6->4->实际运行时代码流程仍然是1->2->3->4->5->6->。
3、Dalvik字节码加密将dex文件中的部分或全部Dalvik字节码加密,Android混淆,每次需要执行时由专门的Native代码负责动态解密和回填,静态反编译出来的代码已经无法阅读甚至无法反编译,动态调试也难以逆向分析。目前有这一技术的有爱加密。。
4、Android apk加密Android混淆可以源代码的一定安全,但是并不全面。Android apk加密技术包括:DEX加壳保护,DEX指令动态加载保护和高级源码混淆保护。其中DEX加壳保护通过将DEX文件隐藏,并生成一个类似于虚像的壳文件,阻止黑客利用反编译工具获取App源码。另外,爱加密独有的so库保护,使得C/C++ 层面的代码安全也得到防护。加上资源文件保护(图片、音频等文件的防查看和防修改)、xml 主配文件保护(对主配文件进行二次签名)、内存保护等措施,可以基本App的动态和静态安全。。
七、Android[4]EventBus混淆处理1、在项目中集成EventBus0,并使用EventBusAnnotationProcessor注解处理器生成索引。
2、在项目的build.gradle中添加仓库地址和依赖。
3、在应用的build.gradle中添加插件。
4、在项目中开启代码混淆功能。
5、编译项目。
6、查看buildintermediates ransformsproguard目录下终生成的main.jar发现代码中的方法名终被处理替换成混淆后的方法名。。
7、官方文档说明。
八、Android开发之混淆高级教程011、我们知道,Java在编译的时候将代码(.java)转换成字节码(.class),相比源代码来说,字节码更加的简洁,但因为只是将源代码编译成字节码,生成的字节码中包含一些没有用到的代码,尤其当你的项目包含一国联柱些第三方的类库时,没有用到的代码会更多。压缩阶段将分析生成的字节码,然后在项目能够正常运行的同时将一些没有引用的类、字段、方法移除,这就是所谓的压缩阶段。为了验证是否真的移除未引用的类、字段、方法,创建一个module,包含AdvancedCourseActivity和Subject两个类,其中Subject没有被引用,对混淆后的项目进行签名打包,然后反编译生成的apk文件,检查是否还存在Subject字节码文件,如下图:。
2、反编译后的项目结构,如下图:。
3、由上图,发现Subject字节码文件已被移除,接下来修改Subject类中,代码如下:。
4、然后在AdvancedCourseActivity引用Subject提供的构造方法和get方法,是否没有引用的set方法会被移除呢?引用的代码,如下:。
5、反编译后的项目结构,如下图:。
6、由上帽娃图分析,混淆代码后,保留了被引用的字段:courseName、creditHour,保留被引用的方法:getCourseName()、getCreditHour(),以及构造方法,我们将在以后的混淆中巧妙地使用压缩规则,有点类似于AndroidStudio的AppLinkAssistant功能。那么,开启混淆功能,默认执行压缩过程(即执行字节码分析),然后移除无用的类、字段、方法,如果我们不想执行代码的压缩,我们那该怎么做呢?这时候,就需要学习压缩阶段的一些规则了(除此外,还有优化规则、混淆规则),压缩规则的可选项,包括如下几种:。
7、-dontshrink开启混淆,默认压缩所有的类,通过上述关键字可以关闭压缩过程,在proguard-rules.pro文件中添加如下规则:。
8、反编译后的项目结构,如下图:。
9、-printusage[filename]将压缩阶段未引用的所有类的信息打印到指定的文件中,如果你没有在proguard-rules.pro指定该选项,默认输出路径是:。
10、在上面的例子中,Subject未引用set方法,在usage.txt文件中,可以找到如下信息:作用:可以用于检查签名打包的apk,在离斤压缩阶段移除了哪些代码,是否符合自己的要求。。
11、-whyareyoukeepingclass_specification打印出在压缩阶段,被保留类和内部成员的详细说明,class_specification指定我们需要了解的类名,打印出来的详细说明在GradleConsole查看,比如,我们想要了解为什么保留Subject类信息,在proguard-rules.pro文件中添加如下规则:。
12、运行当前Demo,gradleconsole打印出如下信息:。
13、前面,我们说到usage.txt文件记录没有引用的类信息,反过来也可以反推出被引用的类信息,Subject类为引用setCourseName()和setCreditHour(),除此外,get方法和构造方法被引用,从上图看出,在AdvancedCourseActivity的voidonCreate()被调用。到此,我们完成了压缩阶段的学习。。
14、在压缩过程,除了移除未引用的类、字段、方法外,ProGuard同时也执行字节码的优化处理,支持的优化方式,包括以下几种:评估常量表达式移除不需要的字段访问和方法调用移除不需要的修饰符和测试实例移除未引用的代码块合并相同的代码块减少变量的分配移除只写字段和未引用的方法参数内联常量字段、方法参数和返回值内联简短的或仅回调一次的方法简化尾递归调用合并可以合并的类和接口根据使用情况,修改方法为private、static、final用单一的实现替换接口执行不止200次的窥孔优化可选地删除打印的日志代码实际的优化效果还依赖项目的代码和代码执行的VM,终,字节码文件变得更小。。
15、优化代码可选项。AndroidStudio开启混淆,默认执行优化的过程,所有类里面的方法在字节码阶段进行优化处理,同时,为我们提供修改优化过程的规则,这些优化规则包括以下几种:。
16、-dontoptimize在proguard-rule.pro文件添加上述规则,关闭优化过程,需要使用该选项,在proguard-rules.pro添加如下规则:。
17、-optimizationsoptimization_filter有选择的优化符合optimization_filter过滤器()规则的字节码,需要使用该选项,在proguard-rules.pro添加如下规则:。
18、-optimizationpassesn指定执行优化级别的整型参数,默认执行一级优化,多级优化进一步改良字节码的质量。。
19、-assumenosideeffectsclass_specification为了防止优化过程对类的方法造成影响,使用上述规则摒弃掉这种影响。这是因为,在优化阶段,ProGuard移除方法的依据:分析程序代码自动检查没有被引用的方法,但不分析library类库的代码,因此,在proguard-rules.pro添加上述规则,或许很有用。。
20、-allowaccessmodification指定类和内部成员的访问修饰符可以在优化处理期间修改,可以改良优化过程的结果。。
21、-mergeinterfacesaggressively指定可以被合并的接口。
22、其中,optimization_filter过滤器的可选项,可以是下面列表中一项或者多项:class/marking/final在可能时,将类标记成finalclass/merging/vertical在可能时,垂直地合并各类class/merging/horizontal在可能时,水平地合并各类field/removal/writeonly移除只写字段field/marking/private在可能时,将字段标记成privatefield/propagation/value跨方法,传递字段值method/marking/private在可能时,将方法标记成private。
23、method/marking/static在可能时,将方法标记成staticmethod/marking/final在可能时,将方法标记成finalmethod/removal/parameter移除未引用的方法参数method/propagation/parameter将调用方法的方法参数的值传递给被调用方法method/propagation/returnvalue将方法的返回值传递给调用的方法method/inlining/short内联简短的方法method/inlining/unique内联只调用一次的方法method/inlining/tailrecursion在可能时,简化尾递归调用code/merging当修改分支版本时,合并相同的代码块code/simplification/variable优化变量加载和存储。。
24、code/simplification/arithmetic优化算术指令code/simplification/cast优化抛出操作code/simplification/field优化字段加载和存储code/simplification/branch优化分支指令code/simplification/string优化常量字符串code/simplification/advanced基于控制流分析和数据流分析,简化代码code/removal/advanced基于控制流分析和数据流分析,移除代码code/removal/simple基于简单的控制流分析,移除代码code/removal/variable从本地变量帧,移除未引用的变量code/removal/exception移除空try区块异常code/allocation/variable在本地变量帧中,优化变量分配。
25、除了可以是上述可选项中的一项或多项外,还可以使用通配符?和*,其中:?,匹配优化名称的单个字符*,匹配优化名称的多个字符参考的例子如下:。
26、在上一篇文章《Android开发之混淆基础教程》我们总结了用于保留类名、方法名的关键字就有6个,如下表格所示:。
27、除了,-keepclassmembers和-keepclassmembernames仅用于保留指定的方法而不保留类名外;其他4个关键字即可保留类名,也可以保留方法名,这属于其中一个比较大的区别。然而,无names的关键字和有names的关键字的关系如下图:。
28、开启代码混淆功能后,无names的关键字通过添加修饰符allowshrinking(ps:修饰符要加逗号),等价于有names的关键字。换句话说,前者没有执行压缩过程,后者压缩后可以移除未引用的类、方法和字段,有效减少代码量和内存消耗,因此,可以的话建议使用或者。到此,完成了几种保留类名、方法名关键字的学习。。
29、本篇文章主要介绍了混淆过程的压缩代码的目的,优化代码的几种方式,然后了解各自阶段的规则配置,后总结无names和有names保留关键字的区别,加深了对混淆过程、混淆规则的理解。在下一篇文章《Android开发之混淆高级教程02》,将会在包含多个第三方类库、注解、序列化、枚举等项目中使用混淆功能,那样的规则又该如何写呢?。
九、android中的SDK支持混淆是什么概念,具体说。1、因为java代码的反编译满天飞,所以google在android3sdk加入的代码混淆技术。
2、使你基本反编译出来java代码也能难读懂。
3、具体可以看这片文章http、//blog.csdn.net/Zengyangtech/article/details/6127600。