问题背景:在PC上的程序可以轻松使用./或不用指明,默认读取的就是程序所在路径内的文件。但在Android上,应用程序被打包成apk,程序运行时无法直接获取apk(压缩包)内的文件。但在一些特殊场合,如加载图像处理训练好的分类器、模型等数据,要求每个apk到手机上都能运行,就必须解决这个问题。本文深入研究apk安装过程,给出三种方法解决这个问题。
一、android apk安装过程
Android
apk文件是将AndroidManifinest.xml、应用程序代码(.dex)、资源文件和其他文件打包成的一个压缩包文件,其中的.dex文件即使android上的可执行文件,由Java代码编译后的class文件链接而成。因此可以用unzip直接将apk打开。如下图所示,将本文后面要附源码的一个apk解压后示意图下:
1、assets文件夹,这个本文后面的源码专门就讲它,暂略。
2、lib文件夹,这里放着我们jni编译后生成的so文件。
3、META-INF文件夹,这个要追溯到java的jar文件。jar文件和zip文件唯一的区别就是包含一个META-INF文件夹,详见:这里。
4、res文件夹,就是所谓的资源文件,里面放的有各种图片资源(drawable文件夹下的东西)和布局xml文件。示图如下:
因此如果想借用一个apk的图片资源的话,直接解压就ok了。
5、AndroidManifinest.xml文件,这个就不多说了,每个Android工程文件都有。
6、classes.dex文件,Dex是Dalvik VM
executes的全称,即Android Dalvik执行程序,并非Java
ME的字节码而是Dalvik字节码。
7、resources.arsc文件,是编译后的二进制资源文件。
apk具体的核心安装步骤及牵涉到文件夹路径如下(以安装ReadAssets.apk为例):
第一步:复制apk文件到data/app/目录下,解压并扫描安装包,名字是以包名命名的,并不是apk的名字。如下:
第二步:将.dex文件保存到data/dalvik-cache目录,
第三步:在/data/data/目录下创建对应的应用数据目录,目录名字是apk的包名:
其中cache文件夹下的内容如下:
lib文件夹下是jni里生成的库,libReadAsset.so,如下:
转:https://blog.csdn.net/lihongyang1/article/details/70331813