在 Android 开发过程中会经常使用到模拟器,常用的方式是借助 Android Studio 去创建和运行模拟器,或者是使用第三方的例如雷电、逍遥、genymotion 等,在本篇文章中梳理一下通过命令行操作模拟器的的方法,以及串口和镜像替换的相关知识。
二、工具及环境准备
2.1 下载 Android SDK
访问 https://developer.android.google.cn/studio 链接,下载命令行工具,其中包含 avdmanager、sdkmanager:
2.2 安装必须的 SDK 包
使用 SDK 自带工具 sdkmanager,位于 cmdline-tools/bin 目录下,注意要使用模拟器则开发包中必须存在这四个目录:emulator、 platform-tools、system-images、platforms,可以分别使用如下命令下载:
#先安装最新版本 cmdline-tools |
这里指定了系统版本和架构,default 这里我理解是不带谷歌系统服务的版本,还可以选择 google_apis 和 android-automotive-playstore 两个选项,分别代指包含谷歌服务和车载版本。
2.3 设置模拟器存放路径
创建的模拟器往往是比较大的,以 windows 为例是默认存储在 C 盘中,这样显然是不合适的,同时存在某些情况,例如为了建立统一的开发环境,需要将一套模拟器 copy 给多个人使用,那么显示的指定模拟器存放路径无疑是更加方便的,现在分别就 Linux 做简单阐述:
在 SDK 包下创建 avd 目录用于存放模拟器,配置 ANDROID_SDK_HOME 环境变量,注意此变量名不可修改
# ~/.bashrc 或 /etc/profile |
如有需要,还要修改 .android/avd 目录下已经创建的模拟器的配置文件,例如 device9.0.ini 中修改
path=/…/sdk/avd/.android/avd/device9.0.avd 即可
2.4 创建模拟器
使用 SDK 自带工具 avdmanger,位于 Android/SDK/tools/bin 目录下,主要指令如下:
指令 | 描述 |
---|---|
list、list avd、list target、list device | 罗列存在的模拟器 |
create avd | 创建模拟器 |
move avd | 移动或重命名模拟器 |
delate avd | 删除模拟器 |
create avd 主要指令如下:
指令 | 描述 |
---|---|
-c | 设置模拟器 SD 卡大小 |
-k | 模拟器的系统映像的程序包路径 |
-b | 设置模拟器的 ABI |
-n | 模拟器名字 |
-f | 强制创建(会覆盖现有模拟器) |
实例如下:
./avdmanager create avd -n myAVD -k "system-images;android-28;default;x86_64" -b x86_64 -c 2048M -f |
2.5 启动模拟器
使用 SDK 自带的工具 emulator,位于 /Android/SDK/emulator 目录下:
# -writable-system 不添加此参数 会导致remount失败 |
三、镜像替换
- 选择编译类型,同模拟器架构一样,例如 aosp_x86_64-eng
- 编译完成之后,在 out/target/product/generic_x86_64 目录下,找到对应修改的 img 用于替换模拟器中的 img。注意 system-qemu.img 和 vendor-qemu.img,这两个镜像是专门为模拟器运行制作的如果选择 system.img 和 vendor.img,则 avd 运行失败
- 将 system-qemu.img 和 vendor-qemu.img,重命名为 system.img、vendor.img
- 替换 Android/SDK/system-images/android-28/default/x86_64/ 下的对应 img
- 重新启动模拟器
四、模拟串口映射
./emulator -avd myAVD -writable-system -qemu -serial /dev/ttyUSB0 |
五、关于串口的一些指令
1、设置串口的波特率
stty -F /dev/ttyUSB0 raw 460800 |
2、获取串口的基本信息
stty -F /dev/ttyUSB0 |
3、向串口传输文件
cat test.txt > /dev/ttyUSB0 |
4、展示串口输出数据
cat /dev/ttyUSB1 |
5、保存串口输出数据
cat /dev/ttyUSB1 > log.txt |
6、向串口输入数据/指令
#这里可能需要先使用 stty 指令设置好串口的波特率之后才能写入数据 |
7、grep过滤串口数据操作
# --binary-files=text 表示将二进制视为文本搜索 |
7、Android 应用层打开串口时需要注意 seLinux 权限,具体使用方式可参见 项目实例
参考
[ 1 ] 手动修改android模拟器的system.img
[ 2 ] 如何使用avdmanager从命令行正确创建Android模拟器?
[ 3 ] Android模拟器挂载虚拟串口进行通信之踩坑记