Android-自定义模拟器并导入IDE

515 阅读4分钟

01 前言

在上一篇【Android-源码编译】中,我们成功编译了源码和启动了模拟器;但是做Framework开发的同学在实际工作环境下,可能编译服务器和开发电脑不是同一个,甚至LINUX编译服务器都没有桌面系统,无法直接使用模拟器(当然也可以用xlaunch)。需要将自定义的模拟器镜像导入到开发电脑上的Android Studio里; 我们本篇文章将基于Android 12实现此需求

02 课前知识

1. Android 模拟器相关的资料在哪里?

【AOSP官方文档介绍】 这里可以看到官方的介绍,但是实际的操作过程和官方有些出入(根据经验来看完全参考次介绍大概率不会成功)

03 编译模拟器

step1: 执行lunch 产品

注意:Android 12及其之后想要编译源码同时产生模拟器相关的镜像,必须lunch sdk_开头的 比如 lunch sdk_car_x86_64-userdebug; Android 11可以lunch aosp_开头的

如果你是想编译Android 11及其之前的模拟器请强烈参考此文【编译AAOS镜像并导入Android Studio】

下面步骤为Android 12及其之后的操作说明(默认你已下载好源码,如没有请参考【Android-源码下载】)

source build/envsetup.sh
lunch sdk_car_x86_64-userdebug //(如果是Android11 可以用使用aosp_car_x86_64-userdebug)
make

step2: 打包模拟器镜像包

 make -j32 sdk sdk_repo

make sdk sdk_repo 命令会在 out/host/linux-x86/sdk/sdk_car_x86_64 下创建两个文件:

  • sdk-repo-linux-system-images-eng.[username].zip
  • repo-sys-img.xml (此文件我们本文没用到,因为配置之后也找不到本地镜像)

到此处,模拟器镜像就成功编译出来了。

04 导入Android Studio

step1: 自定义custom-repo-sys-img.xml描述文件

Android 12及其以下,需要配置repo-sys-img.xml文件,理论上将上述生成的此文件文职到Android Studio的自定义站点获取就可以,但实际上我这边依旧在创建模拟器的时候找不到这个本地镜像;所以参考了【编译AAOS镜像并导入Android Studio】,自定义了一个custom-repo-sys-img.xml 内容如下:

<?xml version='1.0' encoding='utf-8'?>
<sys-img:sdk-sys-img xmlns:sys-img="http://schemas.android.com/sdk/android/repo/sys-img2/01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<license id="android-sdk-license" type="text">bala bala</license>
	<channel id="channel-0">stable</channel>
	<remotePackage path="system-images;android-32;android-automotive;x86_64">
		<type-details xsi:type="sys-img:sysImgDetailsType">
			<api-level>32</api-level>
			<tag>
				<id>android-automotive-playstore</id><!--尾缀有playstore,创建模拟器时必须要选择有此标识的-->
				<display>Automotive Custom By ME</display> <!--创建模拟器时显示的镜像名称-->
			</tag>
			<vendor>
				<id>xxx</id>
				<display>My Automotive Build.</display>
			</vendor>
			<abi>x86_64</abi>
		</type-details>
		<revision>
			<major>3</major>
		</revision>
		<display-name>Android Automotive with My System Image</display-name>
		<uses-license ref="android-sdk-license"/>
		<channelRef ref="channel-0"/>
		<archives>
			<archive>
				<complete>
					<size>845778825</size> <!--大小 可以从编译生成xml中获取-->
					<checksum>c038a32dbe2516c0e41b5b261e3fb6cb03ba4498</checksum><!--shasum值 可以从编译生成xml中获取,也可以自己生成-->
					<url>file:///D:/Android/imgs/sdk-repo-linux-system-images-eng.xxx.zip</url><!--编译生成的镜像包路径-->
				</complete>
			</archive>
		</archives>
	</remotePackage>
</sys-img:sdk-sys-img>

step2: 在ASSettings中添加sdk update sites

打开Android Studio的设置界面中的SDK界面

image.png

加入自定义的站点路径

image.png

step3: 创建emulator模拟器 上面的xml tagid有playstore后缀所以需要有三角形的设备吗,当前这里是Automotive设备原因是我们的镜像lunch 为 sdk_car_xxx 以及在xml中配置的类型为automotive 所对应的

image.png

选择我们得本地镜像

image.png

继续下一步,直接finish

image.png

此时模拟器就创建完成了,能够在列表中看到

image.png

05 模拟器启动

打开方式一(不能remount)

正常情况下,我们会直接在Andorid Studio里面通过点击图片启动模拟器,如下

image.png

并且也能正常启动成功,如下

image.png

但是,当你想推包到Framework时会发现只能root 不能 remount , disable-verity也会报错

605ae8be9e5258766f754972651bb6d1.png

难道这样的镜像也不能remount 那整了半天要来有何用。 其实不然,还是有用,只是我们的打开方式不对。

打开方式二(可以remount)

在cmd面板进入Android sdk在本地的目录,然后进入emulator目录,通过命令启动:

emulator.exe -writable-system -avd Automotive_1024p_landscape_API_32

注意事项:

  1. 命令执行前要保证模拟器是关闭状态
  2. -avd 后面是模拟器的avdId,id如何看,通过使用Android Studio 模拟器参数界面,如下:

image.png

此时,等待模拟器正常启动,随后执行

adb root
adb disable-verity
adb reboot

adb root 
adb remount 
完成

恭喜我们remount成功,开始开发吧!

e9e206e8b15e3a7f9e65edf3c55e90a5.png

06 感谢参考链接

【编译AAOS镜像并导入Android Studio】

【使用 Android 模拟器虚拟设备】

【模拟器】Android Studio模拟器运行自己的编译的Android源码镜像(Android9.0~Android12已自测)

(正在尝试中)AOSP13及内核编译并部署到模拟器

AOSP 编译Android12源码全记录