一、前言
在 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
./sdkmanager --sdk_root=/home/zsk/Android/sdk/ "cmdline-tools;latest"
#切换至 cmdline-tools/latest/bin 目录下
./sdkmanager --install "emulator"
./sdkmanager --install "platform-tools"
./sdkmanager "system-images;android-28;default;x86_64"
# 这一步可以不用下载,直接创建platforms文件夹即可
./sdkmanager --install "platforms;android-28"
这里指定了系统版本和架构,default 这里我理解是不带谷歌系统服务的版本,还可以选择 google_apis 和 android-automotive-playstore 两个选项,分别代指包含谷歌服务和车载版本。
2.3 设置模拟器存放路径
创建的模拟器往往是比较大的,以 windows 为例是默认存储在 C 盘中,这样显然是不合适的,同时存在某些情况,例如为了建立统一的开发环境,需要将一套模拟器 copy 给多个人使用,那么显示的指定模拟器存放路径无疑是更加方便的,现在分别就 Linux 做简单阐述
在 SDK 包下创建 avd 目录用于存放模拟器
配置 ANDROID_SDK_HOME 环境变量,注意此变量名不可修改
# ~/.bashrc 或 /etc/profile
export ANDROID_SDK_HOME=$HOME/xxx/sdk/avd
export PATH=$PATH:$ANDROID_SDK_HOME
如有需要,还要修改 .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失败
./emulator -avd myAVD -writable-system
三、镜像替换
1、选择编译类型,同模拟器架构一样,例如 aosp_x86_64-eng
2、编译完成之后,在 out/target/product/generic_x86_64 目录下,找到对应修改的 img 用于替换模拟器中的 img。注意 system-qemu.img 和 vendor-qemu.img,这两个镜像是专门为模拟器运行制作的如果选择 system.img 和 vendor.img,则 avd 运行失败
3、将 system-qemu.img 和 vendor-qemu.img,重命名为 system.img、vendor.img
4、替换 Android/SDK/system-images/android-28/default/x86_64/ 下的对应 img
5、重新启动模拟器
四、模拟串口映射
./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 指令设置好串口的波特率之后才能写入数据
echo -e "\$CFGPRT,1,0,115200,1,3\r\n" > /dev/ttyUSB1
echo -e "\$CFGSAVE\r\n" > /dev/ttyUSB1
7、grep过滤串口数据操作
# --binary-files=text 表示将二进制视为文本搜索
cat ttyUSB1 | grep --binary-files=text xxx
7、Android 应用层打开串口时需要注意 seLinux 权限,具体使用方式可参见 项目实例
参考
[ 1 ] 手动修改android模拟器的system.img
[ 2 ] 如何使用avdmanager从命令行正确创建Android模拟器?
[ 3 ] Android模拟器挂载虚拟串口进行通信之踩坑记