公开/公告号CN106648638A
专利类型发明专利
公开/公告日2017-05-10
原文格式PDF
申请/专利权人 武汉斗鱼网络科技有限公司;
申请/专利号CN201611129939.3
发明设计人 刘一琛;
申请日2016-12-09
分类号G06F9/44(20060101);G06F9/445(20060101);G06F9/45(20060101);
代理机构武汉智权专利代理事务所(特殊普通合伙);
代理人张凯
地址 430000 湖北省武汉市东湖开发区软件园东路1号软件产业4.1期B1栋11楼
入库时间 2023-06-19 02:06:38
法律状态公告日
法律状态信息
法律状态
2023-08-25
专利权的转移 IPC(主分类):G06F 8/30 专利号:ZL2016111299393 登记生效日:20230810 变更事项:专利权人 变更前权利人:武汉斗鱼网络科技有限公司 变更后权利人:广州魔晶智能科技股份有限公司 变更事项:地址 变更前权利人:430000 湖北省武汉市东湖开发区软件园东路1号软件产业4.1期B1栋11楼 变更后权利人:510000 广东省广州市黄埔区友谊路1号403房(仅限办公)
专利申请权、专利权的转移
2019-08-23
授权
授权
2017-06-06
实质审查的生效 IPC(主分类):G06F9/44 申请日:20161209
实质审查的生效
2017-05-10
公开
公开
技术领域
本发明涉及计算机文件优化技术领域,具体涉及一种基于python的R.java文件的优化方法及优化系统。
背景技术
在安卓开发过程中,随着系统版本的更新与迭代,应用程序的体积会越来越大,出于用户流量费用的考虑,优化应用程序的安装包大小,从而减少用户的流量成为一项亟需解决的技术问题。
目前主流优化应用程序安装包大小的方案有两种,一种是清理无用的so文件。应用程序的安装包中为了兼容性会放入多个处理器架构的so文件,导致应用程序安装包变大,但是其实大多数处理器都只兼容其中一种处理器架构,因而只能使用一种处理器架构的so文件。于是在编译时期将其他处理器的so文件过滤掉,能够减少应用程序安装包的大小。其缺点就是对于没有使用native层接口的应用程序,没有优化的空间。
另外一种方案就是编译混淆,通过混淆器更改文件名为更小的字符。其缺陷是,对于应用中使用了反射相关的类不能进行混淆,不然应用在运行其会找不到该类。
同时,在安卓系统中一个应用的dex文件的支持的方法数的数量有上限,如果超过上限需要将应用拆分成多个dex文件,应用启动时会额外的花时间组合多个dex文件,导致应用的启动变慢。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种基于python的R.java文件的优化方法及优化系统,优化应用程序安装包大小,减少应用程序的dex文件分包数量。
为达到以上目的,本发明采取的技术方案是:一种基于python的R.java文件的优化方法,所述R.java文件用于存储应用程序中java代码源文件调用资源的资源名称和资源值,该方法包括:
步骤S1,创建python字典对象,遍历R.java文件目录,获取全部资源名称和与资源名称对应的资源值并存储于所述python字典对象中;
步骤S2,创建路径列表,获取应用程序中所有的java代码源文件的路径并存储于所述路径列表中;
步骤S3,遍历所述路径列表,通过所述java代码源文件的路径打开对应的java代码源文件,在python字典对象中查找所述java代码源文件调用资源的资源名称对应的资源值,将java代码源文件中的资源名称替换成资源值;
步骤S4,清空R.java文件的内容。
在上述技术方案的基础上,R.java文件的路径在应用程序的安装包名的直接目录下。
在上述技术方案的基础上,所述资源值为常量或变量值。
在上述技术方案的基础上,步骤S1的具体过程包括:
S101,找到R.java文件的目录;
S102,遍历R.java文件的目录,获得其资源的资源名称;
S103,遍历全部资源,获取其资源值;
S104,将资源名称和资源值存储到所述python字典对象中。
在上述技术方案的基础上,遍历R.java文件的目录,获得其资源的资源名称包括:
通过python的open函数打开R.java文件,然后调用python的readline函数遍历R.java文件的每一行,通过python的find函数找出R.java文件下包含资源值的全部资源,通过python的replace函数获得资源的资源名称。
在上述技术方案的基础上,遍历全部资源,获取其资源值包括:
遍历R.java文件下遍历全部资源,调用python的replace函数获得全部资源里包含的资源值。
在上述技术方案的基础上,步骤S2的具体过程包括:
S201,获取应用程序中所有的java代码源文件的目录,扫描出其下所有的子目录和文件;
S202,判断扫描出的文件中哪些是java代码源文件;
S203,将扫描出的文件中的java代码源文件经过的全部目录拼成该java代码源文件的路径,并将该java代码源文件的路径存到路径列表中。
在上述技术方案的基础上,步骤S3的具体过程包括:
S301,遍历所述路径列表,通过python的open函数所述java代码源文件的路径打开对应的java代码源文件,
S302,然后在python字典对象中查找所述java代码源文件调用资源的资源名称对应的资源值
S303,使用python的replace函数将java代码源文件中的资源名称替换成资源值。
在上述技术方案的基础上,步骤S4的具体过程包括:通过python的open函数打开R.java文件,然后调用python的replace函数将R.java文件中所有内容替换为空。
本发明还公开了一种基于python的R.java文件的优化系统,包括:
资源值获取模块,用于创建python字典对象,遍历R.java文件目录,获取全部资源名称和与资源名称对应的资源值并存储于所述python字典对象中;
路径列表模块,用于创建路径列表,获取应用程序中所有的java代码源文件的路径并存储于所述路径列表中;
替换模块,用于遍历所述路径列表,通过所述java代码源文件的路径打开对应的java代码源文件,在python字典对象中查找所述java代码源文件调用资源的资源名称对应的资源值,将java代码源文件中的资源名称替换成资源值;
清空模块,用于清空R.java文件。
与现有技术相比,本发明的优点在于:
(1)本发明将java代码源文件引用的资源替换成R.java文件中保存的资源名称对应的资源值,从而可以清空R.java文件的内容,实现优化应用程序安装包大小。
(2)由于清空了R.java文件的内容,有效减少了dex文件的成员数量,从而减少应用程序的dex文件分包数量。
附图说明
图1为本发明实施例中一种基于python的R.java文件的优化方法的流程示意图;
图2为本发明实施例中一种基于python的R.java文件的优化方法的步骤S1流程示意图;
图3为本发明实施例中一种基于python的R.java文件的优化方法的步骤S2流程示意图;
图4为本发明实施例中一种基于python的R.java文件的优化方法的步骤S3流程示意图;
图5为本发明实施例中一种基于python的R.java文件的优化系统的结构示意图。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
参见图1所示,本发明实施例提供一种基于python的R.java文件的优化方法:所述R.java文件用于存储应用程序中java代码源文件调用资源的资源名称和资源值,该方法包括:
步骤S1,创建python字典对象,遍历R.java文件目录,获取全部资源名称和与资源名称对应的资源值并存储于所述python字典对象中;
步骤S2,创建路径列表,获取应用程序中所有的java代码源文件的路径并存储于所述路径列表中;
步骤S3,遍历所述路径列表,通过所述java代码源文件的路径打开对应的java代码源文件,在python字典对象中查找所述java代码源文件调用资源的资源名称对应的资源值,将java代码源文件中的资源名称替换成资源值;
步骤S4,清空R.java文件的内容。
所述资源值为常量或变量值。
参见图2所示,步骤S1的具体过程包括:
S101,找到R.java文件的目录;
R.java文件的路径在应用程序的安装包名的直接目录下。例如,一个应用的包名是com.adc.xxx,其R.java文件在应用目录路径为com/adc/xxx/R.java,所以R.JAVA文件路径格式就是pkg/R.java,在所有android应用中R.java文件所生成的位置固定,应用程序的安装包名的直接目录下。这里定位好后为后续优化做准备。
S102,遍历R.java文件的目录,获得其资源的资源名称;
S103,遍历全部资源,获取其资源值;
S104,将资源名称和资源值存储到所述python字典对象中。
遍历R.java文件的目录,获得其资源的资源名称包括:
通过python的open函数打开R.java文件,然后调用python的read line函数遍历R.java文件的每一行,通过python的find函数找出R.java文件下包含资源值的全部资源,通过python的replace函数获得资源的资源名称。
例如,首先通过python的open函数打开R.JAVA文件,参数就是1中的R.java文件路径,然后调用python的readline函数遍历R.java文件的每一行,R.java文件下内部类声明前缀是“publicstaticfinalclass”,比如drawabe类的声明就是“publicstaticfinalclassdrawabe”,当读取每一行时先通过python的find函数判断当前行是否包含字符串“publicstaticfinalclass”,当包含表明此处有一个内部类,然后通过replace函数将将“publicstaticfinalclass”替换成空值,再次调用replace函数将“{”字符置为空“{”是java类的语法字符用来包裹java类的数据体,当替换完成后所得的字符串就是该资源的类名。
遍历全部资源,获取其资源值包括:
遍历R.java文件下遍历全部资源,调用python的replace函数获得全部资源里包含的资源值。
例如,当接下来字符串前缀是“public static final int”或者是“publicstatic int”表示是drawabe下的资源常量和变量,同样调用python的replace函数将“public static final int”或者“public static int”替换成空字符串,然后得到一个等于格式的字符串,比如前面的a常量在drawabe静态内部类下的声明是“public staticfinal int a=1”,那么前面方法将得到字符串“a=1”,然后调用python的split函数将“a=1”以字符“=”拆分,得到2个子串“a”和“1”,其中a就是成员名(这里可以命名为fieldname),当前资源的全称就是R.classname.Fieldname,1就是资源值。然后将资源的全称作为python字典对象的key,资源值(前面例子的1)作为字典的值添加到字典中。
参见图3所示,步骤S2的具体过程包括:
S201,获取应用程序中所有的java代码源文件的目录,扫描出其下所有的子目录和文件;
S202,判断扫描出的文件中哪些是java代码源文件;
S203,将扫描出的文件中的java代码源文件经过的全部目录拼成该java代码源文件的路径,并将该java代码源文件的路径存到路径列表中。
例如,首先通过外部传入java代码源文件的目录,然后通过python的os.listdir函数扫描出其下所有的文件或者目录,当其下是目录时,需要递归查询,直到找到其所有子目录下的文件,os.listdir返回的就是一个子文件或者目录名,所以需要通过python的os.path.join函数将目录和文件名拼接成一个完整的文件或者目录的绝对路径,然后调用python提供的os.path.isdir函数判断该路径是否是目录,是目录就递归,当读取到是文件时,还需要判断该文件是否以.java文件为后缀,因为java源文件目录下不能保证全部就是纯java文件,判断后缀可以使用python的os.path.splitext函数,该方法返回一个文件名和后缀名的数组,所以数组的偏移为0就是不带后缀的文件名,偏移为1就是该文件的后缀,然后通过后缀比较,如果是.java就表明是需要读取的文件.最后将遍历得到的所有java代码源文件存到一个路径列表中。这里是为了获取所有可能使用R.java文件中资源常量和变量的类,将其统计,后续进行批量替换。
参见图4所示,步骤S3的具体过程包括:
S301,遍历所述路径列表,通过python的open函数所述java代码源文件的路径打开对应的java代码源文件;
S302,然后在python字典对象中查找所述java代码源文件调用资源的资源名称对应的资源值;
S303,使用python的replace函数将java代码源文件中的资源名称替换成资源值。
例如,遍历路径列表,获取其保存的java代码源文件路径,通过open函数将其打开,然后对每个java代码源文件进行遍历python字典对象,通过调用python的replace函数将资源名成其真实的常量或者变量值,比如resdict中存储了资源对<R.drawabe.a,1>,当一个java文件b.java中查找到R.drawabe.a时,将R.drawabe.a替换成1依次轮训遍历,直到将所有的java代码源文件中资源的引用全部替换为止。当资源id全部替换完成后,其实R.java文件已经没有什么作用了,为接下来清空R.java文件做准备。这里是直接替换掉所有使用到的R中的资源,从而减少对R.java文件的依赖。
步骤S4的具体过程包括:通过python的open函数打开R.java文件,然后调用python的replace函数将R.java文件中所有内容替换为空。
虽然R.java文件中的变量与常量已经没有用处,R.java文件也没有用途,但是这里并不能直接对其进行删除,因为有些java代码源文件可能存在引用了R.java文件如果删除就会导致项目无法编译通过,这里可以直接对R.java文件进行清空操作,使其成一个空实现,没有任何的内容,这里直接通过python的open的函数对其进行打开,然后调用replace函数将所有内容替换成字符串“public static final class R{}”就行。从而完全去掉R.java文件所消耗的大小当外部已经没有使用R.java文件的资源后,R.java文件已经没有作用,所以直接作为空类的实现只是为了保持兼容性。
参见图5所示,本发明还公开了一种基于python的R.java文件的优化系统,包括:
资源值获取模块,用于创建python字典对象,遍历R.java文件目录,获取全部资源名称和与资源名称对应的资源值并存储于所述python字典对象中;
路径列表模块,用于创建路径列表,获取应用程序中所有的java代码源文件的路径并存储于所述路径列表中;
替换模块,用于遍历所述路径列表,通过所述java代码源文件的路径打开对应的java代码源文件,在python字典对象中查找所述java代码源文件调用资源的资源名称对应的资源值,将java代码源文件中的资源名称替换成资源值;
清空模块,用于清空R.java文件。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
机译: 基于位置的服务优化系统,基于位置的服务优化方法
机译: 卫星系统的至少一种性能的优化方法,卫星系统的优化装置,卫星接收机和卫星系统
机译: 基于本体的系统优化方法,包括将动态依赖于应用程序的相关性分配给本体元素,并利用相关性来确定基于本体的系统使用部分本体的优先级