安卓模拟器源码php,ubuntu 20.04编译Android 11源代码&模拟器
Android 11 系统映像可直接将 ARM 指令转换成 x86 指令,因此以前很多需要真机测试的情况,现在只需要模拟器就可以进行操作了。由于众所周知的原因,我们是没办法正常下载Android的源代码的,因此只能使用国内的镜像来操作了。1.安装repo工具以及依赖$ sudo apt-get install gcc make perl$ sudo apt-get install ccache$
Android 11 系统映像可直接将 ARM 指令转换成 x86 指令,因此以前很多需要真机测试的情况,现在只需要模拟器就可以进行操作了。
由于众所周知的原因,我们是没办法正常下载Android的源代码的,因此只能使用国内的镜像来操作了。
1.安装repo工具以及依赖
$ sudo apt-get install gcc make perl
$ sudo apt-get install ccache
$ sudo apt-get install curl
$ sudo apt-get install python
# 安装repo的时候需要指定 --devmode ,否则同步的时候,会报告如下错误信息:
#repo sync -j1 --fail-fast
#/snap/git-repo/18/usr/bin/python: can't open file '~/aosp/.repo/repo/main.py': [Errno 13] Permission denied
# 不要使用 snap 安装的repo, 目前存在很多异常问题,
# ubuntu 20.04缺少repo 原因是 repo 废弃 python2 的进度慢了一些,
# 导致没办法集成到这个版本的系统里面
# sudo snap install git-repo --devmode
# 手工下载 repo
$ mkdir -p ~/.bin
$ PATH="${HOME}/.bin:${PATH}"
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+rx ~/.bin/repo
$ echo "PATH=${HOME}/.bin:${PATH}" >> ~/.bashrc
$ sudo apt-get install aria2
$ sudo apt-get install make
$ sudo apt-get install git
$ sudo apt install -y libssl-dev
# 解决
# prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loadin
g shared libraries: libncurses.so.5: cannot open shared object file: No such fi
le or directory
$ sudo apt install libncurses5
# 安装VSCode,方便后续查看代码
$ sudo snap install code --classic
$ git config --global user.email "user@email.com"
$ git config --global user.name "user"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$sudoapt-getinstallgccmakeperl
$sudoapt-getinstallccache
$sudoapt-getinstallcurl
$sudoapt-getinstallpython
# 安装repo的时候需要指定 --devmode ,否则同步的时候,会报告如下错误信息:
#repo sync -j1 --fail-fast
#/snap/git-repo/18/usr/bin/python: can't open file '~/aosp/.repo/repo/main.py': [Errno 13] Permission denied
# 不要使用 snap 安装的repo, 目前存在很多异常问题,
# ubuntu 20.04缺少repo 原因是 repo 废弃 python2 的进度慢了一些,
# 导致没办法集成到这个版本的系统里面
# sudo snap install git-repo --devmode
# 手工下载 repo
$mkdir-p~/.bin
$PATH="${HOME}/.bin:${PATH}"
$curlhttps://storage.googleapis.com/git-repo-downloads/repo>~/.bin/repo
$chmoda+rx~/.bin/repo
$echo"PATH=${HOME}/.bin:${PATH}">>~/.bashrc
$sudoapt-getinstallaria2
$sudoapt-getinstallmake
$sudoapt-getinstallgit
$sudoaptinstall-ylibssl-dev
# 解决
# prebuilts/clang/host/linux-x86/clang-3289846/bin/clang.real: error while loadin
gsharedlibraries:libncurses.so.5:cannotopensharedobjectfile:Nosuchfi
leordirectory
$sudoaptinstalllibncurses5
# 安装VSCode,方便后续查看代码
$sudosnapinstallcode--classic
$gitconfig--globaluser.email"user@email.com"
$gitconfig--globaluser.name"user"
2.在需要存储代码的地方创建文件夹
$ mkdir ~/AndSrc
$ cd ~/AndSrc
1
2
3
$mkdir~/AndSrc
$cd~/AndSrc
3.使用镜像下载Android源代码
清华大学的镜像
# 建议直接下载压缩包,使用repo更新基本上都会失败,即使用国内镜像也是一样(目前大约96GB)
$ aria2 -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar
$ tar xvf aosp-latest.tar
$ cd aosp
# 解决 fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
$ git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
1
2
3
4
5
6
7
8
9
10
11
# 建议直接下载压缩包,使用repo更新基本上都会失败,即使用国内镜像也是一样(目前大约96GB)
$aria2-chttps://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar
$tarxvfaosp-latest.tar
$cdaosp
# 解决 fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
$gitclonehttps://gerrit-googlesource.lug.ustc.edu.cn/git-repo
4.Android 模拟器编译(可选)
# 配置默认的 python为python3,否则会在运行时报错 SyntaxError: invalid syntax to repo init in the AOSP code
$ sudo mv /usr/bin/python /usr/bin/python.bak
$ sudo ln -s /usr/bin/python3 /usr/bin/python
# Android 11模拟器对应分支 emu-30-release
$ repo init -b emu-30-release
# 会失败多次,不断尝试,直到完全成功,目前测试发现单线程虽然慢点,但是基本不会失败,多线程经常失败
$ repo sync -j1 --fail-fast --force-sync
$ cd external/qemu/android/
$ ./rebuild.sh --no-tests
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 配置默认的 python为python3,否则会在运行时报错 SyntaxError: invalid syntax to repo init in the AOSP code
$sudomv/usr/bin/python/usr/bin/python.bak
$sudoln-s/usr/bin/python3/usr/bin/python
# Android 11模拟器对应分支 emu-30-release
$repoinit-bemu-30-release
# 会失败多次,不断尝试,直到完全成功,目前测试发现单线程虽然慢点,但是基本不会失败,多线程经常失败
$reposync-j1--fail-fast--force-sync
$cdexternal/qemu/android/
$./rebuild.sh--no-tests
编译完成之后,产生的模拟器可执行文件及库文件都位于external/qemu/objs/android目录下:
~/AndSrc/aosp/external/qemu/android/objs$ ls
android_emu64_unittests emulator64-mips
android_emu_metrics64_unittests emulator64_simg2img
bin64 emulator64_test_crasher
build emulator64-x86
emugl64_common_host_unittests emulator-check
emulator lib
emulator64-arm lib64
emulator64_crashreport_unittests lib64GLcommon_unittests
emulator64-crash-service lib64OpenglRender_unittests
emulator64_img2simg qemu
emulator64_libui_unittests resources
emulator64_make_ext4fs
1
2
3
4
5
6
7
8
9
10
11
12
13
~/AndSrc/aosp/external/qemu/android/objs$ls
android_emu64_unittestsemulator64-mips
android_emu_metrics64_unittestsemulator64_simg2img
bin64emulator64_test_crasher
buildemulator64-x86
emugl64_common_host_unittestsemulator-check
emulatorlib
emulator64-armlib64
emulator64_crashreport_unittestslib64GLcommon_unittests
emulator64-crash-servicelib64OpenglRender_unittests
emulator64_img2simgqemu
emulator64_libui_unittestsresources
emulator64_make_ext4fs
后面就可以像执行 SDK 中的模拟器那样,执行我们编译的模拟器了:
~/AndSrc/aosp/external/qemu/android/objs$ ./emulator -avd Nexus_5_API_30_x86
1
~/AndSrc/aosp/external/qemu/android/objs$./emulator-avdNexus_5_API_30_x86
5.列出android-11全部分支
$ cd .repo/manifests && git branch -a | cut -d / -f 3 | grep android-11
1
$cd.repo/manifests&&gitbranch-a|cut-d/-f3|grepandroid-11
6.编译Android 11系统镜像
$ cd ~/AndSrc/aosp
# 前面的编译可能会产生部分垃圾文件,需要清理一下,清理之前,编译好的文件提前备份一下
$ rm -rf *
# 解决 fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
$ git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
# 配置默认的 python为python3,否则会在运行时报错 SyntaxError: invalid syntax to repo init in the AOSP code
$ sudo mv /usr/bin/python /usr/bin/python.bak
$ sudo ln -s /usr/bin/python3 /usr/bin/python
$ repo init -b android-11.0.0_r25
# 会失败多次,不断尝试,直到完全成功,目前测试发现单线程虽然慢点,但是基本不会失败,多线程经常失败
$ repo sync -j1 --fail-fast --force-sync
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$cd~/AndSrc/aosp
# 前面的编译可能会产生部分垃圾文件,需要清理一下,清理之前,编译好的文件提前备份一下
$rm-rf*
# 解决 fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
$gitclonehttps://gerrit-googlesource.lug.ustc.edu.cn/git-repo
# 配置默认的 python为python3,否则会在运行时报错 SyntaxError: invalid syntax to repo init in the AOSP code
$sudomv/usr/bin/python/usr/bin/python.bak
$sudoln-s/usr/bin/python3/usr/bin/python
$repoinit-bandroid-11.0.0_r25
# 会失败多次,不断尝试,直到完全成功,目前测试发现单线程虽然慢点,但是基本不会失败,多线程经常失败
$reposync-j1--fail-fast--force-sync
7.引入编译环境变量
$ source build/envsetup.sh
1
$sourcebuild/envsetup.sh
8.设置编译目标,此处我们指定编译x86_64下的完整调试版本
$ lunch aosp_x86_64-eng
1
$lunchaosp_x86_64-eng
9.如果需要跟踪调试代码,建议编译为调试类型
$ export TARGET_BUILD_TYPE=debug
1
$exportTARGET_BUILD_TYPE=debug
10.编译
$ export USE_CCACHE=1
# 清理代码,为编译准备干净的环境
$ make clobber
$ make -j8
1
2
3
4
5
6
7
$exportUSE_CCACHE=1
# 清理代码,为编译准备干净的环境
$makeclobber
$make-j8
注意此处如果发生编译失败,原因基本上是编译顺序导致的引用出错,也就是某些模块还没有编译完成,其他模块已经开始尝试链接,导致依赖错误,此时只要把多线程并发编译修改成单线程编译即可,即直接执行
$ make
1
$make
运行镜像
选择system-qemu.img和vendor-qemu.img,这两个镜像是专门为qemu运行制作的,如果选择system.img 和vendor.img,则avd运行失败。
$ cd ~/AndSrc/aosp
$ export ANDROID_BUILD_TOP=~/AndSrc/aosp
$ export PATH=$PATH:$ANDROID_BUILD_TOP/out/host/linux-x86/bin
$ export ANDROID_SWT=$ANDROID_BUILD_TOP/out/host/linux-x86/framework
$ export ANDROID_PRODUCT_OUT=$ANDROID_BUILD_TOP/out/target/product/generic_x86_64
$ ./prebuilts/android-emulator/linux-x86_64/emulator -system ./out/target/product/generic_x86_64/system-qemu.img -data ./out/target/product/generic_x86_64/data.img -ramdisk ./out/target/product/generic_x86_64/ramdisk-qemu.img -vendor ./out/target/product/generic_x86_64/vendor-qemu.img -verbose -show-kernel
1
2
3
4
5
6
7
8
9
10
11
$cd~/AndSrc/aosp
$exportANDROID_BUILD_TOP=~/AndSrc/aosp
$exportPATH=$PATH:$ANDROID_BUILD_TOP/out/host/linux-x86/bin
$exportANDROID_SWT=$ANDROID_BUILD_TOP/out/host/linux-x86/framework
$exportANDROID_PRODUCT_OUT=$ANDROID_BUILD_TOP/out/target/product/generic_x86_64
$./prebuilts/android-emulator/linux-x86_64/emulator-system./out/target/product/generic_x86_64/system-qemu.img-data./out/target/product/generic_x86_64/data.img-ramdisk./out/target/product/generic_x86_64/ramdisk-qemu.img-vendor./out/target/product/generic_x86_64/vendor-qemu.img-verbose-show-kernel
上面运行起来的镜像是从~/AndSrc/aosp/out/debug/target/product/generic/hardware-qemu.ini即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启GPU的支持,则执行如下命令:
$ ./prebuilts/android-emulator/linux-x86_64/emulator -system ./out/target/product/generic_x86_64/system-qemu.img -data ./out/target/product/generic_x86_64/data.img -ramdisk ./out/target/product/generic_x86_64/ramdisk-qemu.img -vendor ./out/target/product/generic_x86_64/vendor-qemu.img -gpu on -memory 4096 -verbose -show-kernel
1
$./prebuilts/android-emulator/linux-x86_64/emulator-system./out/target/product/generic_x86_64/system-qemu.img-data./out/target/product/generic_x86_64/data.img-ramdisk./out/target/product/generic_x86_64/ramdisk-qemu.img-vendor./out/target/product/generic_x86_64/vendor-qemu.img-gpuon-memory4096-verbose-show-kernel
参考链接
更多推荐
所有评论(0)