跳转到内容

高级手机定制/构建自己的ROM

来自 Wikibooks,开放世界中的开放书籍

构建自己的 ROM 是你能拥有的最值得的体验之一。想象一下在你的手机上拥有你自己的 Android 版本!

我们将以流行的自定义操作系统 LineageOS 作为指导参考。

你需要什么

[编辑 | 编辑源代码]
  • 你需要开发的手机。
  • 一台相对较新的 64 位电脑(Linux、OS X 或 Windows),拥有合理的内存和大约 100 GB 的可用存储空间(如果你启用了 ccache 或为多个设备构建,则需要更多)。内存越少,构建时间越长(目标为 8 GB 或更多)。使用 SSD 比传统硬盘可以显著缩短构建时间。
  • 一根与你的手机兼容的 USB 数据线。
  • 良好的互联网连接和可靠的电力供应 :)
  • 对基本的 Android 操作和术语有一些了解。如果你之前在其他设备上安装过自定义 ROM 并且熟悉 recovery,这将有所帮助。了解一些基本的命令行概念(如 cd,代表“更改目录”),目录层次结构的概念以及在 Linux 中它们是如何用 / 分隔的等等,也会有所帮助。

构建 LineageOS 和 LineageOS Recovery

[编辑 | 编辑源代码]

安装 Android SDK

[编辑 | 编辑源代码]

如果你之前没有安装 adbfastboot,你可以从 Google 下载它们。提取它运行

unzip platform-tools-latest-linux.zip -d ~

现在你需要将 adbfastboot 添加到你的 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 命令

[编辑 | 编辑源代码]

输入以下命令下载 repo 二进制文件并使其可执行(可运行): curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

~/bin 目录放在你的执行路径中

[编辑 | 编辑源代码]

在最新版本的 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

初始化 LineageOS 源代码仓库

[编辑 | 编辑源代码]

输入以下命令初始化仓库: 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

在那里您将找到所有创建的文件。最令人感兴趣的两个文件是

  1. recovery.img,它是 LineageOS 恢复镜像。
  2. lineage-14.1-20180808-UNOFFICIAL-a5y17lte.zip,它是 LineageOS 安装程序包。这将根据您的手机和版本而有所不同。

就是这样!您可以像从互联网上下载的任何其他自定义 ROM 一样使用您的 ROM。

参考资料

[编辑 | 编辑源代码]

本文主要摘自 LineageOS 的维基

华夏公益教科书