Ubuntu16.04编译Android源码系列二—— android 5.1和android 6.0及踩坑

前言

本文不涉及源码的下载,主要记录自己的编译源码过程及其中遇到的问题,并最终运行在真机上。

通用的aosp具体的编译步骤已经在上一篇博客详细描述过了,链接如下:

https://blog.csdn.net/u012195899/article/details/82078384#comments

本篇博客只针对android 5和android 6的编译差别进行描述。

预置环境

1、ubuntu16.04,8G内存,2T硬盘

2、手机真机nexus 5x(刷入android 6), nexus 5(刷入android5)

3、编译源码版本为android-5.1.1_r14和android-6.0.1_r45两个

版本选择参考链接:https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds,根据你的真机型号选择对应的源码版本。

本文是基于之前的编译环境继续编译5.1和6.0版本,如果你没有编译过7.1和4.4版本,有可能会缺少某些包,可以参考上一篇文章。

编译要求

1 编译android-5.1.1版本

1)要求

a. jdk版本

android 9以上版本的master分支自带预编译版本的jdk,而旧版aosp需要自行安装相应版本的jdk,具体旧版jdk参考链接:

https://source.android.google.cn/setup/build/older-versions

JDK

  • Android 7.0 (Nougat) - Android 8.0 (Oreo):Ubuntu -OpenJDK 8;Mac OS - jdk 8u45 或更高版本
  • Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
  • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
  • Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5

此时在Ubuntu上编译android 5.x,因此选择对应的OpenJDK7版本。

执行命令安装:

//正常来说命令行配置jre即可
sudo apt-get install openjdk-8-jre
//但我同时安装了jdk
sudo apt-get install openjdk-8-jdk

执行以下命令切换当前jdk版本,具体操作可以自行google

sudo update-alternatives --config java

执行命令查看是否安装成功:

java -version
javac -version

2) 下载驱动

如上一篇博客所述,驱动仍然是image和二进制两种方式,这里我采用的是二进制自己编译这种方式,比较稳定。

因为要刷入到真机nexus,因此需要下载android-5.1.1_r14对应的vendor驱动,具体步骤如下:

在链接https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds中查找android-5.1.1_r14的版本代号为LMY48M, 在driver链接https://developers.google.cn/android/drivers搜索版本代号LMY48M,注意这里会存在该代号对应不同机型的驱动,我们根据要刷入的具体手机机型选择Nexus 5 (GSM/LTE) binaries for Android 5.1.1 (LMY48M)这个版本的驱动,如下图所示

Ubuntu16.04编译Android源码系列二—— android 5.1和android 6.0及踩坑_第1张图片

如图所示,下载Broadcom、LG、Qualcomm三个链接,复制到编译目录根路径下,分别解压得到三个.sh文件,分别执行.sh文件,每一个.sh文件需要阅读一些东西,然后最后会让你确认是否接受,输入I ACCEPT即可。执行完三个.sh文件后,会看到源码目录下新增文件夹vendor,并且vendor下包括了下载文件的三个同名文件夹。

3)编译执行

a、执行. build/envsetup.sh初始化编译环境

b、执行lunch命令选择编译目标版本(本次运行在nexus 5手机上,因此选择hammerhead版本,具体手机机型跟代号的对应关系上篇博客有讲过)

c、执行time make -j8开始编译

4)刷机

编译成功后,进入out/target/product/hammerhead目录,依次执行以下命令即可。

//进入手机bootloader
adb reboot bootloader
 
//开始刷机
fastboot flash boot boot.img
 
fastboot flash system system.img
 
fastboot flash cache cache.img
 
fastboot flash userdata userdata.img
 
fastboot flash recovery recovery.img
//启动
fastboot reboot

5)编译5.1踩坑

a、

clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1
make: *** Waiting for unfinished jobs....
host C++: dalvikvm <= art/dalvikvm/dalvikvm.cc

修复:

cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

b、

You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
      errors above.

   2) You can update current.txt by executing the following command:
         make update-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.

修复:这个报错可能是因为我个人编译的时候修改了源码,增加了部分公开类和方法,因此需要更新api,根据提示执行make update-api即可

c、

unable to remove 'out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/javalib.jar': No such file or directory
make: *** [out/target/common/obj/JAVA_LIBRARIES/android-support-v13_intermediates/javalib.jar] Error 1

修复:有时候更新后会出现一些莫名其妙的错误,这个时候就把之前生成的中间文件全部清楚,重来一遍。清楚后重新编比较耗时,谨慎操作。具体命令如下,依次执行即可:

make clobber

make update-api

time make -j8

编译android-6.0.1_r45版本

1)要求

JDK版本,根据前面的版本知道跟android 5一样,这里就不赘述了。

JDK

  • Android 7.0 (Nougat) - Android 8.0 (Oreo):Ubuntu -OpenJDK 8;Mac OS - jdk 8u45 或更高版本
  • Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7;Mac OS - jdk-7u71-macosx-x64.dmg
  • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Ubuntu - Java JDK 6;Mac OS - Java JDK 6
  • Android 1.5 (Cupcake) - Android 2.2.x (Froyo):Ubuntu - Java JDK 5

2)下载驱动

根据以上描述的步骤

先在链接中https://source.android.google.cn/setup/start/build-numbers#source-code-tags-and-builds查找到android-6.0.1_r45对应的代号MTC19V

然后在二进制驱动链接https://developers.google.cn/android/drivers中查找MTC19V,发现没有找到相应的二进制驱动(这是因为google对android 6就没有提供对应的二进制驱动文件)

因此我们只能选择直接刷入image的方式,在iamge链接https://developers.google.cn/android/images中查找MTC19V,因为我们刷入的机型为nexus 5x,找到对应bullhead的image文件下载,如下图所示

Ubuntu16.04编译Android源码系列二—— android 5.1和android 6.0及踩坑_第2张图片

根据MTC19V对应的link下载image压缩文件,解压bullhead-mtc19v-factory-61de3a6f.zip

3) 编译执行

a、执行. build/envsetup.sh初始化编译环境

b、执行lunch命令选择编译目标版本(本次运行在nexus 5x手机上,因此选择bullhead版本,具体手机机型跟代号的对应关系上篇博客有讲过)

c、执行time make -j8开始编译

4)刷机

编译成功后,进入out/target/product/bullhead目录,可以看到生成了boot.img, cache.image, recovery.image, system.image, userdata.img,没有vendor.image。

所以需要先从之前下载的bullhead-mtc19v-factory-61de3a6f.zip文件中解压出image文件,依次执行以下命令即可。

// 进入解压后的系统镜像,刷入google提供的原生镜像
sh flash-all.sh
// 这一步虽然将整个系统全部重刷,实际目的只是为了刷入可用的vendor.img(之前我单独刷vendor包,
// 然后刷入自己编译的image,系统启动失败),时间比较久,你可以来杯咖啡,刷好之后会自动启动手机


//使用快捷键进入fastboot boot模式, 开始刷入我们自己编译的镜像文件
fastboot flash boot boot.img
 
fastboot flash system system.img
 
fastboot flash cache cache.img
 
fastboot flash userdata userdata.img
 
fastboot flash recovery recovery.img

//启动
fastboot reboot

5)编译6.0踩坑

a、*** [out/host/linux-x86/obj/lib/libartd.so] Error 1

修复:

修改配置文件:art/build/Android.common_build.mk

搜索关键字符串:WITHOUT_HOST_CLANG,
ART_HOST_CLANG := true修改为
ART_HOST_CLANG := false

修改后的相应配置如下:

# Host.
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
  # By default, host builds use clang for better warnings.
  ART_HOST_CLANG := false
endif

你可能感兴趣的:(ubuntu16.04,源码编译,android源码,android)