一、前言
时隔2年,终于回来写Blog了,作为一个鸽子精真的好丢脸(主要是最近出了点事情,可能是遭报应了)。删掉了大部分文章,和优化了一下博客的网络连接,详情会在另外一篇写出来
二、 起因
开始接触这玩意存粹是因为之前的老手机用不下去了,拿了自己n年赚的钱去买了Redmi K40S(munch),之前也看到了Redmi 6(certus)有人发过包,然后刷着刷着就像试试几个系统,然后就莫名进入的编译ROM的世界。
同时,Google在TQ2A的更新中对Pad系统进行了优化,Pad的类原生也开始进入进入人们的视野,类原生家族有多了许多可用设备。
好了,废话不多说,进入正题
三、准备工作
首先, 让我们来看看安卓官方对安卓编译机器的最低要求
您至少需要64位
的计算机,250 GB
的同步硬盘空间 +150 GB
的编译硬盘空间,最少需要16 GB
的内存, 但谷歌官方推荐64 GB
的内存16g ram
其实不够用的,vcpu数目低于16其实也很难受,这点在我编译的时候深有体会,硬盘建议别用SSD,不然就是一时用一时爽,一直用火葬场了。
本地配置够可以进行编译,就是拉代码要开梯子,而且动不动就把你梯子墙了(因为基本都是几百g的源码),所以大部分都是拿服务器跑的。
这里推荐几家云服务商
Google Cloud Platform
Azure(有EDU订阅和VS等额度订阅)
AWS(有码字)
Vultr(较为便宜)
GCP推荐主要是因为有名
选哪一家在这里就不详述了, 可以参考下网上的对比
还有ARM机器编译反正我是没试过,有兴趣的可以去试试
四、环境配置
在根据上面的最低编译配置选出来机器之后 (系统记得选Ubuntu
,开机,启动,即可以进行到我们的下一个环节了。(Ubuntu 20.04及以后最好)
进入系统之后, 打开终端, 使用以下指令更新依赖
apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev adb fastboot
不过最后两个adb
和fastboot
可以通过安装platform-tools
来进行安装
先在一个目录下执行
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
然后执行
unzip platform-tools-latest-linux.zip -d ~
如果你想把这两加入环境变量的话,进入~/.profile
然后添加以下内容
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
然后repo
安装有两种方式(但是第二种方便后面操作)
第一种(在Azure和AWS的Ubuntu20.04成功,其他很多都不行)
apt install repo
第二种
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
最后的最后,配置一下git
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
当然如果你想要加快编译速度的话可以开一下缓存
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
然后在user
对应的~/.bashrc
下添加
ccache -M 50G
如果编译多个设备的话可以把50G
改成100G
还有个没啥用的脚本
说是可能会导致性能略有下降,但会增加缓存中可容纳的文件数量
ccache -o compression=true
五、选择&拉取源码&编译
源码大致就分为Lineages OS
(及其魔改)和Pixel
系源码(当然还有些大佬会直接从AOSP源上开发),但是可以说源码基本上就出自Lineages OS
和AOSP
这里推荐几个有名的
仿Pixel
Lineages OS(及魔改)
- Lineages OS https://lineageos.org/
- Evolution X https://evolution-x.org/
- NusantaraProject https://nusantararom.org/(印尼的“游戏”系统,但是美化非常细致?)
- Arrow OS https://arrowos.net/
下面推荐点不一样的
- Project Elixir https://projectelixiros.com/(美化贼多,但是开源源码没有)
- Spark OS https://spark-os.live/(也是美化多)
- Miku UI https://github.com/Miku-UI(没找到官网,二次元狂喜)
至于为什么没CN的rom(Miku UI可能算),因为我知道还可以的的一个因为成员考研暂停了,还有一个因为“爸爸是局长的南京大学保送大学生”搞崩了(有一说一,国内开发圈子真的乱),然后现在重新开发进度约等于0。知名的Mokee在停止更新n久后宣布删机跑路(主创陪女朋友去了似乎)。
然后就是创建一个目录用于存放
并且使用repo init进行初始化
这里使用最新的Lineages OS来给例子(通常仓库里面都有给示例命令的)
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-20.0 --git-lfs
在初始化设置后进行
repo sync
等待代码同步完成
然后去Github
或者Gitlab
上找到
device_<manufacturer_name>_<device_name>
kernel_<manufacturer_name>_<device_name>
vendor_<manufacturer_name>_<device_name>
并将其克隆到对应的目录
~/android/lineage/device/<manufacturer_name>/<device_name>
~/android/lineage/kernel/<manufacturer_name>/<device_name>
~/android/lineage/vendor/<manufacturer_name>/<device_name>
当然Lineages OS
有更快的方式(针对某些机器)
source build/envsetup.sh
breakfast <device_name>
然后就可以开始编译了
lunch aosp_$device-userdebug
mka bacon -jX
$device
后面可以选择user
、userdebug
、eng
三个参数可选,普通人选user
即可
-j
后面的X
代表的是编译线程数,在允许范围内越大越好
如果设备树和内核还有vendor
、源码没什么问题,几个小时内就会出包,耐心等待吧
文章的内容到这里还没完,有兴趣可以接着看下去
进阶操作一、IFY
由于各种原因,不可能每个rom都有维护者,这时候就只能通过ify
来一直设备树为我们所用啦
这里以munch
为例
如
Pixel Experience
和Pixel OS
这里假设我要移植
Pixel Experience
的Device Tree
给Arrow OS
先看一眼文件
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/4/15 10:16 .idea
d----- 2023/4/15 10:09 audio
d----- 2023/4/15 10:09 idc
d----- 2023/4/15 10:09 keylayout
d----- 2023/4/15 10:09 libinit
d----- 2023/4/15 10:09 overlay
d----- 2023/4/15 10:09 overlay-aosp
-a---- 2023/4/15 10:09 121 Android.bp
-a---- 2023/4/15 10:09 215 Android.mk
-a---- 2023/4/15 10:09 250 AndroidProducts.mk
-a---- 2023/4/15 10:09 541 aosp.dependencies
-a---- 2023/4/15 10:09 909 aosp_munch.mk
-a---- 2023/4/15 10:09 714 BoardConfig.mk
-a---- 2023/4/15 10:09 1178 device.mk
-a---- 2023/4/15 10:09 804 extract-files.sh
-a---- 2023/4/15 10:09 24291 proprietary-files.txt
-a---- 2023/4/15 10:09 1934 README.md
-a---- 2023/4/15 10:09 1986 reorder-libs.py
-a---- 2023/4/15 10:09 260 setup-makefiles.sh
-a---- 2023/4/15 10:09 1543 vendor.prop
Pixel Experience
的 *_<device_name>.mk
名字和Arrow OS
是不一样的,那也就要把它从aosp_<device_name>.mk
改成arrow_<device_name>.mk
这里也就是这样
aosp_munch.mk -----> arrow_munch.mk
然后再看下~/android/<rom_root_path>/vendor/aosp/config/
这个目录
如果在原设备树的*.<device_name>.mk
中的这一行
$(call inherit-product, vendor/aosp/config/*.mk)
*
是common_full_phone
且那个目录有输出同样名字的文件的话,就不变动。否,则改成common
然后vendor
后面跟的aosp
改成arrow
然后把PRODUCT_NAME
后面跟的东西从aosp_munch
改成arrow_munch
接下来转到AndroidProducts.mk
把所有的aosp_munch
改成arrow_munch
大功告成!
Copyright © 2023 MZRME'S. All rights reserved.
转载请注明,本文永久链接 Android编译入门