基于虚拟文件系统数据智能预取的安卓应用加载优化方法转让专利

申请号 : CN202211661277.X

文献号 : CN115640078B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 温研晏华

申请人 : 北京麟卓信息科技有限公司

摘要 :

本发明涉及一种基于虚拟文件系统数据智能预取的安卓应用加载优化方法,为app的APK文件appAPK创建格式为Squashfs的虚拟文件系统,包括:查找是否存在app的APK文件对应的文件系统元数据文件appAPK.fsinfo,如不存在,则为app的APK构造创建所需的元数据;对安卓框架进行修改,包括:修改APK文件的加载流程,包括:根据appAPK查找对应的能够预加载的文件集;对于APK文件打开操作,判断是否是能够预加载的文件;对于APK文件读操作,判断读的文件是否在可预加载的文件中,如果在,则从内存或者从内存映射文件中读取文件;如不在,则修改读取文件的路径为对资源相关文件的读操作。本发明提升了APK的加载速度,减少了APK文件的读取次数。

权利要求 :

1.一种基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,包括对安卓框架进行修改以及为app的APK文件appAPK创建格式为Squashfs的虚拟文件系统;

为app的APK文件appAPK创建格式为Squashfs的虚拟文件系统,包括:

查找是否存在app的APK文件对应的文件系统元数据文件appAPK.fsinfo,如不存在,则为app的APK文件构造元数据;从appAPK.fsinfo中读取元数据,并在内存中构造Squashfs创建虚拟卷所需的数据结构fsMetaInfo,将元数据填入fsMetaInfo,并将fsMetaInfo和appAPK全路径名传递给Squashfs虚拟文件系统的内核模块;

Squashfs虚拟文件系统的内核模块加载fsMetaInfo,并将appAPK映射到操作系统内核地址空间appAPKMappedAddress,以创建虚拟卷;

将创建的虚拟卷使得用户态应用程序可见;

对安卓框架进行修改,包括:

修改APK文件的加载流程,包括:根据appAPK查找对应的能够预加载的文件集filesToPreloaded,查找到后,读取filesToPreloaded中的所有文件,并判断各文件的大小,如文件大于第一阈值,则将文件读取进内存,并将文件名和内存地址保存进filePreloadedList;如文件小于等于第一阈值,则将文件内容映射到内存,并将文件名和映射后的内存地址保存进filePreloadedList;

对于APK文件打开操作,记文件路径为pathInAPK,判断当前打开的文件是否在filePreloadedList中,如果在,则返回filePreloadedList中的对应文件的句柄;如果不在,则修改打开文件的路径为对文件的打开,新的打开文件路径为虚拟卷的全路径拼接上pathInAPK;

判断打开文件的大小,如打开文件大小小于第二阈值,则认为是能够预加载的文件,将该能够预加载的文件的路径名加入filesToPreloaded。

2.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,为app的APK构造元数据,具体包括:A.基于app的APK创建一个Squashfs的文件系统映像,含有元数据和APK文件,记为appAPK.img;

B.通知Squashfs内核模块基于appAPK.img创建虚拟卷;

C.从Squashfs内核模块中读取虚拟卷的元数据所在数据结构fsMetaInfo;

D.通过Zip文件解析库解析appAPK,读取其中未压缩的块,构建压缩块的Bitmap表,记为uncompressedBitmapTable,uncompressedBitmapTable中一个bit位代表一个文件数据块,通过bit位表示是否为压缩的块,uncompressedBitmapTable作为fsMetaInfo的一部分,保存到fsMetaInfo的尾部;

E.将fsMetaInfo以二进制形式,保存为appAPK.fsinfo。

3.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,基于fsMetaInfo的信息创建虚拟卷,将超级块设置为appAPKMappedAddress+超级块的偏移Offset,将第一个数据块设置为appAPKMappedAddress+第一个数据块的Offset。

4.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,将创建的虚拟卷通过mount方式到Linux文件系统,使得用户态的应用程序可见。

5.如权利要求2所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,还包括:修改Squashfs的数据块的读取操作:(1)根据uncompressedBitmapTable中的bit位,判断待读取的数据块是否被压缩;

如是被压缩,则判断当前待读取的数据块是否在Squashfs文件系统的readCache中;如在readCache中,则返回readCache中缓存的数据块;如不在readCache中,则读取此数据块的前后两个数据块并加入readCache;继续执行(2);

如不是被压缩,则继续执行(2);

(2)执行后续的Squashfs标准的读取操作。

6.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,根据appAPK查找对应的能够预加载的文件集filesToPreloaded,查找到后,并行读取filesToPreloaded中的所有文件,并行数为当前处理器逻辑核数的一半。

7.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,该第一阈值为30M,该第二阈值为50M。

8.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,对安卓框架进行修改还包括:对于APK文件读操作,判断读的文件是否在filePreloadedList中,如果在,则从内存或者从内存映射文件中读取文件;如不在,则修改读取文件的路径为对资源相关文件的读操作。

9.如权利要求2所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,uncompressedBitmapTable中一个bit位代表一个文件数据块,bit位为1表示未压缩,bit位为0表示已压缩,文件数据块大小记为blockSize,默认大小为128K。

10.如权利要求1所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其特征在于,Squashfs虚拟文件系统的内核模块加载fsMetaInfo,将appAPK通过文件内存映射到操作系统内核地址空间appAPKMappedAddress,并根据fsMetaInfo的信息创建虚拟卷。

说明书 :

基于虚拟文件系统数据智能预取的安卓应用加载优化方法

技术领域

[0001] 本发明涉及安卓应用加载技术,特别涉及一种基于虚拟文件系统数据智能预取的安卓应用加载优化方法。

背景技术

[0002] Squashfs是Linux下的一种只读压缩文件系统类型,使用zlib/lzo/xz等压缩算法来压缩文件、节点及目录。节点和目录数据是字节对齐并且是高度紧凑的。每个压缩的节点平均仅占用8字节长度(确切长度会因为文件类型而不同,比如普通文件、目录、符号链接及块/字符设备节点等)。
[0003] Squashfs作为一种只读文件,一般用mksquashfs工具来创建压缩的Squashfs文件系统。
[0004] Squashfs 文件系统最多包含以下几种字节对齐的模块,如下:
[0005]
[0006] 压缩的数据块就像从某个目录里读文件一样写到文件系统并进行冗余检查。当文件数据被写入到文件系统,相应的 completed inode, directory, fragment, export, uid/gid lookup 和xattr tables也会同时被写入到文件系统里面。
[0007] Squashfs的块是以压缩形式存在的,为了避免重复解压最近访问过的数据Squashfs的使用两个小的元数据和片段高速缓存。这种缓存并不用于那些压缩并在页高速缓存里通过正常方式缓存的数据块,而是用于临时缓存作为一个元数据的结果读取的片段和元数据块(即inode或目录)或片段连接。因为元数据和片段会被一起打包成块(以获得更大的压缩),读取特定的元数据或片段导致其他元数据检索被挤满。临时缓存确保它们可在不久的将来不需要额外的读解压缩的情况下被访问。
[0008] 而一个安卓应用(包括服务)启动时首先要做的就是加载和解析其对应的APK(Zip格式)文件,一个应用的代码(Java二进制代码和各种动态库)和各种资源文件都来自这个APK文件。
[0009] 当前安卓系统对APK文件的处理方式就是每次访问的时候都需要使用Zip库去重新读取相关数据。比如,启动时读取相关数据(如manifest文件等),后面需要加载相关资源(asset)时又会重新读取相关文件。每次访问APK文件都会从磁盘上的APK文件读取一次Zip格式的元数据(解析Zip文件的目录结构),涉及磁盘文件读写和文件块的解压缩。

发明内容

[0010] 本发明的目的在于提供一种基于虚拟文件系统数据智能预取的安卓应用加载优化方法,用于解决安卓系统APK文件加载速度慢的问题。
[0011] 本发明一种基于虚拟文件系统数据智能预取的安卓应用加载优化方法,其中,包括对安卓框架进行修改以及为app的APK文件appAPK创建格式为Squashfs的虚拟文件系统;为app的APK文件appAPK创建格式为Squashfs的虚拟文件系统,包括:查找是否存在app的APK文件对应的文件系统元数据文件appAPK.fsinfo,如不存在,则为app的APK文件构造元数据;从appAPK.fsinfo中读取元数据,并在内存中构造Squashfs创建虚拟卷所需的数据结构fsMetaInfo,将元数据填入fsMetaInfo,并将fsMetaInfo和appAPK全路径名传递给Squashfs虚拟文件系统的内核模块;Squashfs虚拟文件系统的内核模块加载fsMetaInfo,并将appAPK映射到操作系统内核地址空间appAPKMappedAddress,以创建虚拟卷;将创建的虚拟卷使得用户态应用程序可见;对安卓框架进行修改,包括:修改APK文件的加载流程,包括:根据appAPK查找对应的能够预加载的文件集filesToPreloaded,查找到后,读取filesToPreloaded中的所有文件,并判断各文件的大小,如文件大于第一阈值,则将文件读取进内存,并将文件名和内存地址保存进filePreloadedList;如文件小于等于第一阈值,则将文件内容映射到内存,并将文件名和映射后的内存地址保存进filePreloadedList;对于APK文件打开操作,记文件路径为pathInAPK,判断当前打开的文件是否在
filePreloadedList中,如果在,则返回filePreloadedList中的对应文件的句柄;如果不在,则修改打开文件的路径为对文件的打开,新的打开文件路径为虚拟卷的全路径拼接上pathInAPK;判断打开文件的大小,如打开文件大小小于第二阈值,则认为是能够预加载的文件,将该能够预加载的文件的路径名加入filesToPreloaded。
[0012] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,为app的APK构造元数据,具体包括:A.基于app的APK创建一个Squashfs的文件系统映像,含有元数据和APK文件,记为appAPK.img;B.通知Squashfs内核模块基于appAPK.img创建虚拟卷;C.从Squashfs内核模块中读取虚拟卷的元数据所在数据结构fsMetaInfo;D.通过Zip文件解析库解析appAPK,读取其中未压缩的块,构建压缩块的Bitmap表,记为uncompressedBitmapTable,uncompressedBitmapTable中一个bit位代表一个文件数据块,通过bit位表示是否为压缩的块,uncompressedBitmapTable作为fsMetaInfo的一部分,保存到fsMetaInfo的尾部;E.将fsMetaInfo以二进制形式,保存为appAPK.fsinfo。
[0013] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,基于fsMetaInfo的信息创建虚拟卷,将超级块设置为appAPKMappedAddress+超级块的偏移Offset,将第一个数据块设置为
appAPKMappedAddress+第一个数据块的Offset。
[0014] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,将创建的虚拟卷通过mount方式到Linux文件系统,使得用户态的应用程序可见。
[0015] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,还包括:修改Squashfs的数据块的读取操作:(1)根据uncompressedBitmapTable中的bit位,判断待读取的数据块是否被压缩;如是被压缩,则判断当前待读取的数据块是否在Squashfs文件系统的readCache中;如在readCache中,则返回readCache中缓存的数据块;如不在readCache中,则读取此数据块的前后两个数据块并加入readCache;继续执行(2);如不是被压缩,则继续执行(2);(2)执行后续的Squashfs标准的读取操作。
[0016] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,根据appAPK查找对应的能够预加载的文件集filesToPreloaded,查找到后,并行读取filesToPreloaded中的所有文件,并行数为当前处理器逻辑核数的一半。
[0017] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,该第一阈值为30M,该第二阈值为50M。
[0018] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,对安卓框架进行修改还包括:对于APK文件读操作,判断读的文件是否在filePreloadedList中,如果在,则从内存或者从内存映射文件中读取文件;如不在,则修改读取文件的路径为对资源相关文件的读操作。
[0019] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,uncompressedBitmapTable中一个bit位代表一个文件数据块,bit位为1表示未压缩,bit位为0表示已压缩,文件数据块大小记为blockSize,默认大小为128K。
[0020] 根据本发明所述的基于虚拟文件系统数据智能预取的安卓应用加载优化方法的一实施例,其中,Squashfs虚拟文件系统的内核模块加载fsMetaInfo,将appAPK通过文件内存映射到操作系统内核地址空间appAPKMappedAddress,并根据fsMetaInfo的信息创建虚拟卷。
[0021] 本发明通过学习一个APK启动时读取/加载APK内文件的规律,预先加载那些如果加载慢会影响启动速度的文件。将APK包装成一个文件系统可识别的虚拟卷(Volume,相当于Windows的分区),避免了每次读取APK内的文件时都需要做解压操作。提高了安卓系统的APK文件加载速度。

附图说明

[0022] 无。

具体实施方式

[0023] 为使本发明的目的、内容、和优点更加清楚,下面结合实施例,对本发明的具体实施方式作进一步详细描述。
[0024] 本发明一种基于虚拟文件系统数据智能预取的安卓应用加载优化方法,包括:
[0025] 步骤1.为应用的APK文件(记为appAPK)创建格式为Squashfs的虚拟文件系统;
[0026] 在指定位置或相应位置查找app的APK对应的文件系统元数据文件appAPK.fsinfo,判断是否存在APK对应的文件系统元数据文件,
[0027] 如不存在APK对应的文件系统元数据文件,则为app的APK构造创建虚拟卷所需的元数据,
[0028] 如存在APK对应的文件系统元数据文件appAPK.fsinfo或构造后,从appAPK.fsinfo中读取元信息,并在内存中直接构造Squashfs创建新虚拟卷(Volume,Windows上叫分区)所需数据结构,将元数据填入这个数据结构fsMetaInfo,将此数据结构fsMetaInfo和appAPK文件全路径名传递给Squashfs文件系统内核模块。
[0029] 其中,上述的app的APK构造创建所需的元数据具体可以包括:
[0030] A.基于app的APK创建一个Squashfs的文件系统映像,含有元数据和APK件,记为appAPK.img;
[0031] B.通知Squashfs内核模块基于appAPK.img创建虚拟卷;
[0032] C.从Squashfs内核模块中读取虚拟卷的元数据所在数据结构,记为fsMetaInfo。元数据可以包括超级块、数据块、索引节点表、目录表、文件扩展属性表等;
[0033] D.通过Zip文件解析库(如zlib)解析appAPK,读取其中未压缩的块,构建压缩块的Bitmap表,记为uncompressedBitmapTable,这个Bitmap表中一个bit位代表一个文件数据块,文件数据块大小记为blockSize,默认大小为128K(具体可以根据需要调整),bit位为1表示未压缩,为0表示已压缩。并将Bitmap表uncompressedBitmapTable作为fsMetaInfo的一部分,保存到fsMetaInfo的尾部;
[0034] D.将fsMetaInfo以二进制形式,在指定路径下保存为appAPK.fsinfo。
[0035] 步骤2.通过修改后的Squashfs文件系统内核模块直接加载fsMetaInfo并将appAPK通过文件内存映射到操作系统内核地址空间(空间中的地址记为appAPKMappedAddress),基于fsMetaInfo提供的信息直接创建虚拟卷,并将超级块设置为(appAPKMappedAddress+超级块的偏移Offset),将第一个数据块设置为
(appAPKMappedAddress+第一个数据块的Offset),
[0036] 将创建的虚拟卷mount到Linux文件系统,使得用户态应用程序可见。
[0037] 对于一实施例,还修改安卓框架,具体方法包括:
[0038] 1.修改APK文件的加载流程(LoadedApk::LoadApkFromPath),以实现数据预加载,包括:
[0039] 根据appAPK查找对应的可以预加载的文件集filesToPreloaded是否存在,如存在,则并行读取filesToPreloaded中的所有文件,其中并行数可以为当前处理器逻辑核数的一半,读取的具体过程可以包括:
[0040] 判断读取filesToPreloaded中的文件大小,如该文件大小小于等于30M(或者可以选择其他阈值),则直接将所有内容读取进内存,并将文件名和内存地址保存进filePreloadedList;
[0041] 如该文件大小大于30M(或者可以选择其他阈值),则将文件内容映射到内存(内存映射文件),并将文件名和映射后的内存地址保存进filePreloadedList;
[0042] 2.修改安卓框架中的操作APK内文件的打开和读函数,如资源的文件的打开和读取等:
[0043] (1)修改安卓框架中的操作APK文件的打开函数包括:
[0044] 对于打开操作,记文件路径为pathInAPK,判断当前打开的文件是否在filePreloadedList中,
[0045] 如在filePreloadedList中,则返回filePreloadedList中的对应文件的句柄,作为打开函数的返回值;
[0046] 如不在,则修改打开文件的路径为直接对文件的打开,即作为一个普通文件,路径就是虚拟卷的全路径拼接上pathInAPK,作为新的打开文件路径,而不是调用Zip库打开APK内的文件。如此打开文件大小小于50M(或者选择其他阈值),则认为是可以预加载的文件,将此文件的路径名加入filesToPreloaded。
[0047] (2)修改安卓框架中的操作APK内文件的读函数,包括:
[0048] 判断读的文件是否在filePreloadedList中:
[0049] 如果在,则直接从内存或者从内存映射文件中读取文件;
[0050] 如果不在,则修改读取文件的路径为直接对相关资源文件asset的读操作,但不会有对于APK的写操作,不调用Zip库读取APK内的文件。
[0051] 对于一实施例,修改Squashfs文件系统内核模块,优化读操作,包括:
[0052] (1)修改Squashfs的数据块(block)读取函数,具体包括:
[0053] 执行Squashfs标准操作,如参数预处理等的操作;
[0054] 根据uncompressedBitmapTable中的bit位,判断待读取的block是否是被压缩的块,
[0055] 如是被压缩的块,则进一步判断当前块是否在Squashfs文件系统的readCache中,如在readCache中,则直接返回readCache中缓存的数据块block,并从此数据块block读取函数返回;如不在readCache中,则直接从文件读取此block的前后两个block并加入readCache;继续执行(2);
[0056] 如不是被压缩的块,则继续执行(2);
[0057] (2)执行后续的Squashfs标准的block读取操作。
[0058] 本发明通过学习一个APK启动时读取/加载APK内文件的规律,预先加载那些如果加载慢会影响启动速度的文件。将APK包装成一个文件系统可识别的虚拟卷(Volume,相当于Windows的分区),避免了每次读取APK内的文件时都需要做解压操作。提升了APK的加载速度,减少了APK文件的读取次数。
[0059] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。