Build LineageOS/CM/AOSP on Ubuntu

2016-12-01(四) by chenjia.me

最新更新

由于CM改为Lineage OS,所有指向CM的连接请自动替换为Lineage的连接 Lineage OS Build for THEA

目的

经过好几次重装,重新编译,熟悉了CM13-CM14.1各个版本的编译过程。故在今天写一个总结,以防技术失传,让学弟多走弯路。

官方教程

CM也是基于AOSP修改的,所以看官方的教程总是没错的。

注意,由于Google和Oracle各种打架,所以各个Android版本,各个Linux版本编译所需要的Java环境都是不一样的,请一定要根据自己的编译的版本多加判定。具体配置对应关系可以参照Google官方文档

CM不同进行有不同的代号,可以通过google关键词CM + 手机型号 看看具体的代号,如果不在CM的官方支持中,那么内核和驱动就得自己找有没有开源的了(基本希望不大)。同理CM的WIKI也可以通过相同的方法进行查找,不同机型主要提醒在编译之前下载内核代码不同和编译时候指定的机型不同

在Ubuntu上编译CM代码(或者AOSP代码)

两者基本是一样的,只是CM修改了很多AOSP的代码,然后把代码托管在github上了,但是同步的时候除了速度不一样,其实是无感知的。第二个不同就是CM下载多了一步下载机型对应的内核和驱动代码,AOSP自带Google全家机型驱动。并且支持直接编译模拟器镜像

编译系统和机器

  • Ubuntu14.04或者16.04为好~毕竟是LTS版本
  • CPU快决定编译速度快,内存至少8G,不然最新版本ninja一编译直接OOM,硬盘快写入编译文件就快~

初始化仓库

  1. 安装GIT sudo apt-get install git

  2. 配置git用户名和邮箱

    $ git config --global user.name "Your Name" $ git config --global user.email "you@example.com"

  3. 下载Repo:

    $ mkdir ~/bin
    $ PATH=~/bin:$PATH
    $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo
    
  4. 创建工作目录并进入

  5. 重点步骤 >这一步,如果你想下载全部代码,也就是想在本地直接切换Android的所有代码,那么你就直接init,如果只是想要下载一个分支,请使用-b来指定分支,这样代码量会小很多。

    下载全部的代码:$ repo init -u https://android.googlesource.com/platform/manifest

    下载某个分支的代码$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

    CM下载某一个分支的代码,一般看Github上你所要的机型仓库中的分支支持到哪个版本了,例如如果真要下载CM14.1的代码,那么使用$ repo init -u https://github.com/CyanogenMod/android.git -b cm-14.1就可以了

    如果只是想要AOSP的代码,那么可以直接使用清华的帮助中的网址进行初始化,下载会快非常多。

  6. 初始化仓库后,使用repo sync就可以同步代码了,网络不稳定会导致中断,需要手动再启动,有个自动的脚本忘记了,基本思路是命令返回非0状态就继续执行步骤。

    CM代码在初始化结束后,可以使用vim .repo/manifest.xml修改Google地址为清华镜像地址

      <manifest>
        <remote  name="aosp"
    -           fetch="https://android.googlesource.com"
    +           fetch="https://aosp.tuna.tsinghua.edu.cn"
            review="android-review.googlesource.com" />
    
      <remote  name="github"
    

    Repo命令支持HTTP代理,使用

    $ export HTTP_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>
    $ export HTTPS_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>
    
  7. 当代码同步结束后,文件夹就不是空的了,这时候使用source build/envsetup.sh初始化编译工具的变量和环境

  8. (CM独有)同步代码后要继续同步编译机型的内核和驱动代码,这里以THEA机型为例:

    使用breakfest thea下载,由于部分机型github的xml可能右缺失,导致最后出错,具体机型找其Github维护或者自行查找相关库添加。

    其中Thea机型在CM14之前需要在./repo/local_manifests/roomservice.xml(该文件在运行reakfest命令后出现)中添加:

      <project name="TheMuppets/proprietary_vendor_motorola" path="vendor/motorola" remote="github" />
    

    CM14及以后版本还需要添加:

      <project name="TheMuppets/proprietary_vendor_qcom_binaries" path="vendor/qcom/binaries" remote="github" />
    

    export USE_CCACHE=1 添加后再运行breakfest thea即可

  9. 到达这步后,代码都已经下载完整了,现在就需要安装对应的Java版本了,各个版本需要的Java版本Ubuntu对应安装过程

  10. 安装其他需要的编译环境库:由于环境不断变化,请查看Installing required packages章节来获取最新依赖库

  11. 现在开始这是编译相关项目,首先是CCache,如果关心具体参数请看CCACHE参数

    export USE_CCACHE=1
    prebuilts/misc/linux-x86/ccache/ccache -M 50G
    
  12. 如果你在内存8g或者以下机器编译Android7.0及以上版本,请先运行以下参数来防止OOM,大小自己调整,我展示的是8G内存机器的参数

    ./prebuilts/sdk/tools/jack-admin stop-server
    export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4
    ./prebuilts/sdk/tools/jack-admin start-server
    
  13. (CM独有)今天终于找到了Gello.apk编译错误的原因了,是Ubuntu默认没有cm maven仓库的证书链,导致下载的时候证书验证出错,解决方法如下:

    首先先wget https://maven.cyanogenmod.org/artifactory/gello_prebuilds/org/cyanogenmod/gello/40/gello-40.apk查看是否有证书错误,如果提示证书链无法验证,请用Firefox打开https://maven.cyanogenmod.org/artifactory/gello_prebuilds/,点击网址前面的锁头,点击更多信息,安全,查看证书,详细信息,然后把GeoTrustCA和RapidSSL CA的证书保存下来,并将其放入/usr/share/ca-certificates/下,然后运行sudo dpkg-reconfigure ca-certificates,选择YES导入这两个证书,然后运行wget命令查看,不报错即可。 14. 激动人心的时刻到了,开始编译: AOSP :

      lunch 
      //选择要编译的版本,调试的话选择eng,userdebug可以获取root权限,user就是给普通用户有大量限制
      make -j4 //这里开始编译,线程数目是CPU线程乘以2为佳
    

    CM :

      $ croot
      $ brunch thea //thea换成对应型号
    
  14. 等待编译结束,编译后的文件在out目录中

  15. (AOSP独有)如果要运行模拟器,直接在编译后运行emulator即可
  16. (CM独有)在输出目录中,可以找到日期开头的zip文件,就是生成的刷机包,放入手机可以直接用recovery刷入即可

更新代码

无聊的时候可以使用repo sync同步最新代码,记得先repo diff > xxx.diff来保存你修改后的代码,同步冲突的时候可以根据错误,到对应的目录中先commit你的修改,同步的时候repo会自动丢弃你的提交。

修改代码

先了解结构,再了解原理,最后查找修改点


Comments