编译LineageOS模拟器镜像,导出到AndroidStudio
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
源码下载
LineageOS官网:https://lineageos.org/
LineageOS源码 github 地址:https://github.com/LineageOS/android
LineageOS源码国内镜像地址:https://mirrors.tuna.tsinghua.edu.cn/help/lineageOS/
源码大概需要150GB的硬盘空间,编译完成差不多300G
1. 配置git
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
2. 安装 repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
3. 安装 Git LFS
sudo apt install git-lfs
git lfs install
4. 设置REPO_URL
找到 repo 所在路径
which repo
编辑 repo
nano /home/cyrus/bin/repo
可以看到repo会优先取环境变量中的REPO_URL,否则默认使用googlesource
Ctrl +X 退出nano
通过下面的命令设置 REPO_URL 环境变量,设置为清华大学镜像源,解决国内访问不了 googlesource 问题
export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/
5. 下载源码
创建目录
mkdir lineageos
进入到 lineageos 目录
cd lineageos
如果可正常访问 github,使用下面的命令初始化 repo
repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --git-lfs
否则,使用清华大学镜像初始化 repo,并修改 default.xml
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-21.0 --git-lfs
打开 .repo/manifests/default.xml,将
<remote name="github"
fetch=".."
review="review.lineageos.org" />
改成
<remote name="github"
fetch="https://github.com/" />
<remote name="lineage"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
review="review.lineageos.org" />
将
<remote name="aosp"
fetch="https://android.googlesource.com" >
改成
<remote name="aosp"
fetch="https://mirrors.tuna.tsinghua.edu.cn/git/AOSP">
将 remote=“github”
<default revision="..."
remote="github">
改成 remote=“lineage”
<default revision="..."
remote="lineage">
或者直接修改 .gitconfig,把访问 LineageOS 仓库的 url 替换为使用清华大学镜像源
cat >> ~/.gitconfig <<EOF
[url "https://mirrors.tuna.tsinghua.edu.cn/git/git-repo"]
insteadof = https://gerrit.googlesource.com/git-repo
[url "https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"]
insteadof = https://review.lineageos.org/
[url "https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/"]
insteadof = https://android.googlesource.com/
[url "https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/"]
insteadof = https://github.com/LineageOS/
EOF
最后,同步源码
repo sync
6. 解决同步不完整问题
error: Unable to fully sync the tree
error: Checking out local projects failed.
Failing repos:
android
device/generic/goldfish
device/generic/mini-emulator-x86
external/ImageMagick
build/blueprint
Try re-running with "-j1 --fail-fast" to exit at the first error.
================================================================================
Repo command failed due to the following `SyncError` errors:
Cannot initialize work tree for LineageOS/android
Cannot initialize work tree for device/generic/goldfish
Cannot initialize work tree for device/generic/mini-emulator-x86
Cannot initialize work tree for LineageOS/android_external_ImageMagick
Cannot initialize work tree for platform/build/blueprint
尝试使用单线程同步,减少同步过程中的冲突。
repo sync -j1 --fail-fast
这会在第一个错误发生时终止同步,以便更容易定位和解决问题。
或者,清理工作树,手动删除有问题的项目并重新同步
rm -rf .repo/projects/device/generic/goldfish.git
rm -rf .repo/projects/device/generic/mini-emulator-x86.git
rm -rf .repo/projects/external/ImageMagick.git
rm -rf .repo/projects/build/blueprint.git
repo sync
设置缓存
创建缓存目录
mkdir -p /mnt/case_sensitive/ccache
把缓存配置添加到环境变量配置文件.bashrc结尾
cat >> ~/.bashrc <<EOF
# 使用缓存
export USE_CCACHE=1
# ccache文件路径
export CCACHE_EXEC=/usr/bin/ccache
# 设置缓存目录
export CCACHE_DIR=/mnt/case_sensitive/ccache
EOF
执行下面命令使配置生效
source ~/.bashrc
设置最大缓存空间为 50GB
ccache -M 50G
启用 ccache 的压缩功能,可以减少缓存文件所占用的磁盘空间
ccache -o compression=true
开始编译
# 初始化编译环境
source build/envsetup.sh
# 设置构建目标
breakfast sdk_phone_x86_64 eng
# 开始编译
mka
breakfast 是 LineageOS 构建系统中的一个命令,用于设置构建环境。它会下载并配置设备相关的源代码和依赖项。
sdk_phone_x86_64 指目标设备的代码名称。在这个例子中,它代表一个用于 Android 模拟器的 x86_64 架构的虚拟手机设备。
具体参考:https://wiki.lineageos.org/emulator
在构建 LineageOS 时,eng 和 userdebug 是两种不同的构建类型,它们主要在调试功能和安全性方面有所区别
eng:
-
适用于开发者调试使用。
-
含有完全无优化的调试功能,允许广泛的日志记录、调试器连接和各种测试。
-
安全性较低,没有启用某些生产环境中的安全措施。
userdebug:
-
适用于调试接近生产环境的构建。
-
含有用户构建的所有功能,但保留了一些调试工具,安全性高于 eng 构建。
-
更加接近最终用户使用的环境,同时仍然允许调试。
总之,eng 更适合深入的开发调试,而 userdebug 适合在接近生产环境的条件下进行调试。
解决编译报错
__1. exit status 137 __
[ 55% 50817/91235] //packages/apps/HTMLViewer:HTMLViewer r8
Warning: The rule `-checkdiscard interface kotlin.coroutines.jvm.internal.DebugMetadata` matches a class not in the program.
18:03:04 ninja may be stuck, check /mnt/case_sensitive/lineageos/out/soong.log for list of running processes.
18:03:04 ninja may be stuck, check /mnt/case_sensitive/lineageos/out/soong.log for list of running processes.
18:03:04 ninja failed with: exit status 137
#### failed to build some targets (02:14:44 (hh:mm:ss)) ####
exit status 137 通常表示进程因内存不足被系统杀死。可以使用 htop 或 free -h 命令检查内存使用情况。
如果内存不足,可以尝试增加虚拟机的内存,或在本地机器上添加交换分区。
# 创建一个新的16G交换文件
sudo fallocate -l 16G /mnt/case_sensitive/swapfile
# 将交换文件的权限设置为600,以确保只有root用户可以读取和写入该文件。
sudo chmod 600 /mnt/case_sensitive/swapfile
# 将交换文件格式化为swap格式
sudo mkswap /mnt/case_sensitive/swapfile
# 启用新的交换文件
sudo swapon /mnt/case_sensitive/swapfile
# 使用 swapon --show 或 free -h 命令验证新的交换文件是否已正确启用。
swapon --show
# 或
free -h
为了确保 /mnt/case_sensitive/swapfile 在重启后仍然有效,将其添加到/etc/fstab文件中
echo '/mnt/case_sensitive/swapfile swap swap sw 0 0
' | sudo tee -a /etc/fstab
2. Read-only file system: '/home/*/.repo.gitconfig.json’_
这个错误表明在编译过程中尝试写入一个只读文件,报错如下
OSError: [Errno 30] Read-only file system: '/home/cyrus/.repo_.gitconfig.json'
\nWrite to a read-only file system detected. Possible fixes include
1\. Generate file directly to out/ which is ReadWrite, #recommend solution
2\. BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST := <my/path/1> <my/path/2> #discouraged, subset of source tree will be RW
3\. BUILD_BROKEN_SRC_DIR_IS_WRITABLE := true #highly discouraged, entire source tree will be RW
19:26:39 ninja failed with: exit status 1
给 .repo_.gitconfig.json 文件添加写入权限,再重新编译
cyrus@cyrus-studio:/mnt/case_sensitive/lineageos$ chmod a+w ~/.repo_.gitconfig.json
cyrus@cyrus-studio:/mnt/case_sensitive/lineageos$ ls -alh /home/cyrus/.repo_.gitconfig.json
-rw-rw-rw- 1 cyrus cyrus 442 Aug 30 21:41 /home/cyrus/.repo_.gitconfig.json
发现还是不行,使用 nano 命令编辑 .repo_.gitconfig.json 随便修改一下保存,再编辑改回来,再重新编译,可以了。
nano /home/cyrus/.repo_.gitconfig.json
编译完成
启动模拟器
执行 emulator 命令启动模拟器
启动失败,报错如下
INFO | Storing crashdata in: /tmp/android-cyrus/emu-crash-34.2.7.db, detection is enabled for process: 1799459
INFO | Android emulator version 34.2.7.0 (build_id 11381971) (CL:N/A)
INFO | Storing crashdata in: /tmp/android-cyrus/emu-crash-34.2.7.db, detection is enabled for process: 1799459
INFO | Duplicate loglines will be removed, if you wish to see each individual line launch with the -log-nofilter flag.
INFO | Changing default hw.initialOrientation to portrait
ProbeKVM: This user doesn't have permissions to use KVM (/dev/kvm).
The KVM line in /etc/group is: [kvm:x:109:]
If the current user has KVM permissions,
the KVM line in /etc/group should end with ":" followed by your username.
If we see LINE_NOT_FOUND, the kvm group may need to be created along with permissions:
sudo groupadd -r kvm
# Then ensure /lib/udev/rules.d/50-udev-default.rules contains something like:
# KERNEL=="kvm", GROUP="kvm", MODE="0660"
# and then run:
sudo gpasswd -a $USER kvm
If we see kvm:... but no username at the end, running the following command may allow KVM access:
sudo gpasswd -a $USER kvm
You may need to log out and back in for changes to take effect.
ERROR | x86_64 emulation currently requires hardware acceleration!
CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm).
The KVM line in /etc/group is: [kvm:x:109:]
If the current user has KVM permissions,
the KVM line in /etc/group should end with ":" followed by your username.
If we see LINE_NOT_FOUND, the kvm gr
More info on configuring VM acceleration on Linux:
https://developer.android.com/studio/run/emulator-acceleration#vm-linux
General information on acceleration: https://developer.android.com/studio/run/emulator-acceleration.
这个错误是因为 QEMU 启用硬件加速( KVM)失败了。
确认 /dev/kvm 的权限是否正确。你可以通过以下命令检查
$ ls -l /dev/kvm
crw-rw---- 1 cyrus kvm 10, 232 Aug 31 21:01 /dev/kvm
输出应该类似于 crw-rw---- 1 YourUserName kvm 10, 232 date /dev/kvm,其中
kvm 是该设备的组。
如果权限设置不正确,你可以尝试以下命令修复
sudo apt install qemu-kvm
sudo adduser $USER kvm
sudo chown $USER:kvm /dev/kvm
sudo chmod 660 /dev/kvm
最后重新执行 emulator 启动模拟器
导出用于 Android Studio/AVD
将构建的镜像导出为 Android Studio/AVD 可使用的格式,通过以下命令
LineageOS 20 及以下版本
mka sdk_addon
构建完成后在 out/host/linux-x86/sdk_addon 目录,会生成一个 ZIP 文件(文件名以 -img.zip 结尾),其中包含在外部运行模拟器镜像所需的所有文件。
LineageOS 21 及以上版本
mka emu_img_zip
构建完成后在 out/target/product/ 目录,会生成一个 ZIP 文件 sdk-repo-linux-system-images.zip,其中包含在外部运行模拟器镜像所需的所有文件。
将 zip 文件解压到 android sdk 的 system-images 目录下,解压路径如下
system-images/android-<sdk version>/<tag>/<arch> (其中 <tag> 是 default/google_apis/google_apis_playstore 中的一个)
在 Android Studio 的【Device Manager】【Create Virtual Device】中创建虚拟设备并选择 LineageOS 镜像
最终在Android Studio下运行效果如下
参考:
https://wiki.lineageos.org/emulator