胡琪

为今天工作,为明天投资,为未来孵化一些东西!

安卓源码的下载与编译

最近在研究对脱壳工具dexhunter进行自己需求的定制的时候涉及到了安卓源码的编译,因此记录一下,编译安卓源码是一个坑坑不息之路,各种让你意向不到的错误都会出现,而且因为编译环境的不同,每个人出现的错误可能完全不一样,因此在网上找的解决方案可能对你的环境而言根本不起作用,谁搞过谁就知道,如果说你能够第一次编译就成功的话,那我只能说你可以去买彩票了。

安卓源码的下载

安卓源码使用命令的方式下载,只能够在linux系统上进行,核心步骤如下

1下载安装repo工具

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

其中第3小步中的url可以替换为任意一个提供安卓源码下载源的下载网址,如在国内如果不能访问谷歌,可以替换为清华大学下载源:

2对repo工具进行基本的配置信息设置

$ git config –global user.name “Your Name”
$ git config –global user.email “you@example.com”

其中的user.name和user.email指的是你所注册的谷歌账号的用户名和email,不能随意乱设置,必须填写正确有效信息,否则会验证失败

3初始化repo工具指定要下载的安卓版本

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.4_r2

其中的版本号通过-b参数来指定,比如要下载安卓4.4.4系统第二次release版本则指定-b android-4.4.4_r2,关于版本号的信息可以从这查看:https://android.googlesource.com/platform/manifest/+refs

4下载安卓源码

$ repo syn

下载时间视网速而定,像我用的公司网速好像是30分钟左右就下载好了,下载完成后整个源码的目录结构是这样的:

《安卓源码的下载与编译》

就整个下载过程而言还是比较顺利的,安卓源码下载的详细步骤如果不清楚可以参考官方文档:https://source.android.com/source/downloading

编译安卓源码涉及到的命令

单就安卓源码编译的命令而言还是很简单的,总共只涉及到了3个命令,这3个命令对应着3个步骤,在下载好的安卓源码的根目录下依次执行以下3个命令即可编译安卓源码

  1. source build/envsetup.sh
  2. lunch
  3. make -j8

其中执行步骤2 lunch命令的时候会让我们选择编译的cpu架构,如arm,x86等。如下图所示:

《安卓源码的下载与编译》

选择了这一步之后make命令编译出来的安卓镜像就是步骤2中指定的cpu架构类型。当执行make命令之后就开始编译安卓源码了,这个过程会比较耗时,也可能出现很多错误,常见错误及解决方案见下面的子模块,其中-j8参数表示开启8个线程来执行该操作,也可以使用make -j4命令。编译成功之后会在当前根目录下产生一个out目录,这个out目录下就是编译生成的文件,包括镜像文件和常见的so文件,如system.img和libdvm.so,当然这两个文件在out目录下的不同子目录路径下。当出现输出

Install system fs image :out/target/product/generic/system.img

时就表示编译成功了,如下图所示:

《安卓源码的下载与编译》

在得到镜像文件之后我们就可以进行刷机操作或者直接替换模拟器下的system.img,ramdisk.img,userdata.img这三个核心的img文件,如果你修改过安卓系统源代码,那这样就可以定制自己安卓系统了,如下是本人用编译好后的镜像文件刷机后的效果图:

《安卓源码的下载与编译》

可以看到在关于手机版本号信息中使用的是netease账户,日期是2017年10月20号。

单独编译安卓源码子模块

很多时候我们不需要编译完整的安卓源码来得到定制镜像文件刷机,可能我们只想要修改安卓系统源代码某个子模块的代码来定制我们的功能得到某个so,然后使用该so来替换系统原生so来达到定制安卓系统的功能。比如,修改了安卓dalvik目录下的某些cpp文件,然后编译得到libdvm.so来定制dex加载相关的功能。单独编译安卓源码子模块主要涉及到如下两个命令:

  • mm:编译当前目录下的模块,不会编译该模块依赖的模块
  • mma:编译当前目录下的模块及其依赖模块

首先进入到要编译的子模块目录,比如说安卓源码的dalvik子目录下,然后执行mm命令或者mma命令即可编译该子模块,需要注意的是mm命令在编译当前模块时不会编译该模块依赖的模块,因此在执行mm命令编译子模块时要先编译一次整个安卓源码,而mma命令在编译当前模块时会编译当前目录下的模块及其依赖模块,因此推荐编译子模块时使用mma命令

常见的编译错误及解决方案

错误1:make使用版本不对:

错误提示如下图所示:

《安卓源码的下载与编译》

解决方案:

安卓源码的编译只支持make 3.8.1和3.8.2版本,不支持其他版本,如果使用其他版本的make编译会出现如上图所示的错误,解决办法就是卸载原先的make版本重新安装3.8.1或者3.8.2版本的make。关于如何更新make版本请参考:http://www.360doc.com/content/15/0503/13/13755107_467646086.shtml

错误2:jdk使用的版本不对:

错误提示如下图所示:

《安卓源码的下载与编译》

解决方案:

4.4安卓源码的编译只支持Sun/Oracle版本的JDK,不支持OpenJDK,解决方案卸载原先的jdk,重新安装Sun/Oracle版本的JDK,安卓系统源码和jdk版本之间的关系如下:

《安卓源码的下载与编译》

可以看到后续的安卓版本的编译基本上都是使用的OpenJDK而不在是java JDK(也就是Sun/Oracle版本的JDK),个人估计是因为谷歌和Oracle曾因为java版权问题打过官司,因此谷歌在这件事情上开始倾向使用OpenJDK而避免出现版权纠纷。

当然还有很多其他的错误,不过因为没来得及记录下来搞忘记了,大家如果遇到了就百度吧。

PS:最好自己下载安卓源码编译而不要使用从网上别人分享的网盘下载下来的源码编译,自己在使用别人下载的源码编译的时候遇到过各种奇怪的问题,但是使用自己从谷歌官网下载的源码的时候就一次性通过。

 

打赏

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注