介绍作为一个Android开发者,如果你不想开源你的应用,你需要在应用发布之前对代码进行混淆,这样即使代码也很难阅读被反编译。虽然容易混淆概念,但很多初学者只是在网上搜索一些成型的混淆规则,然后粘贴到自己的项目中,并没有对混淆有深入的理解。这篇文章的目的是让一个初学者在阅读后能够在没有任何帮助的情况下独立编写适合自己代码的混淆规则。上面我们直接用AndroidStudio来说明如何混淆。AndroidStudio本身集成了Java语言的ProGuard作为压缩、优化和混淆工具。它非常易于与Gradle构建工具一起使用。你只需要在项目应用目录下的gradle文件中设置minifyEnabled为true即可。然后我们可以将混淆规则添加到proguard-rules.pro文件中。android{...buildTypes{release{minifyEnabledtrueproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}}以上示例代码表示release版本可以混淆。下面先简单介绍一下ProGuard的三个功能,并简单说明一下它们常用的命令。ProGuardShrinking:默认启用,减少应用程序的大小,移除不用的类和成员,优化动作执行后再次执行(因为优化后可能会再次暴露一些不用的类和成员)。-dontshrink关闭压缩优化(Optimization):默认启用,在字节码级别进行优化,使应用程序运行得更快。-dontoptimize关闭优化-optimizationpassesn表示proguard迭代优化代码的次数,Android一般为5次。Obfuscation:默认开启,增加反编译难度。班级和班级成员将被随机命名,除非他们受到keep的保护。-dontobfuscate关闭混淆混淆后默认会在项目目录app/build/outputs/mapping/release下生成一个mapping.txt文件。这就是混淆规则。我们可以根据这个文件把混淆后的代码推回源码,所以这个文件很重要,注意保护好。原则上混淆后的代码越乱越不规则越好,但是有些地方需要避免混淆,否则程序会跑错,所以下面我们要教大家的是,如何避免一些地方混淆你的代码从而防止错误。基本规则先看下面两个常用的命令。很多童鞋可能会对以下两个命令的区别感到困惑。-keepclasscn.hadcn.test.**-keepclasscn.hadcn.test.*一星表示只保留包下的类名,子包下的类名仍然会混淆;两颗星表示保留包和包含的子包下的类名;使用上面的方法保留类后,你会发现类名虽然没有混淆,但是里面具体的方法和变量名都变了。如果既要保留类名,又要让里面的内容不被混淆,我们需要以下方法-keepclasscn.hadcn.test.*{*;}在此基础上,我们还可以使用Java的基本规则为了保护特定的类不被混淆,例如,我们可以使用扩展和实现等Java规则。下面的例子防止所有继承自Activity的类被混淆-keeppublicclass*extendsandroid.app.Activity如果我们想让一个类中的内部类不被混淆,就需要使用$符号。下面的例子意味着在ScriptFragment的JavaScriptInterface内部类中保持所有public内容不被混淆。-keepclassmembersclasscc.ninty.chat.ui.fragment.ScriptFragment$JavaScriptInterface{public*;}此外,如果你不想让一个类中的所有内容不被混淆,而只想保护类下的特定内容,你可以使用
