博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 编程下的代码混淆
阅读量:5891 次
发布时间:2019-06-19

本文共 4411 字,大约阅读时间需要 14 分钟。

hot3.png

什么是代码混淆

Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。

混淆文件 proguard.cfg 参数详解

复制代码
-optimizationpasses 5                                                           # 指定代码的压缩级别-dontusemixedcaseclassnames                                                     # 是否使用大小写混合-dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar-dontpreverify                                                                  # 混淆时是否做预校验 -verbose                                                                        # 混淆时是否记录日志-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法-keep public class * extends android.app.Activity                               # 保持哪些类不被混淆-keep public class * extends android.app.Application                            # 保持哪些类不被混淆-keep public class * extends android.app.Service                                # 保持哪些类不被混淆-keep public class * extends android.content.BroadcastReceiver                  # 保持哪些类不被混淆-keep public class * extends android.content.ContentProvider                    # 保持哪些类不被混淆-keep public class * extends android.app.backup.BackupAgentHelper               # 保持哪些类不被混淆-keep public class * extends android.preference.Preference                      # 保持哪些类不被混淆-keep public class com.android.vending.licensing.ILicensingService              # 保持哪些类不被混淆-keepclasseswithmembernames class * {                                           # 保持 native 方法不被混淆    native 
;}-keepclasseswithmembers class * { # 保持自定义控件类不被混淆 public
(android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * { public
(android.content.Context, android.util.AttributeSet, int); # 保持自定义控件类不被混淆}-keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆 public void *(android.view.View);}-keepclassmembers enum * { # 保持枚举 enum 类不被混淆 public static **[] values(); public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *;}-keep class MyClass; # 保持自己定义的类不被混淆
复制代码

代码混淆的方法

根据 SDK 的版本不同有 2 中不同的代码混淆方式,以上的 proguard.cfg 参数详解中所涉及到的信息是在较低版本 SDK 下的混淆脚本,事实上在高版本的 SDK 下混淆的原理和参数也与低版本的相差无几,只是在不同 SDK 版本的环境下引入混淆脚本的方式有所不同。具体方法如下:

  • 低版本 SDK 下,项目中同时包含 proguard.cfgproject.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。
  • 高版本 SDK 下,项目中同时包含 proguard-project.txtproject.properties 文件,这时需要在 proguard-project.txt 文件中进行如下信息的配置,然后再将项目 Export 即可。下面以真实的文件进行演示说明。
复制代码
# To enable ProGuard in your project, edit project.properties# to define the proguard.config property as described in that file.## Add project specific ProGuard rules here.# By default, the flags in this file are appended to flags specified# in ${sdk.dir}/tools/proguard/proguard-android.txt# You can edit the include path and order by changing the ProGuard# include property in project.properties.## For more details, see# http://developer.android.com/guide/developing/tools/proguard.html  # Add any project specific keep options here: sdk.dir=D:/Android-SDK/android-sdkproguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # If your project uses WebView with JS, uncomment the following# and specify the fully qualified class name to the JavaScript interface# class:#-keepclassmembers class fqcn.of.javascript.interface.for.webview {#   public *;#}
复制代码

以上的配置信息即是 proguard-project.txt 文件中内容,蓝色文字为我们在代码混淆过程中需要添加的配置信息,其中:sdk.dir 为你在当前机器上 SDK 的安装路径,第二句配置的意思实际上是将 SDK 中代码混淆配置文件 proguard-android.txt (感兴趣的朋友可以将这个文件和上面的 proguard.cfg 文件进行对比)映射到 proguard-project.txt 作为 proguard.config 混淆设置

转载于:https://my.oschina.net/u/573470/blog/189250

你可能感兴趣的文章
D项目轶事之本地化严重不足的客户
查看>>
程序员和工程师有什么不一样?
查看>>
如何避免云计算建设信息孤岛?
查看>>
Hadoop集群datanode磁盘不均衡的解决方案
查看>>
HBase最佳实践-读性能优化策略
查看>>
被MD5加密坑了?雅虎大规模泄密是个咋样的悲剧
查看>>
从四个方面看中国存储芯片崛起的艰难
查看>>
怎样的Hash算法能对抗硬件破解?
查看>>
继 SaaS 后的下一代主要技术猜想
查看>>
备份宝让企业数据备份与恢复更容易
查看>>
六步走战略,助您实现SQL Server存储扩展性提升
查看>>
Facebook公司在新墨西哥州建第七个数据中心
查看>>
如何从黑客的角度看《人民的名义》?
查看>>
这是一个除了有PPT,还有电影看的神奇会议|SIGGRAPH Asia 2016第一天亮点指南
查看>>
《Visual C++数字图像模式识别技术详解(第2版)》一第3章 图 像 特 征
查看>>
百度将 HPC 技术引入深度学习;卡巴斯基操作系统;AMD Ryzen 预售等 | AI 开发者头条...
查看>>
大数据金融谁是王者
查看>>
《Servlet和JSP学习指南》一1.12 小结
查看>>
观点 | 加密数字货币不会成为主流,区块链是RegTech不是FinTech
查看>>
专访阿里 iDST 语音组总监鄢志杰:智能语音交互从技术到产品,有哪些坑和细节要注意?...
查看>>