0%

Docker容器编译LineageOS笔记

编译环境

  • 运行内存至少8G,运行内存太小会导致编译过程出现奇怪错误
  • JDK(本文编译的为cm-14.1,即Android 7.1,因此需要JDK8,Android6及之前的需要更早的JDK版本)
  • 区分大小写的文件系统,MacOS和Windows默认的文件系统不区分大小写,使用不区分大小写文件系统编译Android会出错。docker容器中,建议直接docker里面的目录下编译,而不是挂载宿主机的目录下编译
  • 建议使用非root用户编译

准备开始

  • Docker Destop中设置容器内存至少8G,拉取ubuntu镜像

    1
    docker pull ubuntu:20.04
  • 创建并连接到容器

  • 安装依赖

    1
    sudo apt install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev bsdmainutils

    如果编译出现缺少libncurses.so.5错误,可在bash下运行sudo apt install libncurses*

  • 安装OpenJDK-8

    1
    sudo apt install openjdk-8-jdk
  • 如果有其他版本JDK,可以使用update-alternatives切换JDK

    1
    sudo update-alternatives --config java
  • 安装其他一些常用命令

    1
    sudo apt install -y wget unzip net-tools inetutils-ping lsof screen adb
  • 安装repo

    1
    2
    3
    mkdir $HOME/bin
    sudo curl https://storage.googleapis.com/git-repo-downloads/repo > $HOME/bin/repo
    chmod a+x $HOME/bin/repo
  • 在.bashrc或者.zshrc中加入export PATH=$HOME/bin:$​PATH

  • 创建工作目录

    1
    mkdir -p /media/android
  • 初始化

    1
    2
    cd /media/android
    repo init -u git://github.com/LineageOS/android.git -b cm-14.1
  • 修改AOSP源为清华或者其他次级镜像

    1
    vi .repo/manifests/default.xml
  • 1
    2
    3
    <remote  name="aosp"
    fetch="https://android.googlesource.com"
    revision="refs/tags/android-7.1.2_r36" />
  • 修改为

    1
    2
    3
    <remote  name="aosp"
    fetch="https://aosp.tuna.tsinghua.edu.cn"
    revision="refs/tags/android-7.1.2_r36" />

    或者

    1
    2
    3
    <remote  name="aosp"
    fetch="git://ip.to.mirror"
    revision="refs/tags/android-7.1.2_r36" />

    这里可以改为用的自己搭建的aosp次级镜像

  • LineageOS源也可改为清华的,但这里维持默认github的即可

  • 开始同步

    1
    repo sync

开始编译

  • 正式开始前还需要获取手机的proprietary文件,而且还需要手机先刷入网上的cm-14.1 rom包。。

  • 下载并刷入官方的cm-14.1的包,启动手机进入开发者模式,打开USB调试,并启用网络ADB调试,手机连接到跟docker容器宿主机同一局域网下

    获取proprietary的脚本原理是利用adb拉取手机上的文件,而adb可以usb或者网络连接,因此不一定需要usb连接到电脑,所以就不用考虑docker容器中怎么usb连接手机的问题

  • 手机开发者选项中启用root(否则部分文件无法获取)

  • docker中adb连接手机,运行以下命令使用通过网络方式连接到手机

    1
    adb connect 192.168.2.148:5555 # 192.168.2.148:5555改为你的手机adb server地址和端口
  • 运行device/厂商/手机代号/extract-files.sh,例如这里编译的为nexus 5

    1
    bash device/lge/hammerhead/extract-files.sh
  • 如果没有相应的device文件,需要先运行brunch 手机代号,然后会自动从github上拉取相应的机型的device文件,前提是LineageOS官方github里面有收录这个机型的device文件,否则就得从其他地方自行获取了

    1
    brunch hammerhead
  • 实际运行extract-files.sh过程中,发现可能还是会缺一些.so文件,这里测试的就缺少了一个vendor/lib/libfrsdk.so文件,但手机上刷的cm14 ROM后确实没有这个文件,这时候可能就得根据手机代号/型号从github或者谷歌找别人弄好的proprietary文件,从那里获取缺失的.so文件

  • 例如这里github上刚好找到nexus一个cm14.1的proprietary_vendor_lge_hammerhead.git,因为版本号一致,所以可以直接用这里面的hammerhead文件夹放到vendor/lge/下

  • 获取完proprietary文件后,运行brunch hammerhead,即可开始编译

编译中遇到的错误及解决


  • make: [out/build-aosp_arm.ninja] Killed

    1
    2
    3
    4
    5
    6
    frameworks/av/camera/cameraserver/Android.mk:18: Target has integrated cameraserver into mediaserver. This is weakening security measures introduced in 7.0
    find: '/media/android/out/target/common/obj/SHARED_LIBRARIES/libwifi-hal-mock_intermediates': No such file or directory
    build/core/ninja.mk:167: recipe for target 'out/build-aosp_arm.ninja' failed
    make: *** [out/build-aosp_arm.ninja] Killed

    #### make failed to build some targets (24) ####
  • 一个很莫名其妙的错误,一眼看上去不知道错哪,没有明确的报错信息。排了很久,一开始还以为是上面的"find ... No such file or directory",缺某个文件导致的,最后发现跟这个无关,不管怎样都会报这个。最终发现原因是运行内存太小了。一开始编译用的docker容器只分配了2G内存,后来看了这个提问后Error on compiling AOSP: make: out/build-aosp_arm.ninja Killed,最后把容器分配的内存调至8G,问题得到解决


  • JACK SSL错误,参考aosp 编译过程中Jack server SSL error 错误解决方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [ 10% 538/4980] Ensuring Jack server is installed and started
    FAILED: setup-jack-server
    /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar 2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar 4.11.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.32.CANDIDATE.jar 4.32.CANDIDATE || exit 47 )"
    Jack server already installed in "/home/user/.jack-server"
    Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
    SSL error when connecting to the Jack server. Try 'jack-diagnose'
    SSL error when connecting to the Jack server. Try 'jack-diagnose'
    [ 10% 541/4980] build out/target/product/rk3399_mid/obj/ETC/precompiled_sepolicy_intermediates/precompiled_sepolicy
    ninja: build stopped: subcommand failed.
    22:32:18 ninja failed with: exit status 1

    #### failed to build some targets (01:11 (mm:ss)) ####

    Build android failed!
  • 网上有说这个错是端口后"~/.jack-server/config.properties"和"~/.jack-settings"里面端口号不一致的原因,但我检查后发现端口号一致

  • 最后按aosp 编译过程中Jack server SSL error 错误解决方法这篇文章修改/etc/java-8-openjdk/security/java.security,取消禁用TLSv1, TLSv1.1,问题解决

  • 原因: 编译时用的是open-jdk 8,默认禁用了TLSv1, TLSv1.1,

  • 解决办法:修改/etc/java-8-openjdk/security/java.security,找到"jdk.tls.disabledAlgorithms",并改为以下内容

    1
    2
    3
    jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

  • OOM错误(Out of memory error)参考编译报错:Out of memory error

    1
    2
    3
    4
    5
    6
    7
    8
    [  1% 250/22713] Building with Jack: /med...work_intermediates/with-local/classes.dex
    FAILED: /bin/bash /media/android/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
    Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
    GC overhead limit exceeded.
    Try increasing heap size with java option '-Xmx<size>'.
    Warning: This may have produced partial or corrupted output.
    ninja: build stopped: subcommand failed.
    make: *** [build/core/ninja.mk:152: ninja_wrapper] Error 1
  • 修改 prebuilts/sdk/tools/jack-admin 文件,增加 '-Xmx<size>'

    1
    2
    -      JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
    + JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4G -cp $LAUNCHER_JAR $LAUNCHER_NAME"
  • 修改完后关闭已有的jack server

    1
    ./prebuilts/sdk/tools/jack-admin kill-server

  • Checking API错误

    1
    2
    3
    4
    5
    6
    7
    8
    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
  • 原因在修改完系统Api或部分公共Api后(常见于修改Intent.java、KeyEvent.java等等),可以按提示运行make update-api,然后重新编译


编译AUPK

  • AUPK:官方github仓库https://github.com/FeJQ/AUPK.git

  • git 拉取AUPK代码

    1
    git clone https://github.com/FeJQ/AUPK.git
  • 因为AUPK是基于android7.1的,所以这里可以用cp命令拷贝art和frameworks文件夹到android源码文件夹下

  • 运行

    1
    make update-api
  • 重新编译rom

    1
    brunch hammerhead

刷入ROM

  • 将out/target/product/手机代号/目录下的lineage-14.1-*-UNOFFICIAL-hammerhead.zip压缩包传至手机,然后用twrp等第三方recovery双清后刷入即可

  • adb重启至recovery模式

    1
    adb reboot recovery

参考链接