Android 8.0引入了Project Treble的新特性,它的主要目標(biāo)是將Android模塊化,在這一特性的要求下,就產(chǎn)生了VTS測試。
VTS全稱是Vendor Test Suite,Project Treble中引入Vendor Interface的目的是將Android Framework與HAL分開,并通過VTS測試來對這些Vendor Interface進行測試以確保HAL的向前兼容。
盡管APP層與Framework層在設(shè)計上是分開的,但通過CTS測試,確保了APP與Android Framework之間有一致的調(diào)用接口(API),這使得APP開發(fā)者編寫的同一款程序可以運行在不同系統(tǒng)版本(向前兼容)、不同硬件平臺、不同廠商制造的不同設(shè)備上。
VTS類似CTS,通過對Vendor Interface進行測試,確保同一個版本的Android Framework可以運行在不同HAL上,或不同Android Framework可以運行在同一個HAL上。

2. 環(huán)境配置
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 init -u https://android.googlesource.com/platform/manifest -b android-vts-8.0_r6
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測試之前,要使用user版本關(guān)閉verified boot后刷入GSI,VTS測試用的GSI由谷歌釋放,它的命名規(guī)則如下:

如VTS r6版本的GSI鏡像:

其中,安全補丁日期在手機的Settings -> System -> About phone中查看,或者使用命令getprop查看ro.build.version.security_patch屬性,如果刷入的GSI安全補丁日期與手機的安全補丁日期不對應(yīng),會導(dǎo)致keymaster崩潰等問題,系統(tǒng)無法啟動。

A/B或者是A-only分區(qū)可以直接查看源碼中的partition.xml文件,如果system、vendor等分區(qū)的label有”_a”和”_b“的后綴,說明是A/B分區(qū),或者使用命令getprop查看ro.boot.slot_suffix的屬性,如果返回”_a”或者”_b”,也可以說明是A/B分區(qū),否則就是A-only的分區(qū)。

刷入GSI的命令如下:
fastboot –S 256M flash system
fastboot –w
fastboot flash userdata userdata.img
//userdata分區(qū)大小與鏡像文件大小不同時需要使用此命令
在刷入GSI之后,可能會遇到無法啟動的問題,比如:
1. VTS r3之前版本的GSI由于system分區(qū)的根目錄下缺少bt_firmware文件夾,而fstab中要將/dev/block/bootdevice/by-name/bluetooth分區(qū)掛載到bt_firmware下面,因此會導(dǎo)致掛載失敗系統(tǒng)無法啟動,要解決這個問題需要手動創(chuàng)建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查看發(fā)現(xiàn)缺少庫文件導(dǎo)致進程crash,如果跟需要測試的模塊無關(guān),可以先嘗試手動push庫文件看能否啟動,之后根據(jù)進程和缺少的庫文件,可以分為三種情況:
1)? 第一種情況是高通將庫文件編譯到了system目錄下,刷入GSI后vendor進程找不到這些庫文件導(dǎo)致crash,解決方法是修改makefile將需要的庫文件編譯到vendor分區(qū)下,在Android.mk中添加LOCAL_VENDOR_MODULE := true。
2)? 第二種情況是一些本來應(yīng)該在GSI里面的庫文件沒有編譯進去,vendor或者system下的進程找不到這些庫文件導(dǎo)致crash,解決方法只能是測試前手動將庫文件push到system分區(qū)下,而不要添加LOCAL_VENDOR_MODULE := true,等待后續(xù)的VTS版本GSI鏡像解決,為了確認(rèn)錯誤具體是第一種還是第二種情況,需要向高通提case詢問,也可以在https://issuetracker.google.com/issues和https://android-review.googlesource.com/上搜索相關(guān)信息。
3)? 第三種情況是由于我們的修改讓vendor里面的進程依賴了額外的庫文件,而這些依賴的庫文件又在system目錄下,刷入GSI以后消息,導(dǎo)致進程crash,如QL1661項目中,camera的前置閃光燈功能添加了一個system分區(qū)下的進程vendor.android.hardware.light@2.0_vendor,而這個進程又添加到了vendor下android.hardware.light@2.0-service的共享庫,因此當(dāng)刷入GSI以后,android.hardware.light@2.0-service找不到vendor.android.hardware.light@2.0_vendor,導(dǎo)致無法開機。
