VTS测试
Android 8.0引⼊了Project Treble的新特性,它的主要⽬标是将Android模块化,在这⼀特性的要求下,就产⽣了VTS测试。
VTS全称是Vendor Test Suite,Project Treble中引⼊Vendor Interface的⽬的是将Android Framework与HAL分开,并通过VTS测试来对这些Vendor Interface进⾏测试以确保HAL的向前兼容。
尽管APP层与Framework层在设计上是分开的,但通过CTS测试,确保了APP与Android Framework之间有⼀致的调⽤接⼝(API),这使得APP开发者编写的同⼀款程序可以运⾏在不同系统版本(向前兼容)、不同硬件平台、不同⼚商制造的不同设备上。
VTS类似CTS,通过对Vendor Interface进⾏测试,确保同⼀个版本的Android Framework可以运⾏在不同HAL上,或不同Android Framework可以运⾏在同⼀个HAL上。
2. 环境配置
2.1 安装Java 8
sudo apt-get purge openjdk-* icedtea-* icedtea6-*
sudo apt-get update
sudo apt-get install openjdk-8-jdk
2.2 安装Android需要的⼯具
sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip liblz4-tool
2.3 拉取AOSP代码(可选)
repo sync
2.4 安装VTS需要的⼯具
sudo apt-get install python-dev
sudo apt-get install python-protobuf
sudo apt-get install protobuf-compiler
sudo apt-get install python-virtualenv
sudo apt-get install python-pip
3. GSI
GSI是Google AOSP System Image的简称,在进⾏VTS测试之前,要使⽤ur版本关闭verified boot后刷⼊GSI,VTS测试⽤的GSI由⾕歌释放,它的命名规则如下:
如VTS r6版本的GSI镜像:
其中,安全补丁⽇期在⼿机的Settings -> System -> About phone中查看,或者使⽤命令getprop查看ro.build.version.curity_patch属性,如果刷⼊的GSI安全补丁⽇期与⼿机的安全补丁⽇期不对应,会导致keymaster崩溃等问题,系统⽆法启动。
A/B或者是A-only分区可以直接查看源码中的l⽂件,如果system、vendor等分区的label有”
_a”和”_b“的后缀,说明是A/B分区,或者使⽤命令getprop查看ro.boot.slot_suffix的属性,如果返回”_a”或者”_b”,也可以说明是A/B分区,否则就是A-only的分区。
刷⼊GSI的命令如下:
fastboot –S 256M flash system
fastboot –w
fastboot flash urdata urdata.img
//urdata分区⼤⼩与镜像⽂件⼤⼩不同时需要使⽤此命令
在刷⼊GSI之后,可能会遇到⽆法启动的问题,⽐如:
1. VTS r3之前版本的GSI由于system分区的根⽬录下缺少bt_firmware⽂件夹,⽽fstab中要将/dev/block/bootdevice/by-
name/bluetooth分区挂载到bt_firmware下⾯,因此会导致挂载失败系统⽆法启动,要解决这个问题需要⼿动创建bt_firmware⽂件夹,命令如下:
adb remount
adb shell
mkdir bt_firmware
chown bluetooth bt_firmware
chgrp net_bt bt_firmware
adb reboot
2. 在刷⼊GSI以后,开机卡在Android界⾯,此时插⼊USB有adb接⼝,通过logcat查看发现缺少库⽂件导致进程crash,如果跟需要测试的模块⽆关,可以先尝试⼿动push库⽂件看能否启动,之后根据进程和缺少的库⽂件,可以分为三种情况:
1) 第⼀种情况是⾼通将库⽂件编译到了system⽬录下,刷⼊GSI后vendor进程找不到这些库⽂件导致
crash,解决⽅法是修改makefile将需要的库⽂件编译到vendor分区下,在Android.mk中添加LOCAL_VENDOR_MODULE := true。
3) 第三种情况是由于我们的修改让vendor⾥⾯的进程依赖了额外的库⽂件,⽽这些依赖的库⽂件⼜在system⽬录下,刷⼊GSI以后消息,导致进程crash,如QL1661项⽬中,camera的前置闪光灯功能添加了⼀个system分区下的进程*********************************_vendor,⽽这个进程⼜添加到了vendor下**********************************的共享库,因此当刷⼊GSI以后,**********************************找不到*********************************_vendor,导致⽆法开机。