CN103034486B - 移动终端操作系统基于全系统扩展调用图的自动优化方法 - Google Patents

移动终端操作系统基于全系统扩展调用图的自动优化方法 Download PDF

Info

Publication number
CN103034486B
CN103034486B CN201210495453.7A CN201210495453A CN103034486B CN 103034486 B CN103034486 B CN 103034486B CN 201210495453 A CN201210495453 A CN 201210495453A CN 103034486 B CN103034486 B CN 103034486B
Authority
CN
China
Prior art keywords
file destination
node
entity
mobile terminal
collection
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201210495453.7A
Other languages
English (en)
Other versions
CN103034486A (zh
Inventor
董渊
王生原
李叠
骆欢
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tsinghua University
Original Assignee
Tsinghua University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tsinghua University filed Critical Tsinghua University
Priority to CN201210495453.7A priority Critical patent/CN103034486B/zh
Publication of CN103034486A publication Critical patent/CN103034486A/zh
Application granted granted Critical
Publication of CN103034486B publication Critical patent/CN103034486B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

一种移动终端操作系统基于全系统扩展调用图的自动优化方法,涉及移动终端软件领域,所述方法适用于移动终端操作系统,可以实现在全系统范围内消除无用代码,在不降低系统性能的前提下减小系统代码体积,从而减少移动终端硬件制造成本。方法的主要步骤如下:编译源代码得到目标文件;从目标文件出发,构建全系统所有本地代码的扩展调用图;对扩展调用图进行分析,从入口点开始得到扩展调用图的有效子图;对编译生成的目标文件进行重写,删除所有不在有效子图中的代码;链接生成优化的二进制代码。本发明具有应用范围广、自动化程度高、使用方便、优化效果明显等特点。

Description

移动终端操作系统基于全系统扩展调用图的自动优化方法
技术领域
本发明涉及移动通信领域,特别涉及一种移动终端操作系统基于全系统扩展调用图的自动优化方法。
背景技术
在中国,互联网和移动设备的发展相互影响,形成强大的普及浪潮。以智能手机、上网本为代表的移动终端在激烈的竞争中迅猛发展。根据中国互联信息网络中心(CNNIC)第29次互联网调查报告称,截止2011年12月底,中国有5.13亿互联网用户,其中手机上网用户3.56亿,占网民总体的近69.4%。
以安卓(Android)系统为代表的移动终端开源操作系统的使用比例和影响能力在不断扩大。GARTNER公司的报告显示,在2011年的第四季度,Android是全球使用最广泛的智能手机操作系统,在全球智能手机中的市场占有率约50%。
Android系统一开始就是用开源、开放的开发方式,受到业界和学术界的广泛关注,自从发布以来,Android的版本基本上每半年一个台阶地向前发展。其平台的开放性也吸引了大量的第三方开发者进行应用程序开发,Android Market上的应用程序数量从2009年12月的1.6万迅速增长到2012年上半年的50万。
随着近年移动设备和相关软件的迅速发展,移动设备上的操作系统和应用程序的复杂性、程序体积都比几年前大幅提高,这也就对移动操作系统的优化提出了很多新的需求。
在这些快速发展中,有相当数量原来用于桌面和服务器系统的组件仅作少量移植后就用于移动操作系统上,例如Android系统自身就使用了一百余个外来的开源软件代码,它们既包括最底层的Linux内核,也包括上层的WebKit浏览器引擎等。这些组件并非专门针对移动操作系统所编写,移植到移动操作系统以后往往还存在优化空间,但如果对它们一一进行手工优化将耗费大量人力物力资源。因此发明一种能自动进行全系统优化的方法非常有必要。
Android系统分为四层,从上到下依次为:
·应用程序:使用Java语言编写,可通过Java本地接口(JNI)调用本地代码。
·应用程序框架:使用Java、C、C++编写,向应用程序提供活动管理器、窗口管理器等服务。
·系统库和Android运行时环境:使用C/C++以及少量汇编编写,为应用程序和应用程序框架提供必要的与系统交互的接口。
·Linux内核:操作系统内核,使用为Android修改过的Linux内核。
整个Android系统(Android-x86,20120215版本)包含2270万行代码,包括C、C++、Java以及其他语言。除了Linux内核以外,系统中共有950万行本地代码(C、C++及少量汇编)。
Android系统基于Linux内核,但并没有使用其他Linux系统常用的GNU libc(服务器、桌面Linux系统常用)或uClibc(基于Linux的嵌入式系统常用),而是使用了专有的C库,称为Bionic。Bionic库的部分代码衍生自BSD,部分专门为Android编写,并针对Android系统作了优化和精简,删除了Android不需要的功能。优化后的Bionic库的代码体积显著减小,在x86平台上仅有GNU libc的26%,uClibc的62%。
从Bionic的例子可以看出,通用的代码在被用于特定的系统时会有比较大的优化空间。据此可以推测:Android上的其他组件也会有优化的空间,尤其是那些原本为服务器和桌面系统编写的组件。由于工作量的关系,Android没有也不可能为系统中的每一个组件都人工进行如此细致的优化。本发明通过一种自动进行全系统优化的方法解决了这个问题。
本发明给出移动终端操作系统基于全系统扩展调用图的自动优化方法,从全系统编译后的目标文件中读取信息,基于这些信息构建全系统的扩展调用图,进一步找出扩展调用图中的有效子图,根据有效子图对目标文件进行二进制重写后,链接生成优化后的可执行文件和动态库文件。本发明使用自动的方法进行全系统分析和优化,不影响系统的源代码,优化过程不需人工干预,优化后的系统体积减小,性能有所提升,具有重要的实际意义和应用价值。
发明内容
本发明使用程序分析技术,设计出一种移动终端操作系统基于全系统扩展调用图的自动优化方法,方法针对目前广泛采用的移动终端操作系统中的软件优化问题,给出自动优化的方法。以Android系统为例,要求考虑除了底层Linux内核以外的所有本地代码,对它们进行自动优化,在确保优化后的系统正确性不受影响的前提下,消除无用代码,减小代码体积,提升系统性能。
本发明的特征在于,是在计算机中依次按以下步骤实现的:
步骤(1):编译移动终端操作系统的源代码,生成可重定位的目标文件;
从源代码服务器中下载源代码,修改相关的Makefile,向CFLAGS添加“-ffunction-sections”参数和“-fdata-sections”参数以使编译器将每个函数和数据对象编译到单独的段中,再运行make命令自动编译所述源代码生成可重定位的目标文件,其中函数和数据对象统称为“实体”,所述数据对象既包括源代码中定义的全局和静态变量,也至少包括虚函数表在内的编译器生成的数据对象;
步骤(2):按以下步骤构造有向的全系统扩展调用图:
步骤(2.1):对步骤(1)得到的目标文件,读取以下信息,其中包括SS、GS、AF和AU:
SS,所述目标文件中所有包含有所述实体的段的名称集合,
GS,所述目标文件中定义的所有全局符号及其名称,并以关联表的形式存储,以便从全局符号的名称迅速查找所在的段的名称,
AF,头和尾都属于同一个所述目标文件的有向边形成的集合,
AU,头属于一个所述目标文件,尾为暂未解析的符号的有向边,其中每一个元素表示为(u,sym),其中u属于SS,是所述目标文件中的一个所述实体,sym为一个外部符号的名,表示被实体u引用,但不在同一个所述目标文件中定义的实体,
步骤(2.2),根据步骤(2.1)中所得到的信息,合并为一个系统全局的有向图,从而得到所述扩展调用图的V和E,其中:
V为所有所述目标文件SS的并集,是一个结点集,其中每一个结点的名称用所对应的一个二元组表示,其中包括目标文件名和段名,
E为有向边集,它包括两部分:E=E1∪E2,其中E1为所有所述目标文件的AF的并集,代表了头和尾都属于同一个所述目标文件的有向边所形成的集合,E2为头和尾属于不同的所述目标文件的有向边形成的集合,按以下方法得到:首先,令再遍历每个所述目标文件的AU集合,对其中的每一个元素(u,sym),查找所有所述目标文件的GS集,得到所有名称为sym的全局符号的所述实体集合S[sym],将所有二元组(u,v)|v∈S[sym]加入集合E2,并将E1与E2取并集得到E,其中每一个元素是一对结点(u,v),对应所述系统扩展调用图中一条从u到v的有向边,当且仅当u的重定位数据中有相对v的重定位记录时,在所述系统扩展调用图中存在一条从u到v的边,
步骤(2.3),按以下步骤得到入口点集R:
步骤(2.3.1),令
步骤(2.3.2),把同程序启动代码对应的所述实体作为一个结点加入所述入口点集R,在Android中_start符号所对应的实体即为程序启动代码,
步骤(2.3.3),把可能通过动态绑定使用的所述实体作为一个结点加入所述入口点集R,
步骤(2.3.4),把位于不以.text、.data、.rodata、.bss打头的段中的所述实体作为一个结点加入所述入口点集R,
步骤(2.4),从步骤(2.1)至步骤(2.3)得到的V、E、R表示为一个所述的系统调用图G=(V,E,R);
步骤(3),按以下步骤从步骤(2)得到的所述系统扩展调用图G中得到有效子图Gs=(Vs,Es,R),其中Vs为有效结点集,Es为有效的有向边集,表示为:
V s = ∪ u ∈ R Desc ( u )
Es=E∩(Vs×Vs)
其中Desc(u)表示u在扩展调用图G中包括u自身在内的子孙结点的集合,
步骤(3.1),令Vs=R,Q=R表示待访问的结点集,表示已访问的结点集,
步骤(3.2),从待访问的结点集Q中任取一个结点u加入VisitedV,再把结点u在所述系统扩展调用图G中的所有直接后继结点加入所述Vs中,把述结点u的不属于所述已访问过的结点集VisitedV的直接后继结点加入待访问的结点集Q中,并从所述待访问的结点集Q中删除访问过的结点u,
步骤(3.3),重复步骤(3.2),直到所述待访问的结点集Q为空,得到有效结点集Vs
步骤(3.4),令Es为空集,遍历E中的所有有向边(u,v),若结点u和结点v都属于所述有效结点集Vs,把从所述结点u到所述结点v的有向边加入Es
步骤(3.5),根据步骤(2)及步骤(3.1)至步骤(3.4)的结果得到有效子图Gs=(Vs,Es,R);
步骤(4),按以下步骤重写所述目标文件,更新时间戳:
步骤(4.1),每一个所述目标文件中的实体都带有一个可见性属性,包括默认default、受保护protected、内部internal、隐藏hidden四种,对每一个不属于有效结点集Vs的实体,若其可见性属性为默认default,则改为隐藏hidden,
步骤(4.2),对每一个所述不属于有效结点集Vs的实体,清除其重定位数据,
步骤(4.3),遍历所述目标文件的符号表,清除不再被任何段引用的符号,
步骤(4.4),根据步骤(4.1)至(4.3)的结果,对所述目标文件进行二进制重写,对于有修改的所述目标文件,其时间戳被自动更新,
步骤(5),按以下步骤链接得到优化化的Android镜像文件:
在所述Makefile中添加用于链接时对段进行垃圾收集的链接选项“--gc-sections”,运行make命令,自动重新链接生成优化后的可执行文件、动态库文件并生成相应的Android镜像文件。
附图说明
图1示出根据本发明进行移动终端操作系统基于全系统扩展调用图的自动优化方法的流程示意图。
具体实施方式
本发明所述方法采取以下步骤进行:
步骤(1),编译移动终端操作系统的源代码。这一步将生成可重定位的目标文件(.o)。在编译前应先修改相关Makefile,向CFLAGS添加“-ffunction-sections”和“-fdata-sections”参数,使编译器将每个函数和数据对象(数据对象既包括源代码中定义的全局和静态变量,也包括虚函数表等由编译器生成的数据对象,函数和数据对象以下统称为“实体”)编译到单独的段中,以利于后面的分析和优化。
步骤(2),构建扩展调用图。扩展调用图可表示为G=(V,E,R)。其中:
V为结点集,其中每一个结点都与目标文件中一个实体对应,由于在步骤(101)中使用了将每个实体编译到单独的段中的选项,因为每一结点又可对应到目标文件中的一个段。
E为有向边集,每个元素是一对结点(u,v)。(u,v)∈E当且仅当u直接使用v,即在u的重定位数据中有相对v的重定位记录,此时在扩展调用图中有一条从u到v的边。
R为入口点集,它是V的一个子集。如果一个点代表程序的启动代码,或可能在程序运行中通过动态绑定访问,或属于特殊的段,则它是一个入口点。
具体构建方法如下:
步骤(2.1)使用elfutils或类似的库、工具依次读取每个目标文件。对于每一个目标文件,获取以下信息:
SS:该目标文件中所有包含有实体的段的名称的集合;
GS:包含该目标文件中定义的所有全局符号的信息,以关联表的形式存储,以便从全局符号的名称迅速查找它所在的段的名称;
AF:头和尾都属于该目标文件的有向边的集合;
AU:头属于该目标文件,尾为暂未解析的外部符号的有向边的信息,其中每一个元素表示为(u,sym),其中u属于SS,是该目标文件中的一个实体,sym为一个外部符号的名字,表示被u引用、但不在同一个目标文件中定义的实体。
步骤(2.2)根据步骤(2.1)中所获得的信息,合并为一个全局的有向图。这一步将得到扩展调用图的V和E:
V为所有目标文件的SS的并集,为了区分来自不同目标文件的段,在V中每个结点的名称将用(目标文件名,段名)的二元组表示。
E表示包括两部分:E=E1∪E2。其中E1为所有目标文件的AF的并集,代表头和尾都属于同一个目标文件的有向边的集合,E2为头和尾属于不同目标文件的有向边的集合。对所有目标文件的AF取并集即得到E1。求E2的方法为:首先令遍历每个目标文件的AU集合,对其中的每一个元素(u,sym),查找所有目标文件的GS集,获得所有名称为sym的全局符号的实体集S[sym],将所有二元组(u,v)(其中v∈S[sym])加入集合E2。最后将E1与E2取并集得到E。
步骤(2.3)得到入口点集R。具体方法为,首先令然后依次将下列结点加入集合R:
a.程序启动代码对应的实体,在Android上为_start符号所对应的代码;
b.可能通过动态绑定使用的实体,包括:
C/C++程序可能使用动态绑定访问的实体:扫描所有目标文件的只读数据段(rodata),找到其中所有字符串。对于系统中的所有全局实体(在动态库中的要求对外可见),如果其名字与其中一个字符串相同,则认为该实体可能通过动态绑定使用,应加入入口点集;
JNI入口函数:Java代码通过JNI调用本地代码时,Java虚拟机动态打开相应的动态库文件,并使用动态绑定的方式使用其中相应的函数。根据JNI的标准,JNI_OnLoad、JNI_OnUnload以及其他Java_*函数需标记为入口点(动态注册的JNI入口在扩展调用图中已经被注册函数使用,因此无需在此特别标记);
具体的系统中其他可能通过动态绑定使用的实体。
c.位于特殊段中的实体,特殊段包括所有名称不以.text、.data、.rodata、.bss打头的段。
步骤(3),得到扩展调用图的有效子图。有效子图Gs=(Vs,Es,R)是扩展调用图G=(V,E,R)的一个子图。G与Gs的入口结点集R相同,Vs是V是子集,Es是E的子集。Vs和Es的用公式表示为:
V s = ∪ u ∈ R Desc ( u )
Es=E∩(Vs×Vs)
其中Desc(u)表示u在扩展调用图G中的所有子孙结点(包括u自身)的集合。使用如下步骤计算Vs
步骤(3.1)首先令Vs=R,以及Q=R表示待访问的结点,表示已访问的结点;步骤(3.2)从Q中任取一个结点u,将它从Q中删除,加入VisitedV,再将u在V中的所有直接后继结点加入Vs,将u的所有不属于VisitedV的直接后继结点加入Q。
步骤(3.3)重复步骤(3.2),直到Q为空。
步骤(3.4)得到Vs后,继续求得Es:首先令Es为空集,然后遍历E中所有有向边(u,v),如果u和v都属于Vs,将从u至v的有向边加入Es
步骤(3.5)根据步骤(3.1)至(3.4)的结果得到有效子图Gs=(Vs,Es,R)。
步骤(4),重写目标文件。依次访问并重写每个目标文件,重写时自动更新了目标文件的时间戳:
步骤(4.1)目标文件中的每个实体具有一个可见性属性,可能取值包括默认default、受保护protected、内部internal、隐藏hidden四种,对每一个不属于Vs的实体,如果其可见性为默认default,改为隐藏hidden;
步骤(4.2)对每一个不属于Vs的实体,清除其重定位数据;
步骤(4.3)遍历目标文件的符号表,将不再被任何段引用的符号删除;
步骤(4.4)根据步骤(4.1)至步骤(4.3)的结果对目标文件进行重写,对于有修改的目标文件,其时间戳被自动更新。
与步骤(2)类似,步骤(4)中对目标文件的操作也可使用elfutils等工具。
步骤(5),链接得到优化后的系统。在基于Make的构建环境中,完成(4)以后,首先修改Makefile添加链接选项“--gc-sections”(链接时对段进行垃圾收集),然后直接运行make命令。步骤(4)对目标文件进行重写后,目标文件的时间戳仍然比源文件新,因此目标文件不会重新生成,但此时可执行文件和动态库文件的时间戳已经比修改后的目标文件旧,因此将以重写后的目标文件作为输入进行链接,得到优化后的系统。
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图,以开源操作系统安卓Android-x86honeycomb(3.2.3)版本作为实例对本发明的实施方式作进一步地详细描述。
1)准备工作。从源代码服务器www.android-x86.org下载2012年2月15日的honeycomb软件作为源代码。在进行优化前,首先确定未经修改过的系统可以正常编译和运行,编译的配置使用eeepc-eng,测试环境可以使用VirtualBox等虚拟机软件或使用x86CPU的笔记本电脑或平板电脑。
2)添加适当的编译、链接选项。具体操作为:编辑build/core/combo/TARGET_linux-x86.mk文件,添加选项“-ffunction-sections-fdata-sections”到TARGET_GLOBAL_CFLAGS,添加选项“-Wl,--gc-sections”到TARGET_GLOBAL_LDFLAGS,添加选项“--strip-unneeded”到TARGET_STRIP_COMMAND。
3)运行make命令,将自动编译所有源代码,完成步骤101。
4)使用根据本发明编写的工具,从目标文件中读取信息,分析后并进行二进制重写,完成步骤(2)至(4)。
5)再次运行make命令,将自动重新链接生成优化后的可执行文件、动态库文件,并生成相应的Android镜像文件。
6)比较优化前和优化后的系统的代码体积,最终镜像中的所有ELF格式文件(Linux内核除外)的大小比优化前减少26%。
7)在测试环境中运行优化前和优化后的系统,进行对比。使用Android Monkey评估系统的正确性,使用相同的伪随机数种子时,最终输出的日志文件除了时间戳以外完全一致。使用AnTuTu Benchmark评估系统的性能,整体上约有1%的性能提升。
以上实施方式仅用于说明本发明,而非对本发明的限制,相关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。
本发明具有如下优点:
1.应用范围广:上文的说明中虽使用Android作为例子,事实上本发明的用户很广泛,凡是在系统上运行的本地代码可以限定在一个集合范围内的系统都可以使用本发明的方法进行优化,很多移动设备上的操作系统都具有此特点。由于本发明的方法在目标文件的层面上进行操作,因此优化方法不依赖于具体的程序设计语言,在Android的示例中,本地代码由C、C++和汇编语言编译而来,在使用其他程序设计语言的系统中本发明也可同样有效使用。
2.自动化程度高:根据本发明编写的工具可以无需修改或者只需很少修改就用于不同的系统,对被优化的系统,只需对其构建环境和过程进行很小的改动就可应用本发明的方法,大多数操作都可完全自动完成。
3.使用方便:使用本发明的方法对系统进行优化时,所有修改都在目标代码上进行,无需对源代码作任何修改,可保证不会因为优化而影响系统源代码的可维护性,这对实际的系统开发具有重要意义。
4.优化效果明显:很多研究已经显示真实代码里有很多无用代码,也有不少关于消除无用代码的研究。本发明在整个系统的范围内进行无用代码消除的优化,可以达到更明显的效果。由于无用代码的消除,系统中保留下来的代码的局部性提升,有助于性能的提高。在上文Android的示例中,优化后的系统的代码体积比原系统减小26%,性能整体提升1%。

Claims (1)

1.一种移动终端操作系统基于全系统扩展调用图的自动优化方法,其特征在于,是在计算机中依次按以下步骤实现的:
步骤(1):编译移动终端操作系统的源代码,生成可重定位的目标文件;
从源代码服务器中下载源代码,修改相关的Makefile,向CFLAGS添加“-ffunction-sections”参数和“-fdata-sections”参数以使编译器将每个函数和数据对象编译到单独的段中,再运行make命令自动编译所述源代码生成可重定位的目标文件,其中函数和数据对象统称为“实体”,所述数据对象既包括源代码中定义的全局和静态变量,也至少包括虚函数表在内的编译器生成的数据对象;
步骤(2):按以下步骤构造有向的全系统扩展调用图:
步骤(2.1):对步骤(1)得到的目标文件,读取以下信息,其中包括SS、GS、AF和AU:
SS,所述目标文件中所有包含有所述实体的段的名称集合,
GS,所述目标文件中定义的所有全局符号及其名称,并以关联表的形式存储,以便从全局符号的名称迅速查找所在的段的名称,
AF,头和尾都属于同一个所述目标文件的有向边形成的集合,
AU,头属于一个所述目标文件,尾为暂未解析的符号的有向边,其中每一个元素表示为(u,sym),其中u属于SS,是所述目标文件中的一个所述实体,sym为一个外部符号的名,表示被实体u引用,但不在同一个所述目标文件中定义的实体,
步骤(2.2),根据步骤(2.1)中所得到的信息,合并为一个系统全局的有向图,从而得到所述扩展调用图的V和E,其中:
V为所有所述目标文件SS的并集,是一个结点集,其中每一个结点的名称用所对应的一个二元组表示,其中包括目标文件名和段名,
E为有向边集,它包括两部分:E=E1∪E2,其中E1为所有所述目标文件的AF的并集,代表了头和尾都属于同一个所述目标文件的有向边所形成的集合,E2为头和尾属于不同的所述目标文件的有向边形成的集合,按以下方法得到:首先,令再遍历每个所述目标文件的AU集合,对其中的每一个元素(u,sym),查找所有所述目标文件的GS集,得到所有名称为sym的全局符号的所述实体集合S[sym],将所有二元组(u,v)|v∈S[sym]加入集合E2,并将E1与E2取并集得到E,其中每一个元素是一对结点(u,v),对应所述系统扩展调用图中一条从u到v的有向边,当且仅当u的重定位数据中有相对v的重定位记录时,在所述系统扩展调用图中存在一条从u到v的边,
步骤(2.3),按以下步骤得到入口点集R:
步骤(2.3.1),令
步骤(2.3.2),把同程序启动代码对应的所述实体作为一个结点加入所述入口点集R,在Android中_start符号所对应的实体即为程序启动代码,
步骤(2.3.3),把可能通过动态绑定使用的所述实体作为一个结点加入所述入口点集R,
步骤(2.3.4),把位于不以.text、.data、.rodata、.bss打头的段中的所述实体作为一个结点加入所述入口点集R,
步骤(2.4),从步骤(2.1)至步骤(2.3)得到的V、E、R表示为一个所述的系统调用图G=(V,E,R);
步骤(3),按以下步骤从步骤(2)得到的所述系统扩展调用图G中得到有效子图Gs=(Vs,Es,R),其中Vs为有效结点集,Es为有效的有向边集,表示为:
V s = ∪ u ∈ R D e s c ( u )
Es=E∩(Vs×Vs)
其中Desc(u)表示u在扩展调用图G中包括u自身在内的子孙结点的集合,
步骤(3.1),令Vs=R,Q=R表示待访问的结点集,表示已访问的结点集,
步骤(3.2),从待访问的结点集Q中任取一个结点u加入VisitedV,再把结点u在所述系统扩展调用图G中的所有直接后继结点加入所述Vs中,把所述结点u的不属于所述已访问过的结点集VisitedV的直接后继结点加入待访问的结点集Q中,并从所述待访问的结点集Q中删除访问过的结点u,
步骤(3.3),重复步骤(3.2),直到所述待访问的结点集Q为空,得到有效结点集Vs
步骤(3.4),令Es为空集,遍历E中的所有有向边(u,v),若结点u和结点v都属于所述有效结点集Vs,把从所述结点u到所述结点v的有向边加入Es
步骤(3.5),根据步骤(2)及步骤(3.1)至步骤(3.4)的结果得到有效子图Gs=(Vs,Es,R);
步骤(4),按以下步骤重写所述目标文件,更新时间戳:
步骤(4.1),每一个所述目标文件中的实体都带有一个可见性属性,包括默认default、受保护protected、内部internal、隐藏hidden四种,对每一个不属于有效结点集Vs的实体,若其可见性属性为默认default,则改为隐藏hidden,
步骤(4.2),对每一个所述不属于有效结点集Vs的实体,清除其重定位数据,
步骤(4.3),遍历所述目标文件的符号表,清除不再被任何段引用的符号,
步骤(4.4),根据步骤(4.1)至(4.3)的结果,对所述目标文件进行二进制重写,对于有修改的所述目标文件,其时间戳被自动更新,
步骤(5),按以下步骤链接得到优化后的Android镜像文件:
在所述Makefile中添加用于链接时对段进行垃圾收集的链接选项“--gc-sections”,运行make命令,自动重新链接生成优化后的可执行文件、动态库文件并生成相应的Android镜像文件。
CN201210495453.7A 2012-11-28 2012-11-28 移动终端操作系统基于全系统扩展调用图的自动优化方法 Active CN103034486B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201210495453.7A CN103034486B (zh) 2012-11-28 2012-11-28 移动终端操作系统基于全系统扩展调用图的自动优化方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201210495453.7A CN103034486B (zh) 2012-11-28 2012-11-28 移动终端操作系统基于全系统扩展调用图的自动优化方法

Publications (2)

Publication Number Publication Date
CN103034486A CN103034486A (zh) 2013-04-10
CN103034486B true CN103034486B (zh) 2015-09-30

Family

ID=48021412

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201210495453.7A Active CN103034486B (zh) 2012-11-28 2012-11-28 移动终端操作系统基于全系统扩展调用图的自动优化方法

Country Status (1)

Country Link
CN (1) CN103034486B (zh)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103116514A (zh) * 2013-03-15 2013-05-22 清华大学 基于系统扩展调用图的操作系统自动优化方法和系统
CN103530425A (zh) * 2013-11-01 2014-01-22 哈尔滨商业大学 基于对象关联映射的Android终端访问远程数据库代码生成系统和方法
CN104035773B (zh) * 2014-06-11 2017-04-12 清华大学 基于扩展调用图的软件系统结点重要度评价方法
CN106909434B (zh) * 2017-02-28 2020-04-03 杭州迪普科技股份有限公司 可执行程序中未定义函数的检测方法及装置
CN107729015B (zh) * 2017-09-12 2020-12-11 创新先进技术有限公司 一种确定工程代码中的无用函数的方法和装置
CN109918074B (zh) * 2017-12-08 2022-09-27 中标软件有限公司 编译链接优化方法
CN111090454B (zh) * 2019-11-25 2021-03-23 广州极点三维信息科技有限公司 一种基于odb的自动化处理方法、装置和设备
CN113835686A (zh) * 2020-06-08 2021-12-24 华为技术有限公司 代码处理方法和装置
CN113721928B (zh) * 2021-11-02 2022-01-18 成都无糖信息技术有限公司 一种基于二进制分析的动态库裁剪方法

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7340732B2 (en) * 2003-11-26 2008-03-04 Sun Microsystems, Inc. Updating profile frequency for procedure inlining
JP2006139413A (ja) * 2004-11-10 2006-06-01 Hitachi Ltd プログラム、プログラムコードの合理化方法、プログラムコードの生成方法、プログラムコード、及び情報処理装置
US9459851B2 (en) * 2010-06-25 2016-10-04 International Business Machines Corporation Arranging binary code based on call graph partitioning

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
基于扩展调用图的软件开发集成环境;朱剑;《中国优秀硕士学位论文全文数据库 信息科技辑》;20021215(第02期);第I138-101页 *
基于面向方面调用图的AspectJ动态通知编织优化;曹璟等;《软件学报》;20080930(第09期);第2218-2227页 *

Also Published As

Publication number Publication date
CN103034486A (zh) 2013-04-10

Similar Documents

Publication Publication Date Title
CN103034486B (zh) 移动终端操作系统基于全系统扩展调用图的自动优化方法
US9256401B2 (en) Editor visualization of symbolic relationships
US9182980B2 (en) Expansion and reduction of source code for code refactoring
US11372630B2 (en) Efficient immutable syntax representation with incremental change
US8789018B2 (en) Statically derived symbolic references for dynamic languages
CN108139891B (zh) 用于生成建议以纠正未定义标记错误的方法和系统
CN110149800B (zh) 一种用于处理与源程序的源代码相关联的抽象语法树的装置
CN101334728A (zh) 一种基于xml文档描述的界面生成方法和平台
Cleve Program analysis and transformation for data-intensive system evolution
CN110888645A (zh) 一种转换为小程序的方法、装置和存储介质
JP2018510445A (ja) プログラム性能を向上させる領域特化システムおよび方法
CN113312046A (zh) 子应用页面处理方法、装置和计算机设备
US20230113783A1 (en) Cross-platform code conversion method and device
Khatchadourian et al. [Engineering Paper] A Tool for Optimizing Java 8 Stream Software via Automated Refactoring
Cooper Integrating dataflow evaluation into a practical higher-order call-by-value language
Falleri et al. Incremental inconsistency detection with low memory overhead
CN111984300A (zh) 代码复制方法及装置、电子设备和计算机可读存储介质
CN103116514A (zh) 基于系统扩展调用图的操作系统自动优化方法和系统
Tsoukalos Mastering Go: Create Golang production applications using network libraries, concurrency, machine learning, and advanced data structures
Washizaki et al. ProMeTA: a taxonomy for program metamodels in program reverse engineering
US11573787B1 (en) Hot reloading a running application with an unsaved source code change
CN115794858A (zh) 查询语句处理方法、装置、设备及存储介质
Scherer Hands-on JavaScript High Performance: Build Faster Web Apps Using Node. js, Svelte. js, and WebAssembly
JP3266097B2 (ja) 非リエントラントプログラムの自動リエントラント化方法及びシステム
Chen et al. Tracking down dynamic feature code changes against Python software evolution

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant