Ubuntu16.04编译android6.0.1源码记录

目录

目录

一、安装环境

二、下载源码

1.下载repo

2.初始化repo

3.同步源代码

关于驱动

三、编译源码

 四、导入源码到AS

五、刷入真机

六、修改源码

总结:


 

3.同步源代码

关于驱动

三、编译源码

 四、导入源码到AS

五、刷入真机

总结:


一、安装环境

1.Ubuntu16.04  内存6G 硬盘200G 源码大概在十几个G,不用aosp-laster.tar的方法去同步代码的话,硬盘空间足够用了

2.android6.0.1_r1源码下载

3.jdk7.0安装

环境配置可参考https://blog.csdn.net/pengtgimust/article/details/90758507

二、下载源码

1.下载repo

执行命令:

1mkdir ~/bin 2

加入可执行路径

1PATH=~/bin:$PATH 2

 

a.国内下载地址(推荐)

1curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo 2 3

b.科学下载地址

1curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 2 3

repo是放在新建的~/bin/目录下的

c.添加权限

1chmod a+x ~/bin/repo 2

2.初始化repo

repo init的过程主要是下载一堆manifest配置文件,项目的remote url,项目包含的所有git仓库的地址,项目的版本等等。

a.新建源码文件夹android6.0.1_r1,源码目录名随便起

1mkdir android6.0.1_r1 2cd android6.0.1_r1 3 4

b.初始化该目录repo

1repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r1 2 3

指定特定版本的Android源代码,但是在后面同步的时候下载了非常多代码,几乎把所有版本分支都同步下来,后面用一下命令只同步当前的版本的源代码

1repo init --depth=1 -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r1 2 3

--depth=1 表示只下载最近版本的代码,只保留最近的commit版本。以节省磁盘空间.

如果出错提示timeout的可以尝试下面命令:

1repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r1 --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo 2

3.同步源代码

一般用:

1repo sync -c -f --no-tags --no-clone-bundle -j`nproc` 2 3

-j 参数指定同时运行多少个job,nproc是当前计算机的处理单元个数,比如2核,最大就是4

-c 或者--current-branch表示只拉取当前分支代码,坑爹啊,我在init指定了分支,同步的时候,却给我拉了整个分支。
--no-tags 不拉取tags,tag虽然不大,但架不住多
--no-clone-bundle 不使用clone.bundle,clone.bundle是git bundle一样的打包文件,使用bundle文件可以做cdn下载的分流,cdn听上去不错,但是如果cdn到google的服务器,或者clone.bundle本来就占空间,不是很划算,所以不使用clone.bundle
-f 如果sync失败,继续同步(想想当年LZ写了一个while循环解决同步失败终止问题的)
--force-sync 如果文件目录有差异,强制覆盖掉

至此等待一个小时(看网速)你应该可以将对应的源码下下来了,如图:

接下来还有一个vendor目录源码中是没有的,就是一些驱动,如果没有,编译出来的只能在模拟器中运行,其实就是三个bash文件,去这里下载这三个文件,放在源码根目录,分别运行这三个bash文件,按空格阅读完条款,按提示输入I ACCEPT就行,运行完就会出现vendor目录.

关于驱动

上面的网站是有关各种型号的真机和android源码build版本的二进制驱动脚本,只要下载相对应的脚本,按上面的方法运行之后就会在当前文件下生成vendor目录,但是我的是nexus 5x,编译的是android6.0.1r1,网站上关于nexus5x的驱动只有7.0-8.0的驱动,所以没有可用的驱动怎么办呢?经过查找可以用官方的对应版本的工厂镜像,里面含有驱动镜像,由他生成自己的驱动.

去这里下载对应手机型号,对应android build版本的工厂镜像:

https://developers.google.com/android/images\#bullhead

然后下载这个工程:

1git clone git@github.com:anestisb/android-prepare-vendor.git 2

接着进入这个工程,执行下面的命令:

1sudo ./execute-all.sh -d bullhead -b mmb29k -o $(pwd) -i ~/nexus5x/bullhead-mmb29k-factory-c3b91ce3.zip -k 2

解释一下参数:

-d 后面是设备代号,nexus6p是angler
-b build id,分支编译时的代号
-o 输出目录
-i 下载好的谷歌工厂镜像路径
-k (保留所有提取的工厂映像和修复的数据,默认false)

注意,这里要用root权限,不然会报错.

完成后会在图中路径下生成相对应手机型号bullhead,build版本mmb29k的vendor目录,将其先转换所属者,变成当前用户,然后复制到源码根目录

1sudo chown -R username:uesername ./vender #usernamae为用户名 2cp vendor ~/android6.0.1-r1/ 3

之后开始编译源码.

三、编译源码

执行以下命令:

1export USE_CCACHE=1 2prebuilts/misc/linux-x86/ccache/ccache -M 50G 3source build/envsetup.sh 4

指定编译目标:

1yrl@Ubuntu1604:~/android6.0.1—r1$ lunch 2 3------------------------------ 4You're building on Linux 5 6Lunch menu... pick a combo: 7 1. aosp_arm-eng 8 2. aosp_arm64-eng 9 3. aosp_mips-eng 10 4. aosp_mips64-eng 11 5. aosp_x86-eng 12 6. aosp_x86_64-eng 13 7. aosp_deb-userdebug 14 8. aosp_flo-userdebug 15 9. full_fugu-userdebug 16 10. aosp_fugu-userdebug 17 11. mini_emulator_arm64-userdebug 18 12. m_e_arm-userdebug 19 13. mini_emulator_mips-userdebug 20 14. mini_emulator_x86_64-userdebug 21 15. mini_emulator_x86-userdebug 22 16. aosp_flounder-userdebug 23 17. aosp_angler-userdebug 24 18. aosp_bullhead-userdebug 25 19. aosp_hammerhead-userdebug 26 20. aosp_hammerhead_fp-userdebug 27 21. aosp_shamu-userdebug 28 29Which would you like? [aosp_arm-eng] 18 30 31

aosp_bullhead-userdebug,解释一下,最基础的在模拟器中运行选1,如果要往设备上装,bullhead是Nexus 5X的代号aosp_bullhead-userdebug表示对应设备是Nexus5X,每个设备对应的代号如下:

userdebug 是编译类型,含义如下:

user 用于正式产品
userdebug 和user类似,但是有root权限,并且可以调试,主要用于调试
eng 开发用的选项,配有额外的调试工具。

如果编译后只在模拟器上运行,则lunch时选择:1
这里我们的目标是要编译后刷入nexus 5x,所以 lunch 时选择:18

如果你不知道lunch该选哪一个,请参考下面的链接,根据第三列选择编译选项:

https://source.android.com/source/running.html

执行编译:

1make -j4 2

先前编译失败的要先清理掉:make clean

出现这个就说明编译成功.在对应的out/target/product/bullhead下会有三个img文件就说明编译成功.

编译过程中遇到的一些问题:

1问题1: 2pp frameworks/base/tools/aidl/aidl_language_y.y 3build/core/binary.mk:609: recipe for target 'out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp' failed 4make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] 断开的管道 5make: *** 正在等待未完成的任务.... 6Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l 7frameworks/base/tools/aidl/aidl_language_l.l:55: warning, 无法匹配规则 8flex-2.5.39:严重内部错误,exec of /usr/bin/m4 failed 9build/core/binary.mk:646: recipe for target 'out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp' failed 10make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 1 11make: *** Deleting file 'out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp' 12注: 某些输入文件使用或覆盖了已过时的 API。 13注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 14注: 某些输入文件使用了未经检查或不安全的操作。 15注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。 16 17 18解决办法: 19 20

1 更换软件源为阿里云

为了更快的安装软件,我们需要更换软件源为国内的软件源,这里推荐使用Ubuntu官方指定的国内软件源阿里云,具体方法是:

1sudo gedit /etc/apt/sources.list 2

在文件最前面加入下面代码:

1deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse 2deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse 3deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse 4deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse 5deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse 6deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse 7deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse 8deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse 9deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse 10deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse 11

2 安装依赖

1sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 2sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 3sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 4sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev 5sudo apt-get install git-core gnupg flex bison gperf build-essential 6sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 7sudo apt-get install libc6-dev-i386 8sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 9sudo apt-get install lib32z-dev ccache 10sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4 11

Ubuntu 16.04请务必使用上面的依赖,Ubuntu 16.04需要的依赖和Ubuntu 14.04所需要的依赖是不同的

问题2:

1clang: error: linker command failed with exit code 1 (use -v to see invocation) 2build/core/host_shared_library_internal.mk:51: recipe for target 'out/host/linux-x86/obj/lib/libart.so' failed 3make: *** [out/host/linux-x86/obj/lib/libart.so] Error 1 4make: *** 正在等待未完成的任务.... 5据说这个错误只在ubuntu16.04 上出现 6 7

修改源码

修改 mydroid/art/build/Android.common_build.mk 文件,定位到75行,注释掉75-78:  75 #ifneq ($(WITHOUT_HOST_CLANG),true)
76  # By default, host builds use clang for better warnings.
77 #  ART_HOST_CLANG := true
78 #endif

或者将两个true改为false

如果不修改这里,会遇到一个比较棘手的编译错误,修改的目的是把CLANG这个编译选项关掉,详见后面的编译记录,百度搜狗都无解,这个错误只会在Ubuntu16.04上遇到,Ubuntu14.04则不存在这个问题

问题3:

把源码换到了全英文的路径下面

问题4:

后面又出现了无法fork,无法分配内存的错误,

难道是内存太小了?make -j8开的线程太多了?尝试增大虚拟机的内存由3G到4G,结果最后还是内存不足,有增大到6G,将make -j8调成make -j2,虽然速度慢,但是最后还是成功的编译了,虽然中间出现了许多warning,虚拟机性能比较差,足足跑了七个小时,开的线程多的话会大大加快编译速度,要看机器的cpu的核数,根据自己而定.

问题5:

删掉$ HOME下的所有.jack *文件夹/设置

终于编译成功!

模拟器运行,编译成功后,不关终端的情况下直接运行:emulator

如果关闭了终端:

1source build/envsetup.sh 2lunch [选择刚刚设置的目标版本] 3emulator 4 5

 四、导入源码到AS

生成AS的项目配置文件

如果你整编过源码,查看out/host/linux-x86/framework/idegen.jar是否存在,如果不存在,进入源码根目录执行如下的命令:

source build/envsetup.sh lunch [选择整编时选择的参数或者数字] mmm development/tools/idegen/

如果没整编过源码,可以直接执行如下命令单编idegen模块:

source build/ensetup.sh
make idegen

关于Android系统源码的编译可以查看Android AOSP基础(三)Android系统源码的整编和单编这篇文章。

idegen模块编译成功后,会在 out/host/linux-x86/framework目录下生成idegen.jar,执行如下命令:

sudo development/tools/idegen/idegen.sh

这时会在源码根目录生成android.iml 和 android.ipr 两个文件,这两个文件一般是只读模式,这里建议改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况。

sudo chmod 777 android.iml sudo chmod 777 android.ipr

配置AS的项目配置文件

由于要将所有源码导入AS会导致第一次加载很慢,可以在android.iml中修改excludeFolder配置,将不需要看的源码排除掉。等源码项目加载完成后,还可以通过AS对Exclude的Module进行调整。如果你的电脑的性能很好,可以不用进行配置。
在android.iml中搜索excludeFolder,在下面加入这些配置。

<excludeFolder url="file://$MODULE_DIR$/bionic" /> <excludeFolder url="file://$MODULE_DIR$/bootable" /> <excludeFolder url="file://$MODULE_DIR$/build" /> <excludeFolder url="file://$MODULE_DIR$/cts" /> <excludeFolder url="file://$MODULE_DIR$/dalvik" /> <excludeFolder url="file://$MODULE_DIR$/developers" /> <excludeFolder url="file://$MODULE_DIR$/development" /> <excludeFolder url="file://$MODULE_DIR$/device" /> <excludeFolder url="file://$MODULE_DIR$/docs" /> <excludeFolder url="file://$MODULE_DIR$/external" /> <excludeFolder url="file://$MODULE_DIR$/hardware" /> <excludeFolder url="file://$MODULE_DIR$/kernel" /> <excludeFolder url="file://$MODULE_DIR$/out" /> <excludeFolder url="file://$MODULE_DIR$/pdk" /> <excludeFolder url="file://$MODULE_DIR$/platform_testing" /> <excludeFolder url="file://$MODULE_DIR$/prebuilts" /> <excludeFolder url="file://$MODULE_DIR$/sdk" /> <excludeFolder url="file://$MODULE_DIR$/system" /> <excludeFolder url="file://$MODULE_DIR$/test" /> <excludeFolder url="file://$MODULE_DIR$/toolchain" /> <excludeFolder url="file://$MODULE_DIR$/tools" /> <excludeFolder url="file://$MODULE_DIR$/.repo" />

导入系统源代码到AS中

在AS安装目录的bin目录下,打开studio64.vmoptions文件,根据自己电脑的实际情况进行设置,这里修改为如下数值:

-Xms1024m -Xmx1024m

如果你是在VirtualBox中下载的系统源码,那么将VirtualBox中的系统源码拷贝到共享文件夹中,这样源码就会自动到Windows或者Mac上,如果你不知道如何设置VirtualBox共享文件夹,可以查看Android AOSP基础(一)VirtualBox 安装 Ubuntu这篇文章。
通过AS的Open an existing Android Studio project选项选择android.ipr 就可以导入源码,这里我用了大概7分钟就导入完毕。导入后工程目录切换为Project选项就可以查看源码。

五、刷入真机

首先检测ubuntu下面fastboot可不可以用,在SDK/platform-tools/将这个路径加入ubuntu环境变量

1sudo gedit /etc/profile 2

在里面添加:

1export PATH=/home/***/***/Sdk/platform-tools:$PATH 2

之后执行:

1source /etc/profile 2

这样下面的工具就可以用了,比如adb fastboot等

让手机进入fastboot模式,可以手动(音量减+电源键),或输入adb命令

1adb reboot bootloader 2

运行查看fastboot是否能检测到设备:

1fastboot devices 2

结果显示:

no permissions (user in plugdev group; are your udev rules wrong?

没有权限?经过查找文章,最终找到了解决方法:

很多都说是没有权限,说sudo fastboot devices就可以了,结果根本不行,还有的说是执行

lsusb

将自己的设备ID加入到/etc/udev/rules.d/11-android.rules(.rules文件可以新建)

1SUBSYSTEMS=="usb", ATTRS{idVendor}=="18d1", MODE="0660" 2

然后赋予其权限,执行

1sudo service udev restart 2

之后再查看fastboot devices应该就可以了,但是对我还是不行,最后找到了github上的文章

按照这个方法安装之后,再查看发现已经可以了,其实这个仓库就一个文件

151-android.rules这个规则文件,里面把所有的idVendor写进去了,所以不管你的idVendor是啥都能检测到 2

之后就是刷系统了

将编译好的源码路径写入环境变量

1sudo gedit /etc/profile 2

添加到文件末:

1export ANDROID_PRODUCT_OUT="/home/yrl/android6.0.1-r1/out/target/product/bullhead" 2

再执行:

1source /etc/profile 2

注意:当前不会立即生效,需要注销当前用户重新进入才可生效!

之后就是刷入系统了,执行

1fastboot -w flashall 2

这里成功不成功关键就在于你编译的时候lunch选择对不对,第一次我没有选对就提示了

checking product failed!

device is “bullhead”

Update require ‘ ’

..........

所以要选对lunch,如果到这里你就需要重新选择lunch的版本,重新编译,当然想要安装到真机上需要按照上面的驱动步骤下载相关驱动(源码下的vendor目录)

又是经过漫长的等待,再编译一次,这里我用的是Mac笔记本,内存12G,编译环境是ubuntu16.04虚拟机,内存6G,2核CPU,经过漫长的6个多小时,终于编译成功,中间会出现一些错误,无法分配内存,是之前的内存4G太小了.

先说一下刷机的几个步骤:

  1. adb重启静如bootloader
  2. 解开设备锁
  3. 刷机

首先进入fastloader模式:

1adb reboot bootloader 2

进入后手机会显示bootloader解锁状态,如果是locked就需要解锁了

解锁:

1对于新款设备(2015 年及之后发布的设备): 2fastboot flashing unlock 3 4对于老款设备(2014 年及之前发布的设备): 5fastboot oem unlock 6 7在屏幕上确认解锁。 8注意:在 Nexus 10 上,解锁引导加载程序后,内部存储空间仍将保持未格式化状态。您可以依次使用 fastboot format cache 和 fastboot format userdata 来格式化设备。 9 10

刷完机记得上锁,其实上不上锁也无所谓,了解一下

1重新锁定引导加载程序 2要重新锁定引导加载程序,请执行以下命令: 3 4对于新款设备(2015 年及之后发布的设备): 5fastboot flashing lock 6 7对于老款设备(2014 年及之前发布的设备): 8fastboot oem lock 9

解完锁,之后就是刷机了:

正常的顺序:

  1. 检查源码的product目录,具体可能检查设备和编译的源码版本是否一致(就是上面说的lunch选择的对不对)
  2. 检查version-bootloader版本
  3. 检查version-baseband版本
  4. 一次刷入boot、recovery、system、vendor、userdata、cache
  5. 重启bootloader

 1.刷机命令,他会将目录下所有的img镜像刷入

1fastboot -w flashall 2

第一次是由于源码编译的版本不对(lunch选择的不对),停止了,见上面的错误信息,经过编译后第二步又出错:

1yrl@yrl-virtual-machine:~/android6.0.1-r1$ fastboot -w flashall 2-------------------------------------------- 3Bootloader Version...: BHZ10r 4Baseband Version.....: M8994F-2.6.32.1.13 5Serial Number........: 01be7e27a275ce93 6-------------------------------------------- 7Checking 'product' OKAY [ 0.019s] 8Checking 'version-bootloader' FAILED 9 10Device version-bootloader is 'BHZ10r'. 11Update requires 'BHZ10k'. 12 13fastboot: error: requirements not met! 14 15

提示bootloader版本不一致,查了半天没结果,最后在编译出来的bullhead文件夹下的android-info.txt里面找到了这个定义的文件:

1require board=bullhead 2require version-bootloader=BHZ10k 3require version-baseband=M8994F-2.6.30.0.68 4

尝试将其改为和设备一致BHZ10r,再次刷入,又有问题:

1-------------------------------------------- 2Bootloader Version...: BHZ10r 3Baseband Version.....: M8994F-2.6.32.1.13 4Serial Number........: 01be7e27a275ce93 5-------------------------------------------- 6Checking 'product' OKAY [ 0.017s] 7Checking 'version-bootloader' OKAY [ 0.032s] 8Checking 'version-baseband' FAILED 9 10Device version-baseband is 'M8994F-2.6.32.1.13'. 11Update requires 'M8994F-2.6.30.0.68'. 12 13fastboot: error: requirements not met! 14 15

又是版本不对,再次修改和设备版本一致,再次刷入,猜想这样修改会不会导致刷入失败?上面还有一个叫Serial Number........: 01be7e27a275ce93的不是md5校验吗?修改了肯定不对啊,不管了,舍不得孩子套不住狼,可怜我刚买的nexus5x,刷成砖就凉了,再次刷入.果然没有在提示错误:

1-------------------------------------------- 2Bootloader Version...: BHZ10r 3Baseband Version.....: M8994F-2.6.32.1.13 4Serial Number........: 01be7e27a275ce93 5-------------------------------------------- 6Checking 'product' OKAY [ 0.050s] 7Checking 'version-bootloader' OKAY [ 0.020s] 8Checking 'version-baseband' OKAY [ 0.020s] 9Sending 'boot' (11461 KB) OKAY [ 15.432s] 10Writing 'boot' OKAY [ 0.117s] 11Sending 'recovery' (12517 KB) OKAY [ 8.631s] 12Writing 'recovery' OKAY [ 0.141s] 13Sending sparse 'system' 1/2 (524262 KB) OKAY [100.476s] 14Writing 'system' OKAY [ 6.510s] 15Sending sparse 'system' 2/2 (296569 KB) OKAY [ 45.088s] 16 17

这个过程一致胆战心惊,害怕出错,结果.........说曹操曹操就到,果然出错了:

1Sending sparse 'system' 2/2 (296569 KB) OKAY [ 45.088s] 2Writing 'system' OKAY [ 3.674s] 3Sending 'vendor' (190689 KB) OKAY [ 18.482s] 4Writing 'vendor' OKAY [ 2.453s] 5Erasing 'userdata' OKAY [ 1.038s] 6mke2fs 1.45.4 (23-Sep-2019) 7Creating filesystem with 6661115 4k blocks and 1667904 inodes 8Filesystem UUID: 57a4416a-80cb-4eb1-96b2-758de1da6238 9Superblock backups stored on blocks: 10 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 11 4096000 12 13Allocating group tables: done 14Writing inode tables: done 15Creating journal (32768 blocks): done 16Writing superblocks and filesystem accounting information: done 17 18Sending 'userdata' (4272 KB) OKAY [ 0.646s] 19Writing 'userdata' FAILED (remote: 'Bogus size sparse and chunk header') 20 21

在刷入userdata的时候提示错误,看提示有可能是快太大了,受不了?哈哈,经过查找原因,有人说哪个地方错了就把错误的地方一个一个重新刷入,试一试呗,都这样了:

1fastboot erase userdata 2fastboot flash userdata userdata.img 3fastboot erase cache 4fastboot flash cache cache.img 5
1yrl@yrl-virtual-machine:~/android6.0.1-r1/out/target/product/bullhead$ fastboot erase userdata 2******** Did you mean to fastboot format this ext4 partition? 3Erasing 'userdata' OKAY [ 0.467s] 4Finished. Total time: 0.497s 5yrl@yrl-virtual-machine:~/android6.0.1-r1/out/target/product/bullhead$ fastboot flash userdata userdata.img 6Sending 'userdata' (137774 KB) OKAY [ 14.647s] 7Writing 'userdata' OKAY [ 1.340s] 8Finished. Total time: 16.035s 9yrl@yrl-virtual-machine:~/android6.0.1-r1/out/target/product/bullhead$ fastboot erase cache 10******** Did you mean to fastboot format this ext4 partition? 11Erasing 'cache' OKAY [ 0.071s] 12Finished. Total time: 0.101s 13yrl@yrl-virtual-machine:~/android6.0.1-r1/out/target/product/bullhead$ fastboot flash cache cache.img 14Sending 'cache' (5688 KB) OKAY [ 0.643s] 15Writing 'cache' OKAY [ 0.071s] 16Finished. Total time: 1.170s 17yrl@yrl-virtual-machine:~/android6.0.1-r1/out/target/product/bullhead$ fastboot reboot 18Rebooting OKAY [ 0.009s] 19Finished. Total time: 0.297s 20 21

最后fastboot reboot,重启,激动人心的时刻到了,是否能成功进入系统呢?经过一小段很长的等待,内心焦虑,终于...........进入系统了,而且功能还都正常,就是界面没有原来的好看了,是最原始的谷歌系统.来张帅图:

六、修改源码

顺便说一下调试源码的framework层和用AS调试app过程一样,先启动DDMS进行端口转发,然后启动AS进行远程连接,就可以像调试app一样调试源码。

修改源码在AS终究可以实现,AS还会有一些提示,就和平常开发一样会有一些错误提示,这对修改源码来说已经很有帮助了。之后就是通过调试找到想要修改的地方就行。

以下是修改源码过程出现的问题:

1.修改完源码后mmm单独编译某个模块,出现依赖“xxxx”needed by “xxxxxx”,解决方法目前是整编译,后面看看有没有单独编译模块的方法。就算单模块编译成功后,make snod 生成新的system.img镜像刷入真机导致开机卡logo,需要整编译之后就行安装,后面还要看看单独编译生成的system.img怎么成功刷入真机。

2.修改某一个api后,编译会报一些类似于说您已更新某某API,请检查checktext或让你更新api

执行 make update-api

3.编译成功后再次修改源码,没有make clean(为了提高变异速度就没有make clean),结果出现以下找不到符号等错误

为什么之前可以用,修改完之后AS可以找到相应的包,而编译的时候却报错呢?想了一下可能是整编的时候符号链接到了,但是你再次修改,import的包没有被链接进去,导致之前的可以用,而你新添加的却找不到对应包名,所以还需要全编译一遍。

**注:**只要修改代码不涉及导入包名,类内部的代码随便修改,只要涉及新的包名的导入必须把相关的模块(有依赖的模块)重新编译,简单的办法就是全编译一遍。

下面附上我参考的链接:

  1. 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机   参考了真机驱动的下载与生成等问题

android编译系统源码  参考了userdata刷机失败的问题

nexus 5 刷机   参考了刷机步骤

Android 6.0源码编译及烧录到真机过程记录   参考编译过程

Ubuntu16.04编译Android 6.0系统源码过程简要记录总结   参考一些依赖

总结:

       这次从下载源码,编译,模拟器运行,导入AS查看源码,调试,到烧录到真机,可谓过程艰辛,不过收获到了很多不知道的东西,最后成功安装到了真机,还真是很开心的呢,在一步就是调试源码,研究修改源码了,再接再厉吧!

代码交流 2021