2022.11.01 今天惊讶地发现,Google 现已正式把这个模仿器的技能命名成了“云安卓”。感觉应该能够有更多玩法,等待国内厂商玩出花……


长期以来,许多文章一讲到结构,总是脱不开下载源码、编译、刷机三个过程。于是乎,一台 Google 亲儿子 Pixel 手机好像成了搞结构开发的入门必备。

事实上,Google 自己也面对着同样的问题。整个 Android 团队分布在全球各地,开发 + 设计 + 测试团队少说也有上几千人。Google 每年都会发布新手机,假如在每次研制新品都人手一台真机,消耗一定是巨大的。而且真实在手机厂商待过的同学才会知道,在新手机量产之前,测试机的资源都是非常严重的,根本不或许做到人手一台。

但是问题是摆在这的,开发需求真机的环境,测试需求真机来验问题,稳定性团队需求许多的手机来跑 Monkey,莫非就真的没有一个方法脱节对真机的依靠吗?

引见 Cuttlefish

Cuttlefish 姓名由来

要说清楚 Cuttlefish,首先要介绍一下这个姓名的由来。了解 Google 的同学都知道他们起姓名向来很搞,这个时分需求先提一下另外一条鱼,Goldfish。

早年接触过 Android 开发的同学,对 avd 这个名词应该不会陌生。没错,便是 Android Virtual Device,咱们口中的“模仿器”。 在那个手机性能非常拉胯的蛮荒时代,avd 的出现解决了许多开发者需求依靠真机的问题。而 avd 背后的原理便是 Goldfish。事实上,Goldfish 一起也是 Android 的一个内核代号。

avd 的确极大程度解决了使用开发者的问题,做使用的小伙伴,改一下代码,编出一个 apk,能够直接 adb install 一瞬间就能看到效果,那结构开发者呢?虽然咱们也有 adb push,但仍然有许多变更是需求编固件才能验证的。编固件需求服务器去拉整个其他部门的代码来全编,全编需求等,好不容易等到固件出来了,需求吭哧吭哧刷机,刷机又很容易起不来,就算起来了,还有或许发现修正压根没收效……这一系列的操作完一抬头,估计下班时刻也快到了,你就说你今天加不加班吧?

Google 也发现了这个问题,从 Android 11 那时分开端,就现已着手研制下一代的模仿器,思路也很简略。传统的模仿器还是太重了,现在但是云时代啊,有没有或许运用一些技能,让 Android 跑在“云端”,而用户乃至经过浏览器就能够拜访到呢?时刻来到 2022 年,这条鱼总算有了一个相对稳定的版别,便是下面要讲的 Cuttlefish。

什么是 Cuttlefish?

Google 官方给出的定义是:

Cuttlefish 是一种可装备的虚拟 Android 设备,既能够长途运转(运用第三方云产品,如 Google Cloud Engine),又能够在本地运转(在 Linux x86 机器上)。

怎样了解呢?咱们都知道国内大厂许多都有自己的云服务,比方阿里有阿里云,腾讯有腾讯云,华为有华为云。Google 天然也不例外,他们有自己的计算渠道 Google Cloud Engine(以下简称 GCP)。自己买过服务器折腾过的小伙伴应该知道,有了实例之后,你就能够装操作系统,Linux、Windows 都行,然后再跑对应的服务,就能够长途拜访了。

得益于 Cuttlefish,很早之前,Google 的一些结构开发的测试验证和稳定性验证作业就不在真机去做了,而是在 GCP 的一个个实例里进行。过程也非常简略,只需求一台 Ubuntu 实例,设置好环境,下载代码,lunch Cuttlefish 的 target,编译布置,最终直接经过浏览器拜访,就能够看到一个网页在线的模仿器。而且这一切,Google 全都是开源的,而且官网也有具体的操作过程。既然能够布置到服务器,也就意味着咱们能够本地验证,下面带咱们了解一下本地运转。

布置 Cuttlefish

Google 其实现已在官网给出了具体的操作过程了,不过最终那几步是让咱们下载他编译好的镜像。咱们不一样!我预备带咱们现编现卖,毕竟咱们但是开发者!

环境装备

一台 x86_64 的电脑,Linux 环境,我自己惯用的是 Linux mint,理论上 Ubuntu 20.04 即可。没必要装太老的版别。

根本过程

  1. 确定一下电脑有没有 kvm,换句话说,承认一下是否支撑虚拟化:

    grep -c -w "vmx\|svm" /proc/cpuinfo
    

    上面的指令应该返回一个大于 0 的值,证明环境没问题。

  2. 运用如下指令安装 CuttleFish 所需的依靠:

    sudo apt install -y git devscripts config-package-dev debhelper-compat golang curl
    git clone https://github.com/google/android-cuttlefish
    cd android-cuttlefish
    for dir in base frontend; do
      cd $dir
      debuild -i -us -uc -b -d
      cd ..
    done
    sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
    sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot
    

    留意,最终那个指令是重启电脑,记住保存手头作业关掉其他窗口。

  3. 下载 AOSP 源码,国内引荐咱们用清华或者科大的镜像,能够参考这篇文章来进行。

  4. 挑选方针,开端编译:

    source build/envsetup.sh
    lunch aosp_cf_x86_64_phone-userdebug
    

    留意,这儿的 aosp_cf_x86_64_phone-userdebug 是手机的镜像。假如咱们想要编译其他方针,能够输入 lunch,然后在菜单里进行挑选。其实咱们从这儿就能够看到,Google 这几年一直在活跃开发 CuttleFishaosp_cf 后边有各种设备类型,从手机,到TV,再到车机,反而是最下面 sdk_ 开头的方针没有那么多了,要知道,这但是之前编本地模仿器时分的方针呀。假如咱们有爱好的话,能够挑选其它方针进行编译。

  5. 开端编译:

    m
    

    你没看错,便是一个 m。许多教程里还会让咱们加上 -j 参数来指定任务数,我在这儿并不引荐,由于每个人的电脑性能不同,这个参数设大了,在性能差的设备上编译会被直接 kill,设小了,又无法把性能跑满,所以还不如不传,编译脚本会依据你的电脑装备自己决定的。 假如是新同步的代码,第一次会全编 AOSP 所有模块并输出镜像。我运用一台 Dell Precision 3660,时刻大约在 50 分钟左右。

  6. 模仿器开机:

    $ launch_cvd --start_webrtc=true
    

    Google 的命名梗又来了,他们把经由 Cuttlefish 搭建的模仿器称为 cvd,正好与 avd相对应。--start_webrtc 声明了咱们需求在浏览器中运用 WebRTC 管理拜访 Cuttlefish 设备。

    就这么简略,假如一切顺利,不会一瞬间就能够在指令行见到一串 Boot completed,这代表模仿器现已发动好了。

编完 aosp 还在刷机?云安卓了解一下,来试试网页版模拟器吧!

这个时分咱们翻开浏览器,输入 https://localhost:8443,回车,就能够看到 Cuttlefish 主动帮咱们运用 WebRTC 搭建并运转的页面,咱们在左侧挑选刚才发动的 cvd 实例,在右边就能够看到它的实时画面,和传统的 avd 没有差异,点击事情什么的也彻底能够呼应,一起左侧还有一个工具条,能够模仿一些高档操作,这一点也和之前用的 avd 相似。

编完 aosp 还在刷机?云安卓了解一下,来试试网页版模拟器吧!

运用 Cuttlefish

adb 指令

Cuttlefish 一旦跑起来之后,和本机用数据线插着一台手机是没什么两样的,运用 adb devices 能够看到这台设备,翻开 Android Studio,也能够看到 logcat 里有日志输出。

多实例发动

前面说过,Google 的测试团队很早就开端用 Cuttlefish 来验 bug 和跑 Monkey 了,这就面对多设备的问题,而 Cuttlefish 是完美支撑多开的,只需求在发动的时分加上 --num_instances 参数即可,后边的数字代表你要发动几个实例。这儿我以发动 2 个实例为例:

$ launch_cvd --start_webrtc=true --num_instances= 2

假如提示 launch_cvd 找不到,你应该是忘掉 source build/envsetup.sh && lunch aosp_cf_x86_64_phone-userdebug 了。

编完 aosp 还在刷机?云安卓了解一下,来试试网页版模拟器吧!

能够从网页看到此时现已有2台设备在运转了,这两台设备是独立的,没有任何关系。咱们尝试履行一下 adb devices:

$ adb devices
List of devices attached
0.0.0.0:6520	device
0.0.0.0:6521	device

的确能够看到两台设备,Cuttlefish 会从第一台设备开端,将端口号往上递增,来区别不同设备。有了多台设备,就能够轻松跑一些稳定性测试之类的了。还有许多其它用例,跟插着多台设备相似,不在此赘述。

下图演示了在 Cuttlefish 上运转 atest 测试。说实话单元测试在许多公司好像都不被注重,但 Google 自己的代码几乎都有单元测试。关于单元测试引荐 qing 的这篇文章:《给安卓开发小白们的unit test指南 – 这也能测?这也要测?》。

编完 aosp 还在刷机?云安卓了解一下,来试试网页版模拟器吧!

实战:Framework 修正快速验证

Cuttlefish 在我这段时刻用下来而言,最大的优点无非便是便当了我对 AOSP 的开发调试和验证,免除的繁琐的编模块,adb push,乃至刷机等过程。这儿打算以 Settings 模块为例,假定我现在有一个需求,想在 Settings 发动时弹出一个 toast。

为了调试便当,这次挑选 lunch eng 的类型:

$ source build/envsetup.sh && lunch aosp_cf_x86_64_phone-eng

下面开端做需求,这儿简略粗犷一些,直接翻开 DashboardFragment.java,在 onCreate 加上代码:

@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    Toast.makeText(getPrefContext(), "Hello Cuttlfish", Toast.LENGTH_SHORT).show();
    // Settings 原生代码
    }
}

这仅仅最最最简略的改动,而更多时分,了解 Settings 模块的同学都知道,日常做 Settings 的需求,你或许还需求改到 SettingsLibframework/base,还有其它许多相关目录,要编好几个 apk,好几个 jar,验证的时分要 push 一大堆东西到不同的目录,非常苦楚。

有了 Cuttlefish 之后,好像就没那么杂乱了。我一般会直接在 AOSP 根目录履行一下全编:

$ m

有些小伙伴估计急了,你特么在逗我?全编?别慌,要知道编译是增量的。Soong 会比对前后的 Ninja 文件,假如没有差异,直接越过,有差异,则会编对应的地方。所以一般我乃至不关心我需求编哪几个模块,整个交给编译系统就好了,如下图所示:

编完 aosp 还在刷机?云安卓了解一下,来试试网页版模拟器吧!

由于是全编,模块编译完之后会主动生成新的 system.img

编完 aosp 还在刷机?云安卓了解一下,来试试网页版模拟器吧!

没有漫长的复制固件,没有漫长的刷机过程,无需担心能不能点亮,无需一次次点击为了越过开机导游,而是直接发动 Cuttlefish,还记住指令吗?

$ launch_cvd --start_webrtc=true

然后翻开咱们修正后的模块:

看到 Toast 弹出,修正现已收效了,便是这么便当!

更多用法

Cuttlefish 的更多用法,主张咱们直接看官网,这儿就不照搬了。其实 Google 许多文档写的都很具体,只可惜许多小伙伴要么不看,要么便是出问题直接搜百度,找到的都是别人消化后的东西。希望咱们能养成“先看官网,后看文章”的好习惯。

source.android.com/docs/setup/…

总结

本文根据现阶段 Android Framework 工程师在开发调试阶段或许遇到的实际问题,向咱们介绍了 Google 的云安卓计划,该计划不依靠物理设备,而是根据虚拟机 + WebRTC,经过浏览器就能够拜访到云设备,理论上能够为 Android Framework 开发测试作业带来极大的便当。另外,云安卓整个技能理论上也会有许多其它使用场景,咱们能够自行发挥创造力。