Android APK安装后资源文件(res/assets)位置
目前在做机顶盒、IPTV相关的开发,入职没多久,说实话,深刻感受到了来自顶级程序员大佬的压迫感呀(瑟瑟发抖ing),也体会到自己需要学习的部分非常多,学无止境,温故知新吧,希望在1年之内能够入大佬的眼,为了这个阶段目标还是需要时常记录问题,积累知识,向着大佬和星辰大海,出发!
问题背景
这并不是一篇记录 APK 安装流程的文章,而是一个实际应用时遇到的问题而学习到的知识。
这个问题是做一个调用公司 framework 中的接口完成动态更新logo的APK。下面是公司文档中暴露出来的接口。
问题分析
我们可以看到,接口需要的参数为String格式的图片路径,当时想法就像将图片放到APK的drawable文件夹内,成为APK的resource,path路径就写成package/res/drawable/XX.jpg
,以此来调用该图片,结果在调用时报错no such file or directory
由此报错,引发了我对标题的疑问。
Android APK安装后资源文件(res/assets)位置
应用安装涉及到的文件夹
/system/app
:系统自带的应用程序,获得adb root权限才能删除/data/app
:用户程序安装的文件夹。安装时把apk文件复制到此文件夹/data/data
:存放应用程序的数据/data/dalvik-cache
:将apk中的dex文件安装到dalvik-cache文件夹下(dex文件是dalvik虚拟机的可运行文件,当然,ART–Android Runtime的可运行文件格式为oat。启用ART时,系统会运行dex文件转换至oat文件)/data/system
:该文件夹下的packages.xml文件。相似于Windows的注冊表,这个文件是在解析apk时由writeLP()创建的。里面记录了系统的permissions,以及每一个apk的name,codePath,flags,ts,version,uesrid等信息。这些信息主要通apk的AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机直接从里面读取相关信息加入到内存相关列表中。当有apk升级,安装或删除时会更新这个文件。
实际操作
我们可以看到应用安装的程序应该在/data/app
文件夹下,那我们进入看一下:
可以看到我们安装之后生成的以 package 命名的文件夹,按照我们的剧本,这里面应该按照我们源码的目录结构展示,然后在我们调用接口时,写上这个路径的绝对地址找到图片
但是,实际上我们进去看:
一个 apk 文件,lib文件夹;没有按照剧本走呀
这个时候想到,会不会在/data/data
目录下呢?进去看一下:
希望又出现了,我们发现了存放我们APK应用数据的文件夹,进去看看:
哦吼,希望破灭~ 那难道APK内的资源文件就消失了吗?
当然不会!
还记得/data/app
目录下的那个图中的 apk 文件吗:
事实上,apk安装之后会放在/data/app/**.apk
目录下,以apk形式存在,asset/res
和被绑定在apk里,并不会解压到/data/data/YourApp
目录下去,所以我们无法直接获取到assets/res
的绝对路径,因为它们根本就没有。
至此,我们的想法破灭了,但是就没有办法了吗?
并不是,我们可以将图片资源在程序中输出到我们想要的目录内,在写绝对路径即可。