大前提:Android程序其实就是os的插件
插件框架实现思路及原理
一、技术可行性
a) apk的安装处理流程
i apk会copy到/data/app;
ii 解压apk中的classdex,并对其进行优化,获得odex(即JIT)。最后保存到/data/dalvik_cache;
iii 还有一些权限和包信息,会缓存到/data/system中的packageslist和packagesxml中。
b) 在Android上,对apk包的加载逻辑
i 加载逻辑
Zygote(孵化器)在成功启动一Android进程后,会根据packageslist的内容(启动时会加载到system_process中的pakcagemanager中),把odex文件,加载到dalvik中,完成逻辑的加载;
ii 资源读取
资源读取,主要有两三个类,分别是Resource、AssertManager和LayoutInflater。
当在显示界面时,就通过这三个类读取资源。
c) 结论和猜想
i
apk相对于整个android系统而言,其本身就是一种插件形式体现。根据上面关于逻辑和资源的读取概述,完全是可以静默实现的。其次,classdex并没有包含Android
SDK的代码,只是保留对Android SDK接口的调用。 可以这样想象,Android SDK即插件框架,而Android
OS即为整个插件的宿主环境。因此这就可以解释了,为什么在1x编译的代码,在2x甚至3x都可以运行,因为只要插件宿主的接口(即Android
SDK)不变,插件运行时所调用的接口都可以被找到。
ii
为了减少内存占用,Resource、AssertManager和LayoutInflater必然不会把apk中的所有资源都加载进来,而是用时才加载并缓存,而且还有一些的处理机制(如最不常用清除等)。因此这些类当中,必然存在一个指明资源路径的字段或者结构。
iii 要保证兼容性,插件框架公开给插件的接口,必须遵守Open-Close(开发-封闭)原则。另外,一些已经废弃掉接口,同样需要保留。比如Service中的setForeground和JDK的中关于Thread的一些接口等。
iv 可以尝试通过反射,修改Resource、AssertManager和LayoutInflater中指明资源路径的字段;另外,还可以查看源码,查找设置资源路径的方法。
1
JDK下载地址
JDK(JavaDevelopmentKit)是整个Java的核心,包括一系列Java开发的东西,安装完毕需要配置一下环境变量。
2
JAVA_HOME
JDK的安装路径,这个环境变量本身不存在,需要创建,创建完则可以利用%JAVA_HOME%作为统一引用路径,其值为:jdk在你电脑上的安装路径。
3
PATH
PATH属性已存在,可直接编辑。作用是用于配置路径,简化命令的输入,其值为:%JAVA_HOME%\bin。
4
CLASSPATH
用于编译时JAVA类的路径,注意这里设置的是两个值,(;)表示的是JVM先搜索当前目录。其值为:;%JAVA_HOME%\lib\toolsjar。
5
配置完毕后,通过cmd运行以下命令:java-version,javac如果出现返回信息,则设置成功。
在安卓中运行加载第三方so文件的路径不对,可能是由于以下几个原因:
1、没有正确配置Androidmk文件,导致编译器无法正确识别so文件的路径。
2、so文件的路径不正确,没有放在Android系统指定的路径下,或者放在了不正确的路径下。
3、so文件的版本不正确,比如so文件是32位的,而Android系统是64位的,或者反之亦然。
4、so文件的编译模式不正确,比如so文件是使用arm架构编译的,而Android系统是使用x86架构编译的,或者反之亦然。
5、so文件的编译器版本不正确,比如so文件是使用gcc 49编译的,而Android系统是使用gcc 47编译的,或者反之亦然。
以上就是关于如何找到apk所在的路径全部的内容,包括:如何找到apk所在的路径、如何建立Android系统app开发环境(安卓app开发环境搭建和配置)、安卓运行加载第三方so路径不对等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)