【学习记录】如何找到apk所在的路径
大前提:android程序其实就是os的插件
插件框架实现思路及原理
一、技术可行性
a) apk的安装处理流程
i. apk会copy到/data/app;
ii. 解压apk中的class.dex,并对其进行优化,获得odex(即JIT)。最后保存到/data/dalvik_cache;
iii. 还有一些权限和包信息,会缓存到/data/system中的packages.list和packages.xml中。
b) 在Android上,对apk包的加载逻辑
i. 加载逻辑
Zygote(孵化器)在成功启动一Android进程后,会根据packages.list的内容(启动时会加载到system_process中的pakcagemanager中),把odex文件,加载到dalvik中,完成逻辑的加载;
ii. 资源读取
资源读取,主要有两三个类,分别是Resource、AssertManager和LayoutInflater。
当在显示界面时,就通过这三个类读取资源。
c) 结论和猜想
i. apk相对于整个android系统而言,其本身就是一种插件形式体现。根据上面关于逻辑和资源的读取概述,完全是可以静默实现的。其次,class.dex并没有包含Android SDK的代码,只是保留对Android SDK接口的调用。 可以这样想象,Android SDK即插件框架,而Android OS即为整个插件的宿主环境。因此这就可以解释了,为什么在1.x编译的代码,在2.x甚至3.x都可以运行,因为只要插件宿主的接口(即Android SDK)不变,插件运行时所调用的接口都可以被找到。
ii. 为了减少内存占用,Resource、AssertManager和LayoutInflater必然不会把apk中的所有资源都加载进来,而是用时才加载并缓存,而且还有一些的处理机制(如最不常用清除等)。因此这些类当中,必然存在一个指明资源路径的字段或者结构。
iii. 要保证兼容性,插件框架公开给插件的接口,必须遵守Open-Close(开发-封闭)原则。另外,一些已经废弃掉接口,同样需要保留。比如Service中的setForeground和JDK的中关于Thread的一些接口等。
iv. 可以尝试通过反射,修改Resource、AssertManager和LayoutInflater中指明资源路径的字段;另外,还可以查看源码,查找设置资源路径的方法。