Android 混淆总结

https://blog.csdn.net/u011732740/article/details/51545722

  1. 混淆后App Crash日志定位问题


    混淆代码错误信息.png

2.1、常用命令

命令 作用
-keep 防止该类所有内容被移除或重命名
-keepnames 防止类和成员被重命名
-keepclassmembers 防止成员被移除或者被重命名
-keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名
-keepclasseswithmembernames 防止拥有该成员的类和成员被重命名
2.2. 常用规则

类:需要使用完全限定名;

*:通配符,任意字符串,不包含包名分隔符(.);

**:通配符,任意字符串,包含包名分隔符(.);

extends:继承某类的类;

implement:实现某接口的类;

$:内部类;

<init>:所有构造方法;

<fields>:所有成员变量;

<methods>:所有方法;

…:任意参数;

修饰符:public private protected

2.3. 例子

含义 指令语句
不混淆某个类 -keep public class packageName.className{ ; }
不混淆某个包的所有类 -keep class packageName.
*{ *; }
不混淆某个类的子类 -keep public class * extends packageName.className{ *; }
不混淆某个接口的子类 -keep public class * implements packageName.className{ *; }
不混淆某个类的构造方法

-keepclassmembers class packageName.className{ 
public <init>(org.json.JSONObject);
}

不混淆某个类的某个方法 -keepclassmembers class packageName.className{ public void methodName(…); }
不混淆某个类的内部类 -keep class packageName.className$*{ *; }
混淆的步骤

上文中介绍了代码的混淆,其实Android的混淆中还包括了资源压缩,整个过程包括:压缩、优化、混淆、以及预校验,其中第四步在Android中可不要,默认是去掉了的,另外三个都是默认开启的。

压缩:会移除未被使用的类和成员变量,会在优化后再次被执行;
优化:在字节码级别执行优化,让应用运行的更快;
混淆:增大反编译难度,类和类成员会被随机命名,除非用keep保护。

Shrinking Options 压缩选项

shrink,测试后发现会将一些无效代码给移除,即没有被显示调用的代码

-dontshrink

shrink操作默认启用,每个optimization步骤后,都会执行一步shrink。

该选项 表示 不启用 shrink。

测试后发现是全局性的,且即便使用了-keep 开启shrink,也无效

-printusage [filename]

打印被移除的代码,在标准输出
-whyareyoukeeping class_specification

打印 在shrink过程中 为什么有些代码被 keep

Optimization Options 优化选项

基于控制流、数据流分析后,删除、合并一些代码

-dontoptimize

optimization,默认启用

该选项表示 不启用

当不使用该选项时,下面的才有效
-optimizations optimization_filter

根据optimization_filter指定要优化的文件
-optimizationpasses n

优化数量 n
-assumenosideeffects class_specification

如果一个方法有返回值,在调用的时候没使用到它的返回值,那么可能被忽略。

-allowaccessmodification

优化时允许访问并修改类和类的成员的 访问修饰符,可能作用域会变大。
-mergeinterfacesaggressively

竭力合并接口,即使它们的实现类未实现合并后接口的所有方法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 混淆(Proguard)用法 最近项目中遇到一些混淆相关的问题,由于之前对proguard了解不多,所以每次都是面...
    于晓飞93阅读 57,033评论 38 230
  • Proguard 混淆工具来帮助我们快速地对代码进行混淆。根据 Java 官方介绍,Proguard 对应的具体中...
    独自闯天涯的码农阅读 11,225评论 0 7
  • 最近在研究apk瘦身时,发现代码混淆有很大作用,所以就去简单研究了一下。 我认为,代码混淆可以保护核心功能不泄漏以...
    i小灰阅读 11,365评论 2 12
  • 在了解混淆之前,先来了解一下反编译。 反编译 Android程序打完包之后得到的是一个APK文件,这个文件是可以直...
    聽媽媽的话阅读 3,712评论 0 0
  • 如何开启混淆 eclipse 只需要在工程中找到projiect.properties文件,在这个文件中修改下面一...
    mymdeep阅读 3,068评论 0 1

友情链接更多精彩内容