Android进阶大纲
Hook
Android上hook手段非常多,从时机上可以分为编译时hook和运行时hook两大类。编译时hook主要以构建过程中的字节码修改为主,代表有Lancet、ByteX等;运行时hook可以细分为Java层和Native层hook,Java层常用的有反射替换、动态代理、ArtTI等,Native层的Hook主要就是以PLT和inline hook为主,还有一些特定场景使用的比如JNI hook、虚函数hook、根据内存偏移选址变量并修改等。
基本流程
1、根据需求确定 要hook的对象
2、寻找要hook的对象的持有者,拿到要hook的对象
3、定义“要hook的对象”的代理类,并且创建该类的对象
4、使用上一步创建出来的对象,替换掉要hook的对象
使用示例
1 | /** |
Proguard
Proguard 具有以下三个功能:
- 压缩(Shrink): 检测和删除没有使用的类,字段,方法和特性
- 优化(Optimize) : 分析和优化Java字节码
- 混淆(Obfuscate): 使用简短的无意义的名称,对类,字段和方法进行重命名
公共模板
1 | ############################################# |
aar中增加独立的混淆配置
build.gralde
1 | android { |
检查混淆和追踪异常
开启Proguard功能,则每次构建时 ProGuard 都会输出下列文件:
dump.txt
说明 APK 中所有类文件的内部结构。mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换。seeds.txt
列出未进行混淆的类和成员。usage.txt
列出从 APK 移除的代码。
这些文件保存在/build/outputs/mapping/release/ 中。我们可以查看seeds.txt里面是否是我们需要保留的,以及usage.txt里查看是否有误删除的代码。mapping.txt文件很重要,由于我们的部分代码是经过重命名的,如果该部分出现bug,对应的异常堆栈信息里的类或成员也是经过重命名的,难以定位问题。我们可以用 retrace 脚本(在 Windows 上为 retrace.bat;在 Mac/Linux 上为 retrace.sh)。它位于/tools/proguard/ 目录中。该脚本利用 mapping.txt文件和你的异常堆栈文件生成没有经过混淆的异常堆栈文件,这样就可以看清是哪里出问题了。使用 retrace 工具的语法如下:
1 | retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>] |
补齐Android技能树-从害怕到玩转Android代码混淆
依赖注入
Hilt
Hilt依赖注入,基于Dagger
AOP
AOP:Aspect Oriented Programming:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP思想可以说成是插桩。关注下图AspectJ的插入时机
最常见的AOP就是代理