慢慢修

MENU

Android编译入门

2023 年 04 月 16 日 • 阅读: 122 • 技术

一、前言


时隔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及以后最好)
进入系统之后, 打开终端, 使用以下指令更新依赖

最好在非root用户下执行,有需要root权限的再用sudo

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

不过最后两个adbfastboot可以通过安装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 OSAOSP
这里推荐几个有名的

仿Pixel

Lineages OS(及魔改)

下面推荐点不一样的

至于为什么没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后面可以选择useruserdebugeng三个参数可选,普通人选user即可

-j后面的X代表的是编译线程数,在允许范围内越大越好
如果设备树和内核还有vendor、源码没什么问题,几个小时内就会出包,耐心等待吧
文章的内容到这里还没完,有兴趣可以接着看下去

进阶操作一、IFY

由于各种原因,不可能每个rom都有维护者,这时候就只能通过ify来一直设备树为我们所用啦
这里以munch为例

如果可以的话,尽量选择相近类原生系统的设备树
Pixel ExperiencePixel OS

这里假设我要移植Pixel ExperienceDevice TreeArrow 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
大功告成!

最后编辑于: 2023 年 04 月 30 日
返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码
开往-友链接力