在 Ubuntu 下面我编译 android 12 已经尝试过很多次,都失败了。
都是执行下面这步的时候,编译了几个小时以后报错

make sdk sdk_repo -j12

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android


一开始给虚拟机分配了 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)

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_02


尝试过下面的解决办法,都失败了

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

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_03


添加下面这一行

Flag("-J-Xmx4096m").

还有

cd build/soong/java/config
gedit config.go

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_04


这几种方法怎么实验都会报和原来一样的错误

最后,我只能买了一根16GB 的内存条,电脑现在是8+16,一共 24GB 的内存。然后给虚拟机分配了21616MB 的内存(显示21.1GB),最后编译成功了。

下面是最重要的准备工作:

创建虚拟机,并且分配下图的内存和处理器

建议给虚拟机分配超过 21GB 的内存,不然仍然可能编译报错。

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_05

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_06


文章目录

  • 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

其中 ,下载到第五个的时候报下面的错误

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_开发语言_07


解决办法:

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

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_08

2. 调整 SWAP 空间大小

查看 SWAP 空间大小

free -h

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_09


创建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

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_10

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 看是否依然生效。

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_11

重启 Ubuntu 后,其 Swap 空间也会是这个 21 GB

下面开始编译Android模拟器

7. 初始化编译环境

配置环境变量

cd android-12.1.0_r4/
source build/envsetup.sh

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_开发语言_12

lunch

一共有77个产品可以选择

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_开发语言_13


这77个产品里面没有模拟器,我们 ctrl+c 退出

用下面的命令来选择模拟器

lunch sdk_phone_x86_64

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_14

8. 编译

使用下面的命令编译出可以在 windows 运行的 img,我花了大概5个半小时。

make sdk sdk_repo -j12

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_15

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 我终于编译成功了!!!

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_16

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

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_17


解决办法:

1.先关闭虚拟机

2.勾选虚拟化Intel VT-x/EPT和AMD-V/RVI(V)

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_18

10. 在Ubuntu 启动编译好的 Android 模拟器

执行

cd ~/android-12.1.0_r4
sudo su
source build/envsetup.sh 
lunch sdk_phone_x86_64 
emulator

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_19

成功启动

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_20


**点击 ok **

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_21

打开摄像头

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_22


android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_23

点击拍照,可以看到是真的能拍照保存,证明模拟器的 camera 使用没有问题。

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_24

除此之外,我们也可以将我们编译好的Android12镜像,拷贝到Windows 下,用来在 Android Studio 创建模拟器。

11. 在Android studio 中创建模拟器(写的很长)

11.1 先把编译好的镜像复制到 windows

进入到

~/android-12.1.0_r4/out/host/linux-x86/sdk/sdk_phone_x86_64

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_25

拷贝到了 windows,然后解压

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_26

11.2 创建新项目,并解决新项目编译报错问题

因为使用 Android Studio 运行项目会遇到各种配置问题,现在来教大家解决这些报错,然后再教大家使用之前编译好的 镜像 来创建模拟器。

打开 Android Studio

随便创建一个项目,然后点击运行,报错

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_27


现在来设置 jdk 的版本为 jdk 11 或以上,我设置的是 jdk 14(要提前在 jdk 官网下载,然后保存到本地,并且设置好java的环境变量)

设置 gradle 的目录(因为C盘空间有限,我把 gradle 移到别的盘了)

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_28

重新编译后成功

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_29

另外:如果有遇到下面的错误,只要将 compileSdk 和 targetSdk 改为 32 后重新编译即可。

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_30


改成32后再编译

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_31

11.3 使用之前编译好的镜像创建模拟器

先进入到 Android SDK 的目录,然后进入 system-images 目录

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_32


然后在 system-images 目录下创建 android-32 文件夹

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_33

然后进入刚才创建的 android-32 目录下创建 google_apis 文件夹

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_34


最后,我们把之前复制过来的镜像文件里的一部分复制到 google_apis 文件夹

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_35


这里面的内容如下

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_36

复制过来

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_37

现在就能在Android Studio 根据这个镜像来创建模拟器了

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_38

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android_39

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_Android_40

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_java_41

11.4 启动和使用创建好的模拟器

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_42

新版Android Studio 模拟器界面都不一样了

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_43


打开 camera app,点击拍照

android 模拟器模拟拍照 安卓模拟器 摄像头模拟_android 模拟器模拟拍照_44

后面我们会基于今天的这个模拟器,进行 Android Camera 的测试。