安卓系统查找应用资源文件的方法
技术领域
本发明涉及安卓系统查找应用资源文件的方法。
背景技术
安卓(Android)系统是目前智能移动终端等电子设备上广泛使用的操作系统,安卓系统中可以运行各种应用(应用指能够在安卓系统中运行的软件或程序)。安卓系统的应用在启动时经常会出现加载进度条(实际上是把应用运行时需要加载的本地文件从应用的安装包中提取出来存储到指定目录),加载完成后有时又会弹出对话框强制要求下载补丁。应用运行时需要加载的本地文件和从远程下载的补丁文件,可以统称为资源文件。如果缺少资源文件,应用不能正常运行。因此在安卓系统快速启动应用、免安装运行应用等技术方案中资源文件具有重要作用。
安卓系统提供了访问本地存储的API(应用程序编程接口),如果应用调用安卓系统提供的API,则资源文件的存储目录是确定的。例如,调用Context.getFilesDir(),可以获得“/data/data/应用包名/files”目录;调用Context.getCacheDir(),可以获得“/data/data/应用包名/cache”目录;调用Context.getExternalFilesDir(),可以获得“/sdcard/Android/data/应用包名/files”目录;调用Context.getExternalCacheDir(),可以获得“/sdcard/Android/data/应用包名/cache”目录。上述目录由安卓系统代为管理,应用卸载时安卓系统会自动清空这些目录,不遗留垃圾文件。进一步的,“/sdcard/Android/data/应用包名/files”和“/sdcard/Android/data/应用包名/cache”这两个目录分别对应安卓系统“设置->应用->应用详情”里的“清除数据”与“清除缓存”选项,非常便于用户管理。
然而,标准的安卓系统并没有强制性规定应用的资源文件必须存储在上述目录。一些应用的开发者出于各种考虑,将应用的资源文件存储在其他目录下,对此安卓系统也提供支持。例如,调用Environment.getDataDirectory(),可以获得/data目录;调用Environment.getExternalStorageDirectory(),可以获得/sdcard目录。应用的开发者可以在/data目录或/sdcard目录下任意创建子目录存储资源文件。对于此类资源文件,如何在安卓系统中快速、准确的进行查找,尚未见报道。
在说明书“背景技术”部分公开的内容,有助于本领域技术人员理解本发明的技术方案,但不应据此认为这些内容一定属于现有技术或公知常识。
发明内容
为了克服“背景技术”部分所反映的缺陷,本发明提供安卓系统查找应用资源文件的方法。安卓系统查找应用资源文件的方法,包括:
1)获取安卓系统分配给应用的UID;
2)遍历安卓系统应用目录的所有文件,找出文件的Owner ID与1)中所述UID一致的全部文件。
进一步的,所述的安卓系统应用目录包括安卓系统的/data目录和/sdcard目录。
进一步的,所述的方法还包括:
0)将安卓系统不支持UID的应用目录更改为支持UID。
更进一步的,所述安卓系统不支持UID的应用目录为安卓系统的/sdcard目录,所述的更改包括:
利用安卓系统内核的fuse模块将应用对/sdcard目录的文件操作转发到sdcarddeamon;
强制应用对/sdcard目录进行文件操作时目标文件的Owner ID为应用的UID。
进一步的,所述的方法还包括:
3)根据2)中文件的Owner ID与1)中所述UID一致的文件的路径合并出文件的顶层父目录。
更进一步的,所述的方法还包括:
4)舍弃3)中顶层父目录中大小小于设定阈值的顶层父目录。
本发明技术方案中,“包括”、“用于”等词语应按照开放式表达方式理解。本领域技术人员通过阅读本说明书并结合现有技术或公知常识能够获知的内容,本说明书中不再赘述。
本发明提供的安卓系统查找应用资源文件的方法,无论应用的资源文件位于安卓系统的任何位置,都能够快速、准确的查找出来。
附图说明
图1为具体实施方式中完整的安卓系统查找应用资源文件的方法流程图。
具体实施方式
下面对本发明的实施方式进行进一步的具体说明。但应注意,本发明的范围并不局限于所描述的具体技术方案。任何对所描述的具体技术方案中的技术要素进行相同或等同替换获得的技术方案或本领域技术人员在所描述的具体技术方案的基础上不经过创造性劳动就可以获得的技术方案,都应当视为落入本发明的保护范围。
安卓(Android)系统是目前智能移动终端等电子设备上广泛使用的操作系统,安卓系统中可以运行各种应用(应用指能够在安卓系统中运行的软件或程序)。应用运行时需要资源文件,应用会将从本地或远程获取的资源文件存储在安卓系统应用目录的某些位置,至于具体存储在什么位置,安卓系统并没有强制性的规定。所述的应用目录,指应用有权使用、能够进行文件操作的目录。安卓系统的绝大多数应用都没有安卓系统的根(root)权限,标准安卓系统中无根权限的应用有权使用的目录为/data目录和/sdcard目录。
应用的资源文件的具体存储位置,可以通过本发明提供的安卓系统查找应用资源文件的方法进行查找。完整的安卓系统查找应用资源文件的方法,其流程如如图1所示,包括:
S100:将安卓系统不支持UID的应用目录更改为支持UID。
UID通常指用户标识(User Identification),但由于安卓系统是单用户操作系统,安卓系统的UID变为与应用相对应的标识。安卓系统的文件系统比较复杂,以继承自Linux的EXT文件系统为主,但也兼容FAT文件系统。FAT文件系统不支持UID,如果存储资源文件的应用目录为FAT文件系统,会导致本发明技术方案无法实现。因此,本步骤可以视为一个准备步骤,如果实际的安卓系统中不存在FAT文件系统的目录,则无需执行本步骤。
安卓系统中FAT文件系统的目录往往是/sdcard目录(即对应SD存储卡的目录)。将/sdcard目录更改为支持UID,可以利用安卓系统内核提供的fuse模块。fuse模块能够让/data目录和/sdcard目录共享同一个分区,即/sdcard目录挂载了/dev/fuse设备,应用对/sdcard目录的文件操作被fuse模块转发到用户态的sdcard deamon中(源代码位于/system/core/sdcard/sdcard.c)。这样可以使/sdcard目录的文件系统也变为EXT,支持UID。
安卓系统的文件有其Owner ID(所有者标识)。应用创建文件时,应当使用安卓系统分配给自己的UID作为文件的Owner ID,但在标准安卓系统的sdcard deamon中上述机制并没有严格执行。因此需要修改标准安卓系统的代码,强制应用对/sdcard目录进行文件操作(本发明技术方案中主要涉及文件的读写操作)时目标文件的Owner ID为应用的UID。涉及需要修改的代码,包括/system/core/sdcard/sdcard.c,也包括fuse模块中(位于内核的fs/fuse目录下)的相关代码。
S101:获取安卓系统分配给应用的UID。
在应用安装时,安卓系统会分配给应用一个唯一的UID,记录在/data/system/packages.xml文件中。读取/data/system/packages.xml文件中的信息,即可获得分配给某个应用的UID。在安卓系统中,UID有固定的格式。
S102:遍历安卓系统应用目录的所有文件,找出文件的Owner ID与S101中所述UID一致的全部文件。
遍历安卓系统应用目录的所有文件,找出这些文件中文件的Owner ID与步骤S101中获取的UID一致的全部文件。如果应用没有安卓系统的根权限,在标准安卓系统中遍历/data目录和/sdcard目录两个目录中的所有文件即可。本步骤和步骤S101是安卓系统查找应用资源文件的方法的最核心步骤。
S103:根据S102中文件的Owner ID与S101中所述UID一致的文件的路径合并出文件的顶层父目录。
步骤S102完成后,应用的全部资源文件都已经找到了。但实际中进行文件复制等操作时,对文件目录进行操作要比对单个文件进行操作方便很多,因此要根据资源文件(即步骤S102中找到的文件的Owner ID与S101中所述UID一致的所有文件)的路径合并出资源文件的顶层父目录。顶层父目录指包括尽可能多的资源文件但不包括非资源文件的父目录。一个应用对应的资源文件有可能形成多个顶层父目录,这些顶层父目录彼此独立、互不包含。顶层父目录一般是应用运行过程中创建的。
S104:舍弃S103中顶层父目录中大小小于设定阈值的顶层父目录。
通常,步骤S103中得到的顶层父目录是应用运行时需要的,但也存在特殊情况。如果顶层父目录过小(即顶层父目录中包含的文件的总大小过小),则顶层父目录中包含的可能是日志文件(log文件)等对应用运行确实没有影响的文件,可以舍弃。可以设定一个阈值,例如1M,如果顶层父目录的大小小于设定的阈值,则舍弃该顶层父目录,上述舍弃行为不会影响应用的正常运行。
步骤S100中涉及的修改代码可以手工完成。代码修改完毕后,在安卓系统中编写专用的程序,可以自动实现安卓系统查找应用资源文件的方法。无论应用的开发者将应用的资源文件存储在什么位置,通过安卓系统查找应用资源文件的方法都可以将资源文件快速、准确的查找出来,包含资源文件的顶层父目录可以在实施安卓系统快速启动应用、免安装运行应用等技术方案时直接使用。
本领域技术人员在以上所描述的具体技术方案的基础上,完全可以构造出其他方案。在此不一一列举。