在 Ubuntu 下面我编译 android 12 已经尝试过很多次,都失败了。
都是执行下面这步的时候,编译了几个小时以后报错
make sdk sdk_repo -j12
一开始给虚拟机分配了 8GB 的内存条,编译的时候显示RAM最低要16GB。
最后报错
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.intellij.openapi.util.Pair.create(Pair.java:18)
at com.intellij.lang.java.parser.DeclarationParser.parseModifierList(DeclarationParser.java:491)
at com.intellij.lang.java.parser.DeclarationParser.parseModifierList(DeclarationParser.java:451)
at com.intellij.lang.java.parser.DeclarationParser.parse(DeclarationParser.java:283)
at com.intellij.lang.java.parser.DeclarationParser.parseClassBodyDeclarations(DeclarationParser.java:231)
尝试过下面的解决办法,都失败了
1.将执行 make sdk sdk_repo -j12 改为 make sdk sdk_repo -j1
2.修改 config.go
cd ~/android-12.1.0_r4/build/soong/java
gedit droiddoc.go
添加下面这一行
Flag("-J-Xmx4096m").
还有
cd build/soong/java/config
gedit config.go
这几种方法怎么实验都会报和原来一样的错误
最后,我只能买了一根16GB 的内存条,电脑现在是8+16,一共 24GB 的内存。然后给虚拟机分配了21616MB 的内存(显示21.1GB),最后编译成功了。
下面是最重要的准备工作:
创建虚拟机,并且分配下图的内存和处理器
建议给虚拟机分配超过 21GB 的内存,不然仍然可能编译报错。
文章目录
- 1. 安装编译Android源码依赖的软件包
- 2. 调整 SWAP 空间大小
- 3. 设置权限
- 4. 将自定义文件变成swap文件:
- 5. 配置启动文件
- 6. 挂载启动swap空间
- 7. 初始化编译环境
- 8. 编译
- 9. 在Ubuntu 中启动Android 虚拟机
- 10. 在Ubuntu 启动编译好的 Android 模拟器
- 点击拍照,可以看到是真的能拍照保存,证明模拟器的 camera 使用没有问题。
- 11. 在Android studio 中创建模拟器(写的很长)
- 11.1 先把编译好的镜像复制到 windows
- 11.2 创建新项目,并解决新项目编译报错问题
- 11.3 使用之前编译好的镜像创建模拟器
- 11.4 启动和使用创建好的模拟器
1. 安装编译Android源码依赖的软件包
以下命令都要全部执行完
sudo apt-get install -y openjdk-8-jdk
sudo apt-get install -y libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install -y tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install -y dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install -y git-core gnupg flex bison gperf build-essential
sudo apt-get install -y zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install -y libc6-dev-i386
sudo apt-get install -y lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install -y libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install -y lib32z1-dev ccache
sudo apt-get install -y bc python flex bison gperf libsdl-dev libesd0-dev build-essential zip curl
sudo apt-get install -y libssl-dev liblz4-tool
sudo apt-get install -y libesd-java libwxgtk3.0-dev squashfs-tools pngcrush schedtool libxml2
sudo apt-get install -y lzop schedtool lib32readline-dev libswitch-perl libssl-dev
其中 ,下载到第五个的时候报下面的错误
解决办法:
sudo vim /etc/apt/sources.list
在行尾添加如下两行的内容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
更新软件源并重新安装:
sudo apt-get update && sudo apt-get install libesd0-dev
2. 调整 SWAP 空间大小
查看 SWAP 空间大小
free -h
创建SWAP文件及分配大小
这里使用自己创建SWAP文件,名字可以随便取,为了方便取成SWAPfile,执行如下命令:
sudo dd if=/dev/zero of=/SWAPfile bs=1M count=20480
解释如下:
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
这里bs=1M,意味着输入输出块的大小为1MBytes,count=20480意味着我总共给这个将来的SWAP分区文件分配了1M * 20480= 20G的空间。
3. 设置权限
终端中进入root(也可以不进入),输入如下命令:
sudo chmod 0600 /SWAPfile
4. 将自定义文件变成swap文件:
sudo mkswap /SWAPfile
5. 配置启动文件
如果只是在终端里面配置好SWAP就不管了,那么在下次重新启动PC的时候SWAP又变成初始的默认值了,这里需要将其设置成启动时默认挂载swap空间,命令如下:
sudo gedit /etc/fstab
在最末增加新的一行
/SWAPfile swap swap defaults 0 0
6. 挂载启动swap空间
sudo swapon /SWAPfile
到这里就配置完全部流程了,可以执行 free -h 命令看看swap空间的大小是否有改变,最后再重新启动电脑,执行 free -h 看是否依然生效。
重启 Ubuntu 后,其 Swap 空间也会是这个 21 GB
下面开始编译Android模拟器
7. 初始化编译环境
配置环境变量
cd android-12.1.0_r4/
source build/envsetup.sh
lunch
一共有77个产品可以选择
这77个产品里面没有模拟器,我们 ctrl+c 退出
用下面的命令来选择模拟器
lunch sdk_phone_x86_64
8. 编译
使用下面的命令编译出可以在 windows 运行的 img,我花了大概5个半小时。
make sdk sdk_repo -j12
cd ~/android-12.1.0_r4
make clean
source build/envsetup.sh
lunch sdk_phone_x86_64
make sdk sdk_repo -j12
2022年 9月26日凌晨分 1:24 我终于编译成功了!!!
9. 在Ubuntu 中启动Android 虚拟机
cd ~/android-12.1.0_r4
emulator
报错
emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
CPU acceleration status: KVM requires a CPU that supports vmx or svm
解决办法:
1.先关闭虚拟机
2.勾选虚拟化Intel VT-x/EPT和AMD-V/RVI(V)
10. 在Ubuntu 启动编译好的 Android 模拟器
执行
cd ~/android-12.1.0_r4
sudo su
source build/envsetup.sh
lunch sdk_phone_x86_64
emulator
成功启动
**点击 ok **
打开摄像头
点击拍照,可以看到是真的能拍照保存,证明模拟器的 camera 使用没有问题。
除此之外,我们也可以将我们编译好的Android12镜像,拷贝到Windows 下,用来在 Android Studio 创建模拟器。
11. 在Android studio 中创建模拟器(写的很长)
11.1 先把编译好的镜像复制到 windows
进入到
~/android-12.1.0_r4/out/host/linux-x86/sdk/sdk_phone_x86_64
拷贝到了 windows,然后解压
11.2 创建新项目,并解决新项目编译报错问题
因为使用 Android Studio 运行项目会遇到各种配置问题,现在来教大家解决这些报错,然后再教大家使用之前编译好的 镜像 来创建模拟器。
打开 Android Studio
随便创建一个项目,然后点击运行,报错
现在来设置 jdk 的版本为 jdk 11 或以上,我设置的是 jdk 14(要提前在 jdk 官网下载,然后保存到本地,并且设置好java的环境变量)
设置 gradle 的目录(因为C盘空间有限,我把 gradle 移到别的盘了)
重新编译后成功
另外:如果有遇到下面的错误,只要将 compileSdk 和 targetSdk 改为 32 后重新编译即可。
改成32后再编译
11.3 使用之前编译好的镜像创建模拟器
先进入到 Android SDK 的目录,然后进入 system-images 目录
然后在 system-images 目录下创建 android-32 文件夹
然后进入刚才创建的 android-32 目录下创建 google_apis 文件夹
最后,我们把之前复制过来的镜像文件里的一部分复制到 google_apis 文件夹
这里面的内容如下
复制过来
现在就能在Android Studio 根据这个镜像来创建模拟器了
11.4 启动和使用创建好的模拟器
新版Android Studio 模拟器界面都不一样了
打开 camera app,点击拍照
后面我们会基于今天的这个模拟器,进行 Android Camera 的测试。