FartExt编译
FartExt编译

FartExt编译

FartExt编译

前情提要

使用的系统 Ubuntu

FartExt项目地址 https://github.com/dqzg12300/FartExt

Pixel设备一台 这里使用Pixel1

入门参考档

感谢这些作者

https://blog.csdn.net/qq1045553189/article/details/120997327

https://lug.ustc.edu.cn/wiki/mirrors/help/aosp/#%E9%99%84%E5%BD%95_brillo

https://blog.csdn.net/cl769796350/article/details/102676674/

参考流程

  1. Ubuntu系统换源,升级apt,安装依赖

    代码来源于 清华源 的参考文档

    https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/

    sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
    sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
    
    # 更新
    sudo apt update
    
    # 安装依赖(libesd0-dev报错可忽略)
    sudo apt-get install openjdk-8-jdk
    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
    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 libgl1-mesa-dev libxml2-utils xsltproc unzip m4
    sudo apt-get install lib32z-dev ccache
    sudo apt-get install libssl-dev
    sudo apt install python2
    sudo apt install fastboot
  2. 安装,设置Git

    sudo apt install curl python git
    
    git config --global user.email "xxxxxxx@xxxx.com"
    git config --global user.name "xxxx"
  3. 创建目录,安装repo(此处易出错,容易在第四步报错,请参考文末PS解决)

    参考文献 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
    chmod a+x ~/bin/repo
    # 修改  ~/bin/repo 文件的144行的  REPO_URL = 'https://gerrit.googlesource.com/git-repo' 为
    # https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
    # 或运行如下命令后重启系统
    echo "export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'" >> ~/.bashrc
  4. 下载Android AOSP源码

    # 新建一个terminal(终端)
    # 可自定义目录,无需一致
    mkdir aosp10
    cd aosp10
    PATH=~/bin:$PATH
    
    # 初始化配置    下载android-10.0.0_r2源码
    repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r2
    # 或 
    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r2
    
    # 同步源码  -j为并发数,酌情处理(清华源有并发5限制,不带-j默认为4)
    repo sync
    
    # 删除repo(可忽略)
    rm -rf .repo

    进阶

    有墙可尝试使用官方网站(部分地区DNS正常的可能用不到墙)

    参考文献 https://source.android.com/setup/build/downloading

    版本列表 https://source.android.com/docs/setup/start/build-numbers?hl=zh-cn#source-code-tags-and-builds

    Pixel列表 https://developers.google.cn/android/images

    # 选择编译版本,在 "源代码标记和 build" 找到适配自己设备的版本,这里使用  android-10.0.0_r2
    # 请记住版号  QP1A.190711.020,后面需下载正确的系统官方驱动镜像
    #  QP1A.190711.020   android-10.0.0_r2   Android10   Pixel 3a XL、Pixel 3a、Pixel 3 XL、Pixel 3、Pixel 2 XL、Pixel 2、Pixel XL、Pixel 
    #  QP1A.190711.019   android-10.0.0_r1   Android10   Pixel 3a XL、Pixel 3a、Pixel 3 XL、Pixel 3、Pixel 2 XL、Pixel 2、Pixel XL、Pixel
    repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r2
    
    # 总大小大约16G,使用好的墙能跑满带宽
    repo sync
    rm -rf .repo

    image-20220909215525321

  5. 下载驱动

    参考文献 https://developers.google.cn/android/drivers

    https://developers.google.cn/android/drivers#sailfishqp1a.190711.020

    两个link都得下

    解压到 aosp10目录下

    image-20220908023639686

    # 运行下载的两个文件(文件名不一定一致)
    sh extract-google_devices-sailfish.sh
    sh extract-qcom-sailfish.sh
    
    # 同意授权 最后输入 "I ACCEPT"
  6. 编译源码

    # 清空环境
    make clobber
    
    # 选择编译版本,此时会加载一个选择界面,可以输入序号,也可输入名称    pixle对应sailfish   userdebug为带root和调试模式的rom
    source build/envsetup.sh
    lunch aosp_sailfish-userdebug
    time make -j12
    
    # 中途报错参考文末PS档,继续编译运行以下代码
    source build/envsetup.sh
    lunch aosp_sailfish-userdebug
    time make -j4
    
    # 编译到  Metalava 和 frameworks  部分很容易闪退,建议调整为
    source build/envsetup.sh
    lunch aosp_sailfish-userdebug
    time make -j1

    image-20220909123557236

  7. 刷机

    adb reboot bootloader
    cd out/target/product/sailfish/
    fastboot flashall -w
    

PS

  • 内存或硬盘不足

    编译系统建议设置

    8G及以上的内存

    100G及以上的硬盘空间(最少使用量50G+)

    image-20220908024305011

  • 编译过程中 终端闪退

    内存过小或CPU超负荷导致闪退或报错

    image-20220908040928160

    -j 命令的参数调小或设置为 -j1 或直接去掉 -j
    修改源码

    参考文献 https://forum.xda-developers.com/t/guide-how-to-build-android-11-with-low-ram.4298483/

    参考文献2 https://review.lineageos.org/c/LineageOS/android_build_soong/+/262657/4

    参考文献3 https://review.lineageos.org/c/LineageOS/android_build_soong/+/266411/3/java/droiddoc.go#71

    # aosp10/build/soong/java/config/config.go
    # pctx.StaticVariable("JavacHeapSize", "2048M")
    pctx.StaticVariable("JavacHeapSize", "8192M")
    
    # aosp10/build/soong/java/config/makevars.go
    # ctx.Strict("DX_COMMAND", "${D8Cmd} -JXms16M -JXmx2048M")
    ctx.Strict("DX_COMMAND", "${D8Cmd} -JXms8192M -JXmx8192M")
    
    # aosp10/build/soong/java/droiddoc.go 
    # 添加 -Xmx6114m
    # metalava = pctx.AndroidStaticRule("metalava",
    #   ${config.JavaCmd} -jar ${config.MetalavaJar} -encoding UTF-8 -source $javaVersion @$out.rsp @$srcJarDir/list 
    ${config.JavaCmd} -Xmx8192m -jar ${config.MetalavaJar} -encoding UTF-8 -source $javaVersion @$out.rsp @$srcJarDir/list 
    
    增加swap大小

    参考文献 https://www.jianshu.com/p/53941de91c77

    # 关闭swap(此过程需等待 swap 释放,稍等片刻)
    sudo swapoff -a
    
    # 本地开辟30G文件作为swap空间
    sudo rm /swapfile
    sudo fallocate -l 30G /swapfile
    
    # 设置权限
    sudo chmod 600 /swapfile
    
    # 挂载swap空间
    sudo mkswap /swapfile
    
    # /ect/fstab下进行添加,使swap永久生效(只需运行一次)
    sudo cp /etc/fstab /etc/fstab.bak
    echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
    
    # 启动swap
    sudo swapon -a
    
    # 显示swap空间
    sudo swapon --show
    free -m
    
    # 修改swap系统利用设置(让剩余物理内存为1.5G时启动交换空间)
    sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak
    echo 'vm.min_free_kbytes=1500000' | sudo tee -a /etc/sysctl.conf
    
    # 查看编译中的内存使用
    top
    

    image-20220908025045471

    清空编译环境(将重新编译)
    # 删除所有设置所生成的所有的output与中间文件
    make clobber
    
    # 等价于指令
    rm -rf out/
    
    # 如果遇到make clobber一直卡住的,可以试试rm这个命令
  • 部分文件为Python2版本,提示代码错误

    如 device/generic/goldfish/tools/mk_combined_img.py

    image-20220909032243017

    # 将    #!/usr/bin/python
    # 改为
    #!/usr/bin/python2
  • fastboot: error: ANDROID_PRODUCT_OUT not set

    image-20220909032951569

    # 编译的输出目录的绝对路径
    export ANDROID_PRODUCT_OUT=/home/ql/aosp10/out/target/product/sailfish
  • 其余错误参考档

    https://www.jianshu.com/p/0c0d66d8502d