跟大佬学习了一下类原生的编译,记录一下过程
准备工作
安装Ubuntu20.04
这就不细说了百度一堆
内存大于16G要不然有可能报错
搭建构建环境
参考谷歌文档https://source.android.com/setup/build/initializing#installing-required-packages-ubuntu-1804
安装依赖软件包
1 | sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig |
使用单独输出目录
正常编译完会在对应rom的out文件夹中,想修改路径用以下代码
1 | export OUT_DIR=out_mytarget |
安装repo
参考文档https://source.android.com/setup/develop#installing-repo
repo可能需要python可以提前装好
1 | sudo apt-get install python |
运行以下命令以使用您的 Linux 发行版中的官方软件包
1 | sudo apt-get update |
我没装上,用的下面方法
安装repo tool
1 | Make a directory where Repo will be stored and add it to the path |
验证repo是否安装成功
1 | repo version |
您会看到一个与下方内容相似的报告:
1 | <repo not installed> |
如果报告的repo launcher version
编号为2.15
或更高,则表明版本号正确,安装无误。
(from /usr/bin/repo) 表明是通过软件包进行安装的。
(from /home/<>/bin/repo) 表明是手动安装的。
到对应ROM的github跟着教程走,例如acme
为此rom创建一个文件夹
1 | mkdir acme |
初始化repo
1 | repo init -u https://github.com/AcmeUI/manifest.git -b taffy |
这里注意要选对版本,目前最新的是taffy
,对应安卓13
的版本
把设备相关的的包clone到项目中
1 | git clone https://github.com/AcmeUI-Devices/android_device_xiaomi_cas-erofs device/xiaomi/cas |
开始编译
1 | . build/envsetup.sh |
报错解决
找错误
首先需要找到错误,核心就是在一堆warning里找到Failed,比较费眼睛。需要往上翻log慢慢找,报错不会停,会被顶上去。
还可以去out
文件夹里找verbose.log
少东西可以去lineage找找https://github.com/LineageOS
错误1
这里lineageos跑到一半遇到个错误
解决方法是按照图中报错到指定文件去删除错误行,这里是/device/xiaomi/cas/sepolicy/vendor/genfs_contexts
文件删除两行
错误2
这次没找到报错代码,解决方法是在编译一次,用make bacon -j1
跑一会儿停了再继续mka bacon
,我遇到情况是到后期多线程经常失败需要用单线程跑
遇到137
就这么跑就行了
错误3
有可能报错什么库没找到,按提示往上搜一下就出来了例如'openssl/bio.h' file not found
1 | sudo apt install libssl-dev |
错误4
报错xxx already defined by xxx
就是引用重复了,把去前面那个路径里把那段引用注释掉就行了
错误5
这个是缺少lineageos
的资源文件device setting
,很多类原生都是基于lineage
演变过来的,去lineage
的github
引用一份就行了
地址:https://github.com/LineageOS/android_packages_resources_devicesettings
按照之前的经验,参考上面那一堆clone
放到package/resources/devicesettings
目录下
知识点
mka和make的区别
mka
是根据实际情况满线程跑make
可以指定线程数-j1
代表线程数