【学习记录】如何找到apk所在的路径
2016-08-09 16:15
357 查看
大前提: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中指明资源路径的字段;另外,还可以查看源码,查找设置资源路径的方法。
插件框架实现思路及原理
一、技术可行性
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中指明资源路径的字段;另外,还可以查看源码,查找设置资源路径的方法。
相关文章推荐
- 预装apk所在路径&如何卸载预装apk
- 浅谈如何找到Java 正确的学习路径
- 如何在PocketPC中获取应用程序所在的路径(C#)
- 用DS播放一个视频时,如何通过编程知道GRAPH加载的FILTER的组件所在的路径??
- [转]如何在batch文件中把当前的路径记录在一个变量里,并运用这个变量?
- GDI+ 学习记录(11) 路径渐变画刷 - PathGradientBrush
- 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息
- 如何找到配置文件的相对路径
- 关于PE病毒编写的学习(五)——病毒如何做标记和记录信息
- 【转载】如何通过打开文件的fd值,找到被打开文件的全路径
- 如何找到起始目录的绝对路径名
- 如何找到这个MAC所在的交换机端口
- C#:如何获取安装文件所在的路径
- 如何的确定调用的dll所在的路径
- 如何获得当前应用程序所在路径
- linux_学习笔记_如何找到和安装软件
- 如何获得当前执行程序所在的路径
- 如何在取得程序运行时所在的路径
- GDI+ 学习记录(19): 路径 - Path
- 20100821 学习记录:VB中WebBrowser控件关于..\ieframe.dll\1'未找到之解决方法