Android AOSP 6.0.1编译、刷机,开启源码学习的First Step

    xiaoxiao2021-12-14  23

    一、概述

    编译android源码强烈建议在Linux操作系统下,最好在物理机器上安装Linux操作系统,笔者使用发行版ubuntu 16.04作为PC系统,不建议在win上安装虚拟机vmvare解决,因为稳定性大打折扣,笔者曾经不知所以虚拟机上的操作系统就挂掉了,如果打算研究源码,物理机器上安装双系统或者仅仅安装Linux,作为开发者建议使用Linux,不要问我为什么。

    有了Linux操作系统还是不够的,这只表明你可以下载编译android源码了,如果想了解源码,那么一部nexus手机就是必备的,当然现在google已经不再发布nexus系列了,可以购买最新版的Pixel系列手机,总之,android开发者尽量使用太子是好事,如果你的app兼容太子,那么其他第三方ROM手机支持不好,那一定是他们把源码改乱了,很大程度和我们关系不大,有时需要做专门的适配工作,但首先应该适配的永远是太子系列。纸上得来终觉浅,绝知此事要躬行。只有自己编译源码,打入Log查看运行流程,才能理清楚源码工作的一些细枝末节,这部手机基本是必备的。

    良好的网络环境,最好科学上网。我这里介绍的是使用国内镜像下载对应分支的源码。笔者使用安装ubuntu 16.04 PC一台,Nexus 5手机一台,高品质数据线一根,使用清华的源码镜像。

    二、ubuntu操作系统安装

    作为使用广泛的linux发行版之一,ubuntu广受欢迎,目前的最新稳定版本为16.04,可以到http://cn.ubuntu.com/download/乌班图官网下载。网络上制作U盘系统的工具很多按照步骤制作即可,安装的时候用u盘启动,一直提示:vesamenu.c32:not a COM32R image无法进行下一步,则直接输入live回车即可。

    三、下载源码工具准备

    在Linux平台下进行Android系统项目开发时,需要git和repo管理。

    Git和Repo的区别:

    Git:Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。

    Repo: Repo是谷歌用Python脚本写的调用git的一个脚本。主要是用来下载、管理Android项目的软件仓库(也就是说Repo是用来管理给Git管理的一个个仓库的)

    1.Git安装

    已安装忽略这一步骤

    apt-get install git

    2.Repo下载与使用

    下载 repo 工具:

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

    无法下载的话,先用git clone一份

    git clone https://mirrors.tuna.tsinghua.edu.cn/git/git-repo

    拷贝其中的repo脚本到你的PATH里即可,设置方式可以参照上面。

    四、下载android源码

    1.建立工作目录

    mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY

    例如笔者在用户目录下新建android-6.0.1_r72文件夹,进入这个文件夹。

    mkdir android-6.0.1_r72 cd android-6.0.1_r72

    2.下载相应版本的源码

    先查询设备支持的版本,你要下载那个版本的源码,科学上网查看https://source.android.com/source/build-numbers.html#source-code-tags-and-builds。表格如下格式,查询对应设备的相应分支。

    BuildBranchVersionSupported devicesNDE63Xandroid-7.1.0_r7NougatPixel XL, Pixel…………M4B30Xandroid-6.0.1_r72MarshmallowNexus 5…………MOB30Yandroid-6.0.1_r60MarshmallowNexus 5…………MMB29Kandroid-6.0.0_r1MarshmallowNexus 5…………

    源码下载,具体下载那个版本只需修改后面的分支名称。

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r72

    init成功后,开始漫长的同步源码树(以后只需执行这条命令来同步)。

    repo sync

    这还不够,因为很有可能出错跳出来了,我们需要一个脚本,在出问题的情况下再次执行repo sync,在当前需要下载源码的目录下新建down.sh文件,直接使用vi命令即可。

    vi down.sh

    接下来,在vi编辑器内输入下面这段脚本代码,保存退出。

    #!/bin/sh repo sync while [ $? -ne 0 ] do repo sync done

    用这段脚本执行,替换repo sync这条命令。

    ./down.sh

    N个小时过去后,终于下载好了。小水管的笔者下了15个多小时才完成。开始着手搭建源码编译环境。

    五、源码编译

    对应分支的源码下载好以后,接下来就开始激动人心的编译工作,但编译之前还需要先配置环境。

    1.搭建编译环境

    笔者环境

    Ubuntu 16.04 LTSAndroid android-6.0.1_r72分支源码Open JDK 7

    上面的两者已经具备了,那么还需要安装Open JDK 7,注意是Open JDK,并非甲骨文的Oracle JDK。

    这部分内容引自csdn博主梧桐那时雨。

    (1) 更换软件源

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

    sudo gedit /etc/apt/sources.list

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

    deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse

    (2) 安装依赖

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

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

    (3) 安装open JDK7

    由于Ubuntu 16.04没有OpenJDK7的源,因此在16.04上安装OpenJDK7需要执行下面的命令:

    sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update sudo apt-get install openjdk-7-jdk

    配置OpenJDK.打开/etc/profile文件:

    sudo gedit /etc/profile

    在末尾追加下面代码:

    export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH

    修改了/etc/profile文件需要重启才能生效,但使用下面命令可以在不重启的情况下在当前bash环境生效:

    source /etc/profile

    检查OpenJDK配置是否正确:

    java -version

    配置正确如下图:

    2.修改源码待编译

    修改android-6.0.1_r72/art/build/Android.common_build.mk 文件,定位到75行,将下面的代码改为false:

    ifneq ($(WITHOUT_HOST_CLANG),true) 改为 ifeq ($(WITHOUT_HOST_CLANG),false)

    3.下载驱动

    官网下载对应版本的驱动:https://developers.google.com/android/nexus/drivers

    我这里下载对应的M4B30X,下载成功后得到三个压缩包broadcom-hammerhead-m4b30x-7c7b231f.tgz、lge-hammerhead-m4b30x-74fa3aa5.tgz、qcom-hammerhead-m4b30x-158606cf.tgz,解压这三个压缩包,解压出来是三个sh文件,放到Android源码目录下面即android-6.0.1_r72下,然后执行。会将相关驱动放到vender目录下面。

    拷贝三个sh到源码目录:

    cp /media/lhw/LHW/extract-broadcom-hammerhead.sh /home/lhw/aosp/android-6.0.1_r72/ cp /media/lhw/LHW/extract-lge-hammerhead.sh /home/lhw/aosp/android-6.0.1_r72/ cp /media/lhw/LHW/extract-qcom-hammerhead.sh /home/lhw/aosp/android-6.0.1_r72/

    拷贝成功后,赋予执行权限

    chmod a+x extract-broadcom-hammerhead.sh chmod a+x extract-lge-hammerhead.sh chmod a+x extract-qcom-hammerhead.sh

    执行每个sh,输入I ACCEPT,最终将驱动放到vender目录待使用。

    4.开始编译

    (1) 在 .bashrc文件末尾添加:export USE_CCACHE = 1

    echo export USE_CCACHE=1 >> ~/.bashrc

    (2) 为了提高编译效率,设置编译器高速缓存:

    prebuilts/misc/linux-x86/ccache/ccache -M 50G

    (3) 接着导入编译Android源码所需的环境变量和其它参数:

    source build/envsetup.sh including device/asus/deb/vendorsetup.sh including device/asus/flo/vendorsetup.sh including device/asus/fugu/vendorsetup.sh including device/generic/mini-emulator-arm64/vendorsetup.sh including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh including device/generic/mini-emulator-mips/vendorsetup.sh including device/generic/mini-emulator-x86_64/vendorsetup.sh including device/generic/mini-emulator-x86/vendorsetup.sh including device/htc/flounder/vendorsetup.sh including device/huawei/angler/vendorsetup.sh including device/lge/bullhead/vendorsetup.sh including device/lge/hammerhead/vendorsetup.sh including device/moto/shamu/vendorsetup.sh including sdk/bash_completion/adb.bash

    (4) 运行lunch命令选择编译目标:

    lunch Lunch menu... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_mips-eng 4. aosp_mips64-eng 5. aosp_x86-eng 6. aosp_x86_64-eng 7. aosp_deb-userdebug 8. aosp_flo-userdebug 9. full_fugu-userdebug 10. aosp_fugu-userdebug 11. mini_emulator_arm64-userdebug 12. m_e_arm-userdebug 13. mini_emulator_mips-userdebug 14. mini_emulator_x86_64-userdebug 15. mini_emulator_x86-userdebug 16. aosp_flounder-userdebug 17. aosp_angler-userdebug 18. aosp_bullhead-userdebug 19. aosp_hammerhead-userdebug 20. aosp_hammerhead_fp-userdebug 21. aosp_shamu-userdebug

    选择19:

    Which would you like? [aosp_arm-eng] 19 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=6.0.1 TARGET_PRODUCT=aosp_hammerhead TARGET_BUILD_VARIANT=userdebug TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=krait TARGET_2ND_ARCH= TARGET_2ND_ARCH_VARIANT= TARGET_2ND_CPU_VARIANT= HOST_ARCH=x86_64 HOST_OS=linux HOST_OS_EXTRA=Linux-4.4.0-47-generic-x86_64-with-Ubuntu-16.04-xenial HOST_BUILD_TYPE=release BUILD_ID=M4B30X OUT_DIR=out ============================================

    (5) 开始编译,执行make -j6, 6为同时编译的线程数,一般google推荐这个数字为2倍的cpu个数再加上2,比如4核,就是10。

    make -j6

    查看cpu核心个数命令:

    cat /proc/cpuinfo

    编译结束,大功告成!首次编译花费了6个多小时,out目录会有对应的输出文件。

    五、刷机

    1.adb、fastboot命令生效

    关于这一步大家应该不陌生,android platform-tools里有adb、fastboot。具体可以到http://www.androiddevtools.cn/下载,配置环境变量,确保fastboot命令正常工作。

    2.进入recovery模式

    Nexus 5关机状态下,长按音量下键和power键,即可进入recovery模式

    3.开始刷机

    源码根目录下输入:

    fastboot -w flashall

    执行命令后输出如下:

    target reported max download size of 1073741824 bytes Creating filesystem with parameters: Size: 29236371456 Block size: 4096 Blocks per group: 32768 Inodes per group: 8192 Inode size: 256 Journal blocks: 32768 Label: Blocks: 7137786 Block groups: 218 Reserved block group size: 1024 Created filesystem with 11/1785856 inodes and 156120/7137786 blocks Creating filesystem with parameters: Size: 734003200 Block size: 4096 Blocks per group: 32768 Inodes per group: 7472 Inode size: 256 Journal blocks: 2800 Label: Blocks: 179200 Block groups: 6 Reserved block group size: 47 Created filesystem with 11/44832 inodes and 5813/179200 blocks -------------------------------------------- Bootloader Version...: HHZ20f Baseband Version.....: M8974A-2.0.50.2.29 Serial Number........: 0313b757307b7e19 -------------------------------------------- checking product... OKAY [ 0.100s] sending 'boot' (9160 KB)... OKAY [ 0.630s] writing 'boot'... OKAY [ 0.799s] sending 'recovery' (10018 KB)... OKAY [ 0.701s] writing 'recovery'... OKAY [ 0.842s] erasing 'system'... OKAY [ 1.048s] sending 'system' (406390 KB)... OKAY [ 17.923s] writing 'system'... OKAY [ 29.100s] erasing 'userdata'... OKAY [ 16.383s] sending 'userdata' (139109 KB)... OKAY [ 5.941s] writing 'userdata'... OKAY [ 9.321s] erasing 'cache'... OKAY [ 0.602s] sending 'cache' (13348 KB)... OKAY [ 0.760s] writing 'cache'... OKAY [ 1.064s] rebooting... finished. total time: 86.021s

    总记86.021s,通过fastboot命令将boot.img、recovery.img、system.img等镜像文件写入了手机,手机自动重启,这时候比平时要慢一些。

    首次开机:

    没有谷歌全家桶的桌面:

    再来看看设置,Build number 中可以看到M4B30X,这是google支持nexus 5最新的代码了,官方不再更新。

    由于编译的是userdebug版本,系统已经自带root权限,我们来看一下。

    adb root

    输出adbd is already running as root,一切正常,以后可以通过只烧写部分模块查看修改了,毕竟全编太耗时了。

    以上就是从PC乌班图系统安装到安卓源码下载,再到编译和刷机的所有内容,万里长征的第一步,以后就可以随心所欲的源码探索之旅了。


    参考资料

    1.http://blog.csdn.net/stevenhu_223/article/details/8828130

    2.http://blog.csdn.net/fuchaosz/article/details/51487585

    tyyj90 认证博客专家 安卓全栈开发 Android高级开发工程师,熟悉App开发,熟悉Framework定制开发,略了解Linux内核。开发使用的语言涉及Java、Kotlin、C/C++、Python和汇编NEON指令集。
    转载请注明原文地址: https://ju.6miu.com/read-968912.html

    最新回复(0)