高级手机定制/构建自己的ROM
构建自己的 ROM 是你能拥有的最值得的体验之一。想象一下在你的手机上拥有你自己的 Android 版本!
我们将以流行的自定义操作系统 LineageOS 作为指导参考。
- 你需要开发的手机。
- 一台相对较新的 64 位电脑(Linux、OS X 或 Windows),拥有合理的内存和大约 100 GB 的可用存储空间(如果你启用了
ccache
或为多个设备构建,则需要更多)。内存越少,构建时间越长(目标为 8 GB 或更多)。使用 SSD 比传统硬盘可以显著缩短构建时间。 - 一根与你的手机兼容的 USB 数据线。
- 良好的互联网连接和可靠的电力供应 :)
- 对基本的 Android 操作和术语有一些了解。如果你之前在其他设备上安装过自定义 ROM 并且熟悉 recovery,这将有所帮助。了解一些基本的命令行概念(如
cd
,代表“更改目录”),目录层次结构的概念以及在 Linux 中它们是如何用 / 分隔的等等,也会有所帮助。
如果你之前没有安装 adb
和 fastboot
,你可以从 Google 下载它们。提取它运行
unzip platform-tools-latest-linux.zip -d ~
现在你需要将 adb
和 fastboot
添加到你的 PATH 中。打开 ~/.profile
并添加以下内容
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
然后,运行 source ~/.profile
更新你的环境。
构建 LineageOS 需要几个包。你可以使用你的发行版的包管理器安装它们。
在 Arch Linux 中,你可以通过从 AUR 安装 lineageos-devel
来安装所有需要的包。
要构建 LineageOS,你需要 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
(如果你使用的是 Ubuntu 16.04 之前的版本,请使用 libwxgtk2.8-dev
而不是 libwxgtk3.0-dev
)
(libwxgtk3.0-dev
在 Ubuntu 20.04 中更改为 libwxgtk3.0-gtk3-dev
)
你还需要 Java。不同版本的 LineageOS 需要不同的 JDK(Java 开发工具包)版本。
- LineageOS 14.1-15.1:OpenJDK 1.8(安装
openjdk-8-jdk
) - LineageOS 11.0-13.0:OpenJDK 1.7(安装
openjdk-7-jdk
)*
* Ubuntu 16.04 及更高版本在标准包库中没有 OpenJDK 1.7。请参阅 Ask Ubuntu 中的“如何在 Ubuntu 16.04 或更高版本上安装 OpenJDK 7?”的问题。请注意,使用 PPA openjdk-r 的建议已经过时(PPA 从未更新他们提供的 openjdk-7-jdk,因此缺少安全修复程序);即使它是投票最多的答案,也要跳过它。
你需要在你的构建环境中设置一些目录。
要创建它们,请执行
mkdir -p ~/bin
mkdir -p ~/android/lineage
~/bin
目录将包含 git-repo 工具(通常称为“repo”),~/android/lineage
目录将包含 LineageOS 的源代码。
输入以下命令下载 repo 二进制文件并使其可执行(可运行): curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
在最新版本的 Ubuntu 中,~/bin
应该已经在你的 PATH 中。你可以通过文本编辑器打开 ~/.profile
并验证以下代码是否存在(如果不存在,请添加它)
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
然后,运行 source ~/.profile
更新你的环境。
在 Arch Linux 中执行相同的操作,但将文件名改为 ~/.bashrc
输入以下命令初始化仓库: cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-X --git-lfs
其中 X
是你的设备支持的 LineageOS 版本。
你需要初始化 git 才能使其正常工作
git config --global user.name "abc"
git config --global user.email "[email protected]"
要开始将源代码下载到你的电脑上,请键入 repo sync
。
LineageOS 清单包含 repo 的合理默认配置,我们强烈建议你使用它(即不要在 sync 中添加任何选项)。作为参考,我们的默认值为 -j 4
和 -c
。-j 4
部分意味着将有四个同时的线程/连接。如果你在同步时遇到问题,可以将其降低到 -j 3
或 -j 2
。另一方面,-c
将要求 repo 只拉取当前分支,而不是 GitHub 上所有可用的分支。
这取决于你的设备。
如果你想通过运行以下命令来加快后续构建,请使用 ccache
export USE_CCACHE=1
并将该行添加到你的 ~/.bashrc
文件中。然后,通过键入以下命令来指定 ccache
要使用的最大磁盘空间
ccache -M 50G
其中 50G
代表 50GB 的缓存。这只需要运行一次。从 25GB 到 100GB 会导致构建速度明显加快(例如,典型的 1 小时构建时间可以缩短到 20 分钟)。如果你只为一个设备构建,25GB-50GB 就足够了。如果你计划为多个不共享相同内核源代码的设备构建,目标为 75GB-100GB。这个空间将永久占用你的驱动器,所以请考虑这一点。有关 ccache 的更多信息,请参阅 Google 的 Android 构建环境初始化页面。
你也可以开启可选的 ccache
压缩。虽然这可能会导致性能略微下降,但它会增加缓存中可以容纳的文件数量。要启用它,请运行
export CCACHE_COMPRESS=1
或将该行添加到你的 ~/.bashrc
文件中。
输入 source ./build/envsetup.sh
输入 hmm
获取帮助文本,目前(2020-11-16)
Run "m help" for help with the build system itself. Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: - lunch: lunch <product_name>-<build_variant> Selects <product_name> as the product to build, and <build_variant> as the variant to build, and stores those selections in the environment to be read by subsequent invocations of 'm' etc. - tapas: tapas [<App1> <App2> ...] [arm|x86|mips|arm64|x86_64|mips64] [eng|userdebug|user] - croot: Changes directory to the top of the tree, or a subdirectory thereof. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory, but not their dependencies. - mmm: Builds all of the modules in the supplied directories, but not their dependencies. To limit the modules being built use the syntax: mmm dir/:target1,target2. - mma: Builds all of the modules in the current directory, and their dependencies. - mmma: Builds all of the modules in the supplied directories, and their dependencies. - provision: Flash device with all required partitions. Options will be passed on to fastboot. - cgrep: Greps on all local C/C++ files. - ggrep: Greps on all local Gradle files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - mangrep: Greps on all local AndroidManifest.xml files. - mgrep: Greps on all local Makefiles files. - sepgrep: Greps on all local sepolicy files. - sgrep: Greps on all local source files. - godir: Go to the directory containing a file. - allmod: List all modules. - gomod: Go to the directory containing a module. - pathmod: Get the directory containing a module. - refreshmod: Refresh list of modules for allmod/gomod. .... (there's more, omitted for brevity) ...
运行 m help
输出
# m help The basic Android build process is: cd /mnt/aosp/lineage source build/envsetup.sh # Add "lunch" (and other utilities and variables) # to the shell environment. lunch [<product>-<variant>] # Choose the device to target. m -j [<goals>] # Execute the configured build. Usage of "m" imitates usage of the program "make". See /mnt/aosp/lineage/build/make/Usage.txt for more info about build usage and concepts. Common goals are: clean (aka clobber) equivalent to rm -rf out/ checkbuild Build every module defined in the source tree droid Default target nothing Do not build anything, just parse and validate the build structure java Build all the java code in the source tree native Build all the native code in the source tree host Build all the host code (not to be run on a device) in the source tree target Build all the target code (to be run on the device) in the source tree (java|native)-(host|target) (host|target)-(java|native) Build the intersection of the two given arguments snod Quickly rebuild the system image from built packages Stands for "System, NO Dependencies" vnod Quickly rebuild the vendor image from built packages Stands for "Vendor, NO Dependencies" pnod Quickly rebuild the product image from built packages Stands for "Product, NO Dependencies" psnod Quickly rebuild the product_services image from built packages Stands for "ProductServices, NO Dependencies" onod Quickly rebuild the odm image from built packages Stands for "ODM, NO Dependencies" So, for example, you could run: cd /mnt/aosp/lineage source build/envsetup.sh lunch aosp_arm-userdebug m -j java to build all of the java code for the userdebug variant of the aosp_arm device. #### build completed successfully (16 seconds) ####
假设构建完成没有错误(完成后将很明显),在构建运行的终端窗口中输入以下内容
cd $OUT
在那里您将找到所有创建的文件。最令人感兴趣的两个文件是
recovery.img
,它是 LineageOS 恢复镜像。lineage-14.1-20180808-UNOFFICIAL-a5y17lte.zip
,它是 LineageOS 安装程序包。这将根据您的手机和版本而有所不同。
就是这样!您可以像从互联网上下载的任何其他自定义 ROM 一样使用您的 ROM。
本文主要摘自 LineageOS 的维基。