与我以往的风格不同,本文为科普类文章,因此不会涉及到太过高深难懂的知识。但这些内容可能 Android 应用层开发者甚至部分 framework 层开发者都不了解,因此仍旧高能预警。
另外广东这两天好冷啊,大家注意保暖~
与我以往的风格不同,本文为科普类文章,因此不会涉及到太过高深难懂的知识。但这些内容可能 Android 应用层开发者甚至部分 framework 层开发者都不了解,因此仍旧高能预警。
另外广东这两天好冷啊,大家注意保暖~
之前研究art的时候发现了native bridge,简单来说这东西是主要作用就是为了能运行不同指令集的so(比如x86的设备运行arm的app),而arm设备上这个东西一般都是关闭的,研究了一下后发现这东西挺适合动手脚的,刚好自己在用的Riru被针对了,所以有了这篇博客。把对应的示例代码传到了github:NbInjection,接下来我们聊一下这个小玩具。
2018年发布的Android 9中引入了对隐藏API的限制,这对整个Android生态来说当然是一件好事,但也严重限制了以往我们通过反射等手段实现的“黑科技”(如插件化等),所以开发者们纷纷寻找手段绕过这个限制,比如我曾经提出了两个绕过方法,其中一个便是几乎完美的双重反射(即“元反射”,现在来看叫“套娃反射”比较好);而在即将发布的Android R中把这个方法封杀了(谷歌:禁止套娃!),因此我重新研究了Android R中的限制策略。
大家应该还记得我上次介绍的Dreamland吧,忘记了也没事,简单介绍一下:这是一个类似Xposed的框架,可以注入应用进程并进行方法hook。进程注入上次已经说过了,另一个重点hook当时是使用了SandHook框架,这是一款非常优秀的hook框架,但是有点问题,不太适合Dreamland;在比较了其他hook框架之后,发现似乎都存在一些问题,最终决定自己动手写一个。已经开源,代码在这:Pine,接下来我会介绍它的具体实现。
在国内的大环境下,Android上插件化/热修复等技术百花齐放,而这一切都基于代码的动态加载。Android提供了一个DexClassLoader。用这个API能成功加载dex,但有一个比较严重的问题:Android Q以下,当这个dex被加载时,如果没有已经生成的oat,则会执行一次dex2oat把这个dex编译为oat,导致第一次加载dex会非常非常慢。个人认为这样的设计是非常不合理的,虽然转换成oat之后执行会很快,但完全可以让用户以解释器模式先愉快的用着,dex2oat放另一个线程执行多好。Android 8.0上谷歌还提供了一个InMemoryDexClassLoader,而以前的Android版本,就要开发者自己想办法了……
新人第一次写博客,勿喷..
本文也发布在知乎上
Xposed框架在Android上是神器般的存在,它给了普通用户随意定制系统的能力,各种骚操作层出不穷。随着咱对Android的了解越来越深(其实一点都不深..),逐渐冒出了自己写一个类Xposed框架的想法,最终搞出了这个勉强能用的半成品。
代码在这:Dreamland & Dreamland Manager ,代码写的很辣鸡,求轻喷QAQ
接下来会介绍一下实现细节与遇到的问题。