一种安卓系统固件源代码还原方法及存储介质与流程

文档序号:15492010发布日期:2018-09-21 20:47阅读:596来源:国知局

本发明涉及安卓系统设计领域,尤其涉及一种安卓系统固件源代码还原方法。



背景技术:

目前编译出来的android固件并不包含是从哪份源代码编译出来的信息。客户将这样的固件烧录进设备后,一旦出现问题,无从考证代码状态。基于这个现状,本发明提出一种能够从android固件中还原此固件的源代码的方法,用来帮助问题的处理。处理该问题的研发人员,能够从固件文件或者烧录到设备上的固件中提取它所对应的源码状态信息,进而还原出相同的测试环境复现问题,有益于问题的处理。

为实现从android固件中还原此固件的源代码的方法,需要从固件生成方式上入手,在编译时收集必要的当前代码状态信息,并保存到固件中。当需要确认该固件所对应的源代码时,可以从固件文件或者已经烧录了该固件的设备上提取当时编译的代码状态信息,进而将当时的代码状态完整还原出来。



技术实现要素:

为此,需要提供一种安卓系统固件代码的还原方法,以满足在系统固件的设计过程中需要提取编译状态进行还原修改的问题;

为实现上述目的,发明人提供了一种安卓系统固件源代码还原方法,包括步骤,保存固件源代码根目录下的.repo/manifests目录的仓库信息,所述仓库信息包括.repo/manifests目录远端仓库地址信息、分支名信息以及manifest文件名;保存固件源代码根目录下所有子仓库的提交信息为本地仓库提交信息文件,所述提交信息包括子仓库的远端仓库地址信息、子仓库的分支名信息以及子仓库的本地提交号;保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息,所述差异代码信息包括子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将上述代码状态信息保存至代码状态信息集文件夹,再将文件夹压缩后集成到安卓编译系统,生成第一代码状态信息集保存进固件;

在需要还原固件源代码时,从固件中分离所述第一代码状态信息集,根据第一代码状态信息集,下载.repo/manifests文件夹所对应的远端仓库的最新内容,替换默认指向的manifest.xml为本地仓库提交信息文件,将本地仓库提交信息文件中的本地提交号改为差异代码信息中的合并基准提交号,进而通过reposync还原出未打上差异代码补丁的源代码;遍历第一代码状态信息集当中的差异代码文件夹,将差异代码合并入源代码,即可完整还原出固件对应的源代码。

进一步地,还包括步骤,

遍历固件源代码工程中所有由manifest管理的git代码仓库,收集子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将所述第一代码状态信息集压缩为代码状态信息集压缩包,集成进安卓固件中。

具体地,保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息具体包括步骤,

判断当前仓库是否为未修改的aosp仓库,若否,即修改过aosp代码或者引进的新仓库,还进行下述步骤:

找出本地已提交但未上传或合并进远端代码仓库的提交集,然后记录该仓库的远端仓库地址和指向的分支名,找出本地提交与远端代码仓库的合并基准点并将其记录;

遍历所有修改过的代码仓库,找出本地未提交的差异代码,将本地未提交的差异代码保存到带有子仓库目录名信息的文件夹。

优选地,所述步骤,将所述代码状态信息集文件夹压缩,集成进安卓编译系统的新生成固件中具体包括步骤,

向安卓编译系统的设备编译配置文件中添加product_copy_files脚本,所述脚本用于代码状态信息集压缩包集成到系统格式的固件镜像文件中;执行编译命令make,根据上述添加的脚本,执行保存当前代码状态的脚本程序;待编译系统完成编译,生成当前代码状态的信息集,并保存进安卓固件中。

进一步地,还包括步骤,从设备固件中分离代码状态信息集,根据manifest远程仓库地址信息,分支下载地址信息,manifest文件名信息,使用repoinit命令获取当前最新的manifest.xml内容;

修改默认指向的manifest.xml,使其能够通过reposync下载到未打上差异代码补丁的源代码,步骤包括:

替换默认指向的manifest.xml为本地仓库提交信息文件,遍历所有差异代码信息文件夹,获取保存了合并基准点提交号信息的文件夹,通过该文件夹名中带的仓库目录名信息,找到manifest.xml文件中相同仓库目录名的行,替换该行中的提交号为合并基准点提交号;进而通过reposync还原出未打上差异代码补丁的源代码;

遍历所有差异代码信息文件夹,通过文件夹名中带的仓库目录名信息,将差异代码补丁文件分别拷贝到对应代码仓库目录下;所述补丁文件包括本地未提交补丁和本地已提交但未合并到远程仓库的补丁,将补丁文件更新到源代码上,即可完成固件所对应的源代码的完整还原。

一种安卓系统固件源代码还原存储介质,存储有计算机程序,所述计算机程序在被运行时执行下述步骤,

保存固件源代码根目录下的.repo/manifests目录的仓库信息,所述仓库信息包括.repo/manifests目录远端仓库地址信息、分支名信息以及manifest文件名;保存固件源代码根目录下所有子仓库的提交信息为本地仓库提交信息文件,所述提交信息包括子仓库的远端仓库地址信息、子仓库的分支名信息以及子仓库的本地提交号;保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息,所述差异代码信息包括子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将上述代码状态信息保存至代码状态信息集文件夹,再将文件夹压缩后集成到安卓编译系统,生成第一代码状态信息集保存进固件;

在需要还原固件源代码时,从固件中分离所述第一代码状态信息集,根据第一代码状态信息集,下载.repo/manifests文件夹所对应的远端仓库的最新内容,替换默认指向的manifest.xml为本地仓库提交信息文件,将本地仓库提交信息文件中的本地提交号改为差异代码信息中的合并基准提交号,进而通过reposync还原出未打上差异代码补丁的源代码;遍历第一代码状态信息集当中的差异代码文件夹,将差异代码合并入源代码,即可完整还原出固件对应的源代码。

进一步地,所述计算机程序在被运行时还执行步骤,

遍历固件源代码工程中所有由manifest管理的git代码仓库,收集子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将所述第一代码状态信息集压缩为代码状态信息集压缩包,集成进安卓固件中。

具体地,所述计算机程序进行保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息具体包括步骤,

判断当前仓库是否为未修改的aosp仓库,若否,即修改过aosp代码或者引进的新仓库,还进行下述步骤:

找出本地已提交但未上传或合并进远端代码仓库的提交集,然后记录该仓库的远端仓库地址和指向的分支名,找出本地提交与远端代码仓库的合并基准点并将其记录;

遍历所有修改过的代码仓库,找出本地未提交的差异代码,将本地未提交的差异代码保存到带有子仓库目录名信息的文件夹。

优选地,所述计算机程序进行,将所述代码状态信息集文件夹压缩,集成进安卓编译系统的新生成固件中具体包括步骤,

向安卓编译系统的设备编译配置文件中添加product_copy_files脚本,所述脚本用于代码状态信息集压缩包集成到系统格式的固件镜像文件中;执行编译命令make,根据上述添加的脚本,执行保存当前代码状态的脚本程序;待编译系统完成编译,生成当前代码状态的信息集,并保存进安卓固件中。

具体地,所述计算机程序在被运行时还执行步骤,从设备固件中分离代码状态信息集,根据manifest远程仓库地址信息,分支下载地址信息,manifest文件名信息,使用repoinit命令获取当前最新的manifest.xml内容;

修改默认指向的manifest.xml,使其能够通过reposync下载到未打上差异代码补丁的源代码,步骤包括:

替换默认指向的manifest.xml为本地仓库提交信息文件,遍历所有差异代码信息文件夹,获取保存了合并基准点提交号信息的文件夹,通过该文件夹名中带的仓库目录名信息,找到manifest.xml文件中相同仓库目录名的行,替换该行中的提交号为合并基准点提交号;进而通过reposync还原出未打上差异代码补丁的源代码;

遍历所有差异代码信息文件夹,通过文件夹名中带的仓库目录名信息,将差异代码补丁文件分别拷贝到对应代码仓库目录下;所述补丁文件包括本地未提交补丁和本地已提交但未合并到远程仓库的补丁,将补丁文件更新到源代码上,即可完成固件所对应的源代码的完整还原。

通过上述方法,本发明通过将代码仓库中每个版本的源代码信息进行记录保留,一同合并编译保留到固件中,当有需要校对等操作时通过提取固件进行还原,进而通过回退到合并基准号来实现固件的有效还原。

附图说明

图1为本发明具体实施方式所述的安卓系统固件源代码还原方法流程图。

具体实施方式

为详细说明技术方案的技术内容、构造特征、所实现目的及效果,以下结合具体实施例并配合附图详予说明。

请参阅图1,介绍了一种安卓系统固件源代码还原方法,包括步骤,s102保存固件源代码根目录下的.repo/manifests目录的仓库信息,所述仓库信息包括.repo/manifests目录远端仓库地址信息、分支名信息以及manifest文件名;保存固件源代码根目录下所有子仓库的提交信息为本地仓库提交信息文件,所述提交信息包括子仓库的远端仓库地址信息、子仓库的分支名信息以及子仓库的本地提交号;s104保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息,所述差异代码信息包括子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

s106将上述代码状态信息保存至代码状态信息集文件夹,再将文件夹压缩后集成到安卓编译系统,生成第一代码状态信息集保存进固件;

在需要还原固件源代码时,进行步骤s108从固件中分离所述第一代码状态信息集,根据第一代码状态信息集,下载.repo/manifests文件夹所对应的远端仓库的最新内容,替换默认指向的manifest.xml为本地仓库提交信息文件,将本地仓库提交信息文件中的本地提交号改为差异代码信息中的合并基准提交号,进而通过reposync还原出未打上差异代码补丁的源代码;s110遍历第一代码状态信息集当中的差异代码文件夹,将差异代码合并入源代码,即可完整还原出固件对应的源代码。

在图1所示的实施例中,仓库信息可以为安卓git仓库信息,远端仓库地址及分值信息为remoteurl以及branch信息,通过寻找mainfest文件名找到源代码,再针对根据路子仓库的针对找到差异代码信息及合并基准提交号等信息一并存入固件中,使得现有技术中固件代码仓库中的代码随着设计版本的更新不断迭代的缺点被克服,达到能够根据合并提交号等信息找到迭代前版本的不同,进而在需要还原固件代码时直接解析固件,就能够找到差异代码将补丁合并入源代码,使得记录的源代码能够回退到固件对应的具体版本。解决了现有技术中固件的源代码无法不易保存,无法随固件进行简单简单还原的问题。

在其他一些进一步的实施例中,具体还包括步骤,遍历固件源代码工程中所有由manifest管理的git代码仓库,收集子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将所述第一代码状态信息集压缩为代码状态信息集压缩包,集成进安卓固件中。

通过上述设计,能够更好地对子仓库中的数据进行固定提取,达到更好地追踪差异代码的技术效果,保证还原的有效性。

其他一些具体的实施例中,保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息具体包括步骤,

判断当前仓库是否为未修改的aosp仓库,若否,即修改过aosp代码或者引进的新仓库,还进行下述步骤:

找出本地已提交但未上传或合并进远端代码仓库的提交集,然后记录该仓库的远端仓库地址和指向的分支名,找出本地提交与远端代码仓库的合并基准点并将其记录;

遍历所有修改过的代码仓库,找出本地未提交的差异代码,将本地未提交的差异代码保存到带有子仓库目录名信息的文件夹。本技术方案能够使得代码仓库的记录更加准确,若仓库修改过则能够准确辨识差异代码,若仓库未被修改过则能够省掉遍历步骤,更好地节约计算机资源。通过上述方案手机达到了优化还原过程的技术效果。

其他一些优选的实施例中,所述步骤,将所述代码状态信息集文件夹压缩,集成进安卓编译系统的新生成固件中具体包括步骤,

向安卓编译系统的设备编译配置文件中添加product_copy_files脚本,所述脚本用于代码状态信息集压缩包集成到系统格式的固件镜像文件中;执行编译命令make,根据上述添加的脚本,执行保存当前代码状态的脚本程序;待编译系统完成编译,生成当前代码状态的信息集,并保存进安卓固件中。

另外一些实施例中,为了更好地对差异补丁进行还原,还包括步骤,从设备固件中分离代码状态信息集,根据manifest远程仓库地址信息,分支下载地址信息,manifest文件名信息,使用repoinit命令获取当前最新的manifest.xml内容;

修改默认指向的manifest.xml,使其能够通过reposync下载到未打上差异代码补丁的源代码,步骤包括:

替换默认指向的manifest.xml为本地仓库提交信息文件,遍历所有差异代码信息文件夹,获取保存了合并基准点提交号信息的文件夹,通过该文件夹名中带的仓库目录名信息,找到manifest.xml文件中相同仓库目录名的行,替换该行中的提交号为合并基准点提交号;进而通过reposync还原出未打上差异代码补丁的源代码;

遍历所有差异代码信息文件夹,通过文件夹名中带的仓库目录名信息,将差异代码补丁文件分别拷贝到对应代码仓库目录下;所述补丁文件包括本地未提交补丁和本地已提交但未合并到远程仓库的补丁,将补丁文件更新到源代码上,即可完成固件所对应的源代码的完整还原。

本发明还提供如下的实施例方案:

2.1编写保存当前代码状态的脚本文件,并添加到编译系统中供其调用

2.1.1保存当前代码状态的脚本,涉及的步骤包括:

2.1.1.1创建代码状态信息集文件夹,供后续存放必要状态信息文件和压缩保存

2.1.1.2保存源码根目录下.repo/manifestsgit仓库信息到代码状态信息集文件夹,git仓库信息包括远端仓库地址(remoteurl)和指向的分支(branch)信息。由于.repo/manifest.xml是软链接,故需要通过ls-l命令找出它所指向的真实的manifest文件名,并保存该真实manifest文件和文件名到代码状态信息集文件夹。该步骤将会用于从固件还原源代码的过程,提供给repoinit命令中所需要的manifest仓库的远端地址,分支和文件名信息。

2.1.1.3利用repomanifest命令保存当前源代码工程中,所有由manifest管理的git仓库的最新提交号信息到xml文件到代码状态信息集文件夹。该步骤将会用于从固件还原源代码的过程,将上述xml文件作为参数提供给reposync命令,用于还原源代码。

2.1.1.4利用repoforall-c命令,遍历当前源代码工程中所有由manifest管理的git代码仓库,执行“收集修改过的仓库代码状态信息和代码补丁”脚本,将结果输出到代码状态信息集文件夹。其中,“收集修改过的仓库代码状态信息和代码补丁”的脚本,具体功能为:

2.1.1.4.1判断当前仓库是否为未修改的谷歌aosp仓库。若是,则退出,因为既然该仓库没有修改过,则没必要检查是否有补丁集,节约遍历时间。若否,即修改过aosp代码或者引进的新仓库,则需要进行下述步骤。

2.1.1.4.2找出本地已提交但未上传或合并进远端代码仓库的提交集,利用gitformat-patch命令将这些提交集转化为补丁文件集。然后记录该仓库的远端仓库地址(remoteurl)和指向的分支(branch),同时利用gitmergebase命令找出本地提交与远端代码仓库的合并基准点提交(mergebase)。上述信息和文件集会被分别放置在以代码状态信息集文件夹为基准而创建的各自仓库名文件夹中。

2.1.1.4.3遍历上述有修改过的代码仓库,找出本地未提交的差异代码补丁,利用gitdiff--binary和gitdiff--cached–binary命令将本地未提交的差异代码补丁保存到以代码状态信息集文件夹为基准而创建的各自仓库名文件夹中。

2.1.1.5打包压缩2.1.1.1的代码状态信息集文件夹,产生一个代码状态信息集压缩包文件。

2.1.2将2.1.1创建的脚本,集成进android编译系统。步骤如下:

2.1.2.1往android编译系统最核心的build/core/main.mk,定义droid_targets的开头,添加对2.1.1创建的脚本的执行语句($(shell)“保存当前代码状态的脚本”),确保编译系统在编译android固件的最开始就生成当前代码状态的信息集。

2.1.2.2往android编译系统的设备编译配置文件中添加product_copy_files脚本,以用来拷贝2.1.1.5所产生的压缩包文件到以ext4文件系统格式打包的固件镜像文件中。

2.2执行编译命令make,编译系统会根据上述添加的脚本,执行保存当前代码状态的脚本程序

2.3编译系统完成编译,生成当前代码状态的信息集,并保存进固件

3从固件还原出源代码的步骤

3.1从2.1.2.2过程中可以得知当时源代码状态信息的保存位置,通过挂载ext4文件系统的固件镜像文件或者adbpull烧录了该固件的设备,就能够拷贝出2.1.1.5所产生的代码状态压缩包文件。

3.2解压3.1中获取的代码状态压缩包文件,能够得到如下信息:

3.2.1下载原始代码所需要的manifest信息,包括2.1.1.2生成的manifest远程仓库地址,分支名,manifest文件名以及2.1.1.3生成的manifest文件。

3.2.22.1.1.4生成的所有修改过的仓库代码状态信息和代码补丁

3.3还原源代码

3.3.1遍历2.1.1.4生成的所有修改过的仓库代码状态信息和代码补丁文件夹,找到带有2.1.1.4.2生成的合并基准点(mergebase)提交号信息的文件夹。通过该文件夹名中带的仓库名信息,找到2.1.1.3输出的manifest文件中相同仓库名的行,替换改行中的提交号(revision)为合并基准点提交号。

3.3.2使用repoinit命令,带上3.2.1提到的参数:manifest远程仓库地址,分支名,manifest文件名,初始化源代码仓库信息。

3.3.3使用reposync命令下载基准源代码

3.3.4拷贝3.3.1处理过的manifest文件到基准源代码工程下的.repo/manifests/文件夹。

3.3.5使用repoinit–m切换到3.3.4提到的manifest文件

3.3.6使用reposync命令将基准源代码更新到合并基准(mergebase)的源代码

3.3.7遍历2.1.1.4生成的所有修改过的仓库代码状态信息和代码补丁文件夹,通过该文件夹名中带的仓库名信息,将补丁文件(包括本地未提交补丁和本地已提交但未合并到远程仓库的补丁)分别拷贝到对应代码文件夹下。使用gitam将本地已提交但未合并到远程仓库的补丁打上。使用gitapply--reject将本地未提交补丁打上。

通过上述步骤,即可将源代码还原到生成该固件时的源代码状态。解决了现有技术无法针对任意固件还原其源代码的技术效果。

一种安卓系统固件源代码还原存储介质,存储有计算机程序,所述计算机程序在被运行时执行下述步骤,

保存固件源代码根目录下的.repo/manifests目录的仓库信息,所述仓库信息包括.repo/manifests目录远端仓库地址信息、分支名信息以及manifest文件名;保存固件源代码根目录下所有子仓库的提交信息为本地仓库提交信息文件,所述提交信息包括子仓库的远端仓库地址信息、子仓库的分支名信息以及子仓库的本地提交号;保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息,所述差异代码信息包括子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将上述代码状态信息保存至代码状态信息集文件夹,再将文件夹压缩后集成到安卓编译系统,生成第一代码状态信息集保存进固件;

在需要还原固件源代码时,从固件中分离所述第一代码状态信息集,根据第一代码状态信息集,下载.repo/manifests文件夹所对应的远端仓库的最新内容,替换默认指向的manifest.xml为本地仓库提交信息文件,将本地仓库提交信息文件中的本地提交号改为差异代码信息中的合并基准提交号,进而通过reposync还原出未打上差异代码补丁的源代码;遍历第一代码状态信息集当中的差异代码文件夹,将差异代码合并入源代码,即可完整还原出固件对应的源代码。

进一步地,所述计算机程序在被运行时还执行步骤,

遍历固件源代码工程中所有由manifest管理的git代码仓库,收集子仓库所跟踪的远端仓库分支名、子仓库与子仓库所跟踪的远端仓库的合并基准提交号、子仓库与子仓库所跟踪的远端仓库的差异代码,分别将结果输出到带有子仓库目录名信息的文件夹;

将所述第一代码状态信息集压缩为代码状态信息集压缩包,集成进安卓固件中。

具体地,所述计算机程序进行保存固件源代码根目录下所有子仓库与其对应的远端仓库的差异代码信息具体包括步骤,

判断当前仓库是否为未修改的aosp仓库,若否,即修改过aosp代码或者引进的新仓库,还进行下述步骤:

找出本地已提交但未上传或合并进远端代码仓库的提交集,然后记录该仓库的远端仓库地址和指向的分支名,找出本地提交与远端代码仓库的合并基准点并将其记录;

遍历所有修改过的代码仓库,找出本地未提交的差异代码,将本地未提交的差异代码保存到带有子仓库目录名信息的文件夹。

优选地,所述计算机程序进行,将所述代码状态信息集文件夹压缩,集成进安卓编译系统的新生成固件中具体包括步骤,

向安卓编译系统的设备编译配置文件中添加product_copy_files脚本,所述脚本用于代码状态信息集压缩包集成到系统格式的固件镜像文件中;执行编译命令make,根据上述添加的脚本,执行保存当前代码状态的脚本程序;待编译系统完成编译,生成当前代码状态的信息集,并保存进安卓固件中。

具体地,所述计算机程序在被运行时还执行步骤,从设备固件中分离代码状态信息集,根据manifest远程仓库地址信息,分支下载地址信息,manifest文件名信息,使用repoinit命令获取当前最新的manifest.xml内容;

修改默认指向的manifest.xml,使其能够通过reposync下载到未打上差异代码补丁的源代码,步骤包括:

替换默认指向的manifest.xml为本地仓库提交信息文件,遍历所有差异代码信息文件夹,获取保存了合并基准点提交号信息的文件夹,通过该文件夹名中带的仓库目录名信息,找到manifest.xml文件中相同仓库目录名的行,替换该行中的提交号为合并基准点提交号;进而通过reposync还原出未打上差异代码补丁的源代码;

遍历所有差异代码信息文件夹,通过文件夹名中带的仓库目录名信息,将差异代码补丁文件分别拷贝到对应代码仓库目录下;所述补丁文件包括本地未提交补丁和本地已提交但未合并到远程仓库的补丁,将补丁文件更新到源代码上,即可完成固件所对应的源代码的完整还原。

需要说明的是,尽管在本文中已经对上述各实施例进行了描述,但并非因此限制本发明的专利保护范围。因此,基于本发明的创新理念,对本文所述实施例进行的变更和修改,或利用本发明说明书及附图内容所作的等效结构或等效流程变换,直接或间接地将以上技术方案运用在其他相关的技术领域,均包括在本发明的专利保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1