本期内容的视频地址:www.bilibili.com/video/BV1kR…

Hello各位好,最近作业比较忙导致这期视频拖更了,并且因为博主新冠恢复的这几个月里,嗓子仍是一直有异物感,说话口水多,嗓子也简单疼,个人配音效果并不好,本期视频开端运用腾讯智影东西进行配音。

本期视频咱们介绍学习车载Android运用开发的第一步,怎么下载、编译 AOSP源码,发动原生的车载Android模拟器 ,一同也会介绍一些常见的编译指令,以及实践作业中可能会呈现的编译场景。


AOSP 概述

AOSP 概述

AOSP 安卓开源项目(Android Open Source Project),是一项旨在辅导Android移动平台开发的计划 。

Android 是一个适用于移动设备的开源操作体系,也是由 Google 主导的对应开源项目。作为一个开源项目,Android 的方针是避免呈现任何会集瓶颈,即没有任何行业参与者可一手限制或操控其他任何参与者的创新。为此,Android 被打造成了一个适用于消费类产品的完好高品质操作体系,并配有可自定义并运用到几乎一切设备的源代码,以及一切用户均可访问的揭露文档(英文网址:source.android.com;简体中文网址:source.android.google.cn)。

【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译

学习AOSP的意义

有过一些车载运用开发经验的同学,可能会有困惑,为什么要下载 Android 源码?

的确从作业的角度来说,咱们在实践的车载运用开发中往往并不会下载完好的Android源码,而是仅仅下载每个人担任的一个运用模块,可是咱们在学习车载运用开发时,依然主张下载完好Android的源码进行学习。从UP自己的阅历来说,学习AOSP有以下优势:

  • 参阅体系运用的完成

车载Android运用开发,首要难点都会集在怎么开发Android体系运用上。例如,定制Launcher时,咱们首先需求了解原生的Launcher的完成办法,才干游刃有余地定制出契合产品需求的Android桌面。

  • 了解Android体系的运转原理

AOSP包括了完好的Application、Framework、Native、HAL等各各层级的源码,咱们在学习时能够修正源码、增加输出日志,再编译运转检查成果,这样能够便利咱们直观的了解Android体系的运转机制。

  • 作业需求

有的公司在开发车载项目时会给开发开通整个源码权限,这样便利开发在本地编译Android源码进行烧机测验,那么就需求咱们把握整个Android源码的编译办法。


源码办理东西

下载Android源码之前,要先装置其构建东西 Repo 来初始化源码。Repo是Android用来辅助Git作业的一个东西。

Repo

Repo 简介

Repo是Google运用python脚本编写的用于调用Git的脚本,首要用来下载、办理Android项目的软件库房。

Repo不会取代Git,可是它能够让开发者在Android环境中愈加轻松的运用Git。

在大多数情况下,的确能够仅运用 Git(不必运用 Repo),或结合运用 Repo 和 Git 指令以组成复杂的指令。不过,运用 Repo 履行根本的跨网络操作可大大简化咱们的作业。

装置 Repo

第 1 步,创立一个bin目录,并将这个目录增加到体系的环境变量中

mkdir ~/bin
PATH=~/bin:$PATH

第 2 步,下载 repo

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

装置完repo后需求运用source指令从头加载linux的装备环境,这儿咱们简单一些直接重启操作体系就行。


Git

Git 简介

Git是一个开源的分布式版别操控体系,能够有效、高速地处理从很小到十分大的项目版别办理。也是现在运用规模最广的版别操控体系。

Android 运用 Git 履行本地操作,例如树立本地分支、提交、比照差异、修正。Google 开端决议运用一种分布式修订版别操控体系,通过挑选最终选中了Git。

对于分支要求不高的项目会选用SVN或其它在线作业软件办理。例如,在UP的公司,车载项目的文档类材料曾经选用SVN进行办理,现在现已统一切换到飞书体系上。

装置 Git

第 1 步,履行装置指令

sudo apt install git

第 2 步,装备 Git 大局环境

git config --global user.name "用户名"
git config --global user.email "邮箱"

第 3 步, 生成 ssh 秘钥(可选装备)

ssh-keygen

一直按回车,生成的秘钥文件会在 ~/.ssh目录下载,咱们将~/.ssh目录下的id_rsa.pub 里边的内容复制到库房办理体系相应的SSH Key中,在后续的代码下载时就不需求再输入用户名和暗码。

车载项目常见的源码库房办理体系是Gerrit 和 GItLab。

在线阅览、检索AOSP源码

aospxref.com/ 是一个在线的 AOSP 源码阅览网站,在这个网站上咱们能够很轻松,阅览、检索 Android 的源码,并且对于车载 Android 开发而言,阅览源码十分的重要。


下载 AOSP

硬件环境

AOSP 的下载、编译理论上支撑 Mac和Linux,可是个人十分不主张在非 Linux 环境下测验编译,其间要踩的坑实在太多。

下载 Android 12 及今后的版别,需求至少100GB的硬盘空间,编译Android 12 则需求300GB的硬盘空间和16GB以上的内存,低于这个装备在编译时大概率会报错。

个人的PC环境如右所示:

【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译

  1. 下载办法

下载 AOSP 有以下两种办法

  • 运用初始化源码包

中科大和清华大学供给了AOSP源码的压缩包,现在的包大约有60GB左右,能够运用指令行或迅雷等下载东西下载。

长处:下载速度快,支撑断点续传。

缺陷:不靠近作业环境,实践项目中不运用这种办法。

清华大学文档:mirrors.tuna.tsinghua.edu.cn/help/AOSP/

中科大文档:mirrors.ustc.edu.cn/help/aosp.h…

  • 运用 repo 直接同步源码

运用repo直接同步源码,是Android官方文档中运用的办法。

长处:更靠近作业环境。在实践项目中也是运用这种办法同步Android源码。

缺陷:源码太大,外网不稳定、速度很慢,简单同步失败(实践项目中,咱们运用公司内网不会存在这个问题)。

官方文档:source.android.google.cn/docs/setup/…

因为下载Android源码十分耗费服务器的带宽和I/O,中科大和清华大学的文档中都强烈要求咱们运用第一种办法同步源代码。

假如下载Android官方的AOSP的源码,UP主张运用下载压缩包的办法,假如是下载公司项目的Android源码,则只能运用repo同步。

下面咱们别离演示这两种下载Android源码的办法:


第 1 种办法,运用Android源码包

第 1 步,树立作业目录

开端下载AOSP源码之前,需求在适宜的位置创立一个目录用于放置源码,运用如下指令

mkdir AOSP
cd AOSP

第 2 步,下载AOSP初始化包

下载AOSP初始化也有两种办法

第一种,是运用CURL指令行东西。个人主张运用这种办法下载,假如半途意外中止,在履行一次相同的CURL指令,即可进行断点续传。

curl -OC - https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar

第二种,运用下载东西下载源码包。下载东西能够是浏览器,也能够是迅雷等专用下载东西

下载初始化包,能够用恣意操作体系,乃至只需你的手机闪存足够大,用手机下载也无所谓。之后能够拷贝到 Linux 电脑中编译。

第 3 步,解压初始化包

下载后的初始化包是一个.tar的压缩包,既能够运用指令行解压,也能够用操作体系的图形化东西解压。解压指令如下:

tar xf aosp-latest.tar

因为压缩包十分大,解压需求一定的时刻,这一步主张运用图形化东西解压,便利咱们检查进展。

解压完成后的初始化包,只保留了.repo目录,运用快捷键Ctrl+H显现躲藏文件。履行 repo sync 即可拉取Android骨干分支的源码。

cd aosp
repo sync 
# 或 repo sync -l 仅checkout代码

尔后,每次只需运转 repo sync 即可保持与主分支同步。

不过咱们并不需求骨干分支的源码,咱们需求挑选同步指定版别的Android源码,持续如下的操作

第 4 步,同步指定分支的源码

首先切换到.repo/manifests目录,再运用git fetch指令,拉取最新的远程代码库。

cd .repo/manifests
git fetch --all
git branch -r

运用git branch -r检查现在最新分支,这儿咱们挑选android 13的分支,履行repo指令,将当时源码库从骨干分支切换到Android 13的分支上。

repo init -b android-13.0.0_r20

最终,履行repo sync 同步源码,就能够得到完好的Android 13源码了。

repo sync

第 2 种办法,运用 repo 直接同步源码

第 1 步,树立作业目录

相同的,在开端下载AOSP源码之前,需求在适宜的位置创立一个目录用于放置源码,运用如下指令:

mkdir AOSP
cd AOSP

第 2 步,初始化库房

运用repo init 指令初始化源码库房。

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

第 3 步,同步源码

履行repo sync 指令同步源码。

repo sync

假如提示无法连接到 gerrit.googlesource.com,能够将以下内容装备到体系的环境变量中,然后重启操作体系。

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

假如需求同步指定的Android版别,只需求在repo init之后加上-b带上分支名称即可。

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-11.0.0.0_r40
repo sync

有关repo的更多运用办法,能够具体阅览中科大或清华大学的官方文档,这儿不再赘述。


Android 源码文件目录结构

  • package

运用层(Application)源码。体系运用就在这儿了,比如说体系设置,桌面,相机,电话之类的。

  • frameworks

体系结构(Framework)层源码。

  • hardware

硬件笼统(HAL)层源码。

  • out

输出目录。编译今后生成的目录,相关的产出就在这儿了

  • build

用于构建Android体系的东西。也便是用于编译Android体系的

目录 描绘
abi Application Binary Interface 运用程序二进制接口
art Android Runtime。 这个会提前把字节码编译成二进制机器码保存起来,履行的时分加载速度比较快。Dalvik虚拟机则是在加载今后再去编译的,所以速度上ART会比Dalvik快一点。牺牲空间来赢取时刻
bionic 基础库,Android体系与Linux内核的桥梁。Bionic 音标为 bnik,翻译为”仿生”
bootable 体系发动引导相关程序
cts Compatibility Test Suite 兼容性测验
dalvik dalvik虚拟机,用于解析履行dex文件的虚拟机
developers 开发者目录
developerment 开发目录
devices 设备相关的装备信息
docs 文档
external 开源模组相关文件
libcore 中心库
libnativehelper native协助库,完成JNI的相关文件
ndk native development kit
pdk Plug-in Development Kit (PDK) is designed to help you build your own pattern projects
platform_testing 平台测验
prebuilts x86/arm架构下预编译的文件
sdk software development kit
system 底层体系文件
toolchain 东西链
tools 东西文件
Makefile mk文件,用于操控编译

编译 AOSP

  1. 装备编译环境

编译Android源码会用到许多第三方库,咱们需求先将这些库装备好,指令如下

sudo apt update
sudo apt install flex bison build-essential zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc fontconfig -y
sudo apt install make git-core gnupg zip unzip curl python3 openjdk-11-jdk -y
sudo apt clean && sudo apt autoremove -y
  1. 编译 Android 镜像

第 1 步,加载环境变量

在Android源码根目录履行source build/envsetup.sh,该指令会将lunch以及其他程序和变量增加到shell环境中。

cd aosp
source build/envsetup.sh

第 2 步,挑选编译的方针

因为是在电脑上调试编译出的版别,所以这儿咱们挑选 car_x86_64-userdebug。

履行lunch指令之前,当时窗口的shell环境有必要现已履行过source build/envsetup.sh

lunch 翻开挑选菜单,挑选car_x86_64-userdebug也便是 52。

lunch
52

也能够直接输入lunch 52/lunch car_x86_64-userdebug越过列表挑选,不同版别的Android源码项目,方针数字对应的方针并不相同,要注意挑选。

第 3 步,履行编译

make 指令是aosp的编译指令,支撑并发编译。能够运用-j指定并发编译的线程数。电脑的CPU中心数越多,能够设定的线程数就越大,编译速度也就越快,一般能够设为CPU中心数*4。假如不指定,构建体系会主动挑选当时操作体系最适合的并行线程数。

make

在调用 make 指令时,假如没有指定任何方针,则将运用默许的名称为“droid”方针,该方针会编译出完好的 Android 体系镜像。

第 5 步,发动模拟器

编译的时长取决于电脑的功能,首次编译约需求耗时约2-5个小时,操控台提示 build completed successfully则表明编译成功了。然后履行emulator就能够发动模拟器了。

emulator

等候开机动画播放结束,看到Launcher界面,就表明编译成功了。假如编译后呈现模拟器黑屏无法发动,能够再履行lunch sdk_car_x86_64-userdebug,然后再make一次。

编译产出

  • 目录结构

一切的编译产品都将坐落/out目录下,该目录下首要有以下几个子目录:

途径 描绘
/out/host/ 该目录下包括了针对主机的 Android 开发东西的产品。即 SDK 中的各种东西,例如:emulator,adb,aapt 等
/out/target/common/ 该目录下包括了针对设备的一同的编译产品,首要是 Java 运用代码和 Java 库
/out/target/product/<product_name>/ 包括了针对特定设备的编译成果以及平台相关的 C/C++ 库和二进制文件。其间,<product_name>是具体方针设备的名称
/out/dist/ 包括了为多种分发而预备的包,通过“make disttarget”将文件拷贝到该目录,默许的编译方针不会发生该目录
  • 镜像文件

编译发生的镜像文件,它们都坐落/out/target/product/<product_name>/目录下,以下是Android常见镜像文件的解说。

镜像 描绘
cache.img 缓冲区,将被挂到/cache节点
vendor.img OEM 厂商自定义和扩展的程序运转包。将被挂载到/vendor节点
ramdisk.img 一个小型文件体系。在发动时将被 Linux 内核挂载为只读分区,它包括了 /init 文件和一些装备文件。它用来挂载其他体系镜像并发动 init 进程
system.img Android程序运转包,包括了 Android OS 的体系文件,framework,可履行文件以及预置的运用程序,将被挂载到/system节点。
userdata.img 各个程序的存储区,包括了运用程序相关的数据以及和用户相关的数据。将被挂载为 /data节点

以上介绍了编译 Android 镜像的进程,AOSP中还有许多实用的编译指令,咱们接下来再一一介绍。


常用编译指令

在上面咱们编译android镜像时有说到,履行lunch指令之前,当时窗口的shell环境有必要现已履行过source build/envsetup.sh,这段指令便是把envsetup.sh里的指令载到当时的bash中,能够直接调用里边的指令。

env便是环境的意思,setup能够了解为设置,这个文件加载能够了解为编译预备

比如说里边有launch指令,有make指令等等,假如你没有source的话,这些指令就无法运用。

下面咱们介绍一些常用的指令。

lunch 指令

运用lunch指令挑选要构建的方针。一切构建方针都选用 BUILD-BUILDTYPE 办法,其间 BUILD 是表明特定功能组合的代号。BUILDTYPE 是以下类型之一:

构建类型 运用情况
user 权限受限;适用于生产环境
userdebug 与“user”相似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng 具有额定调试东西的开发装备

编译指令

编译指令首要以make 和 make 指令的变体为主,其间最常用的是mm,他的作用是,编译当时目录中的一切模块及其依靠项。以及mmm,编译指定目录下的一切模块及其依靠项。

指令 描绘
m [module name] 在源码树根目录履行编译行为,相当于make指令的简写。在调用 make 指令时,假如没有指定任何方针,则将运用默许的“droid”方针,该方针会编译出完好的 Android 体系镜像
mm 编译当时目录中的一切模块及其依靠项
mma 编译当时目录中的一切模块及其依靠项,当该目录新增或许删去文件能够运用该指令编译
mmm [module path] 编译指定目录[module path]下一切模块及其依靠项
mmma [module path] 编译指定指定目录[module path]下一切模块及其依靠项,当该目录新增或许删去文件能够运用该指令编译

用于编译各种模块的指令,这些指令都能够在最终跟上 -jn来指定编译时的并发线程数目。

指令 描绘
m snod 从构建体系中快速编译出system.img
m vnod 从构建体系中快速编译出vendor.img
m pnod 从构建体系中快速编译出product.img
m senod 从构建体系中快速编译出system_ext.img
m onod 从构建体系中快速编译出odm.img
这些指令能够协助咱们快速编译出需求的镜像文件,而不需求大局整编。

清除指令

用清理的指令,最常用的是installclean它会把编译出的二进制文件都清理掉,make clean则是清理整个out目录。

指令 描绘
m clobber 清除一切编译缓存,相当于rm -rf out/
m clean 清除编译缓存,out/target/product/[product_name]
m installclean 清除一切二进制文件

跳转指令

进行快速定位的指令。

指令 描绘
croot 定位到根目录
godir [file name] 定位到包括指定文件的目录下,file name 选用含糊匹配,假如有多个目录包括指定的filename,则需求手动挑选

查找指令

指令 描绘
jgrep 在一切的Java文件上履行grep指令
cgrep 在一切的C/C++文件上履行grep指令
resgrep 在一切的res/*.xml文件上履行grep指令
ggrep 在一切的Gradle文件上履行grep指令
mangrep 在一切的androidmanifest.xml中履行grep指令
mgrep 在一切的Markfiles和*.bp中履行grep指令
sepgrep 在一切的sepolicy中履行grep指令
sgrep 在一切的文件中履行grep指令

例如,我想查找AOSP中有多少资源文件运用了android:orientation这个属性,就能够运用这种办法resgrep android:orientation。这个指令的变体首要便是限制查找的规模。

其它指令

指令 描绘
printconfig 显现当时编译环境的装备信息
allmod 显现AOSP一切的module
pathmod [module name] 显现 module name 所在的途径
refreshmod 改写 module 列表
gomod [module name] 定位到指定的module name 目录下

以上便是一些常用指令的介绍,下面咱们带入实践场景,演示根据源码开发环境的车载运用项目,可能会遇到哪些编译景象。

常见编译情景

编译多个方针产品

有时分咱们需求运用一个源码环境编译出多个方针产品,并一同保持多个方针产品的编译成果,这个时分就能够运用lunch指令,在设置新的编译方针前指定另一个输出目录(默许输出目录是/out)。

export OUT_DIR=new_out

编译 android.ipr

编译Android.ipr能够让咱们在Android studio中阅览Android源码,能够更高效的进行源码间的查找与跳转。

首先需求完好编译一次源码,再编译idegen模块

mmm development/tools/idegen/

编译成功后,在根目录履行idegen.sh脚本

development/tools/idegen/idegen.sh

履行成功后,在AOSP根目录下能够找到 android.imlandroid.ipr 两个文件,咱们翻开android.iml这个文件发现里边的装备项十分多,首要的标签有两类:

标签 描绘
sourceFolder 需求包括的文件目录。需求包括的文件目录越多,导入Android Studio花费的时刻就越久
excludeFolder 灵敏排除不需求的源码,能够加快导入速度

咱们能够运用下面的装备文件代替原始的装备文件,加快导入速度。该装备文件要求Android Studio只引进package模块的源码。假如有需求也能够引进frameworks模块的源码。

<?xml version="1.0" encoding="UTF-8"?>
<module version="4" relativePaths="true" type="JAVA_MODULE">
  <component name="FacetManager">
    <facet type="android" name="Android">
      <configuration />
    </facet>
  </component>
  <component name="ModuleRootManager" />
    <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/packages" />
      <excludeFolder url="file://$MODULE_DIR$/frameworks" />
      <excludeFolder url="file://$MODULE_DIR$/.repo" />
      <excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
      <excludeFolder url="file://$MODULE_DIR$/external/chromium" />
      <excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
      <excludeFolder url="file://$MODULE_DIR$/external/webkit" />
      <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
      <excludeFolder url="file://$MODULE_DIR$/out/eclipse" />
      <excludeFolder url="file://$MODULE_DIR$/out/host" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/common/docs" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/product" />
      <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
      <excludeFolder url="file://$MODULE_DIR$/external/emma" />
      <excludeFolder url="file://$MODULE_DIR$/external/jdiff" />
    </content>
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="inheritedJdk" />
  </component>
</module>

最终,翻开Android Studio,点击File –> Open,选中生成的 android.ipr 文件,等候一段时刻后,就能够在Android studio中阅览Android源码了。

编译运用

运用 make 加 module name,能够直接编译出Android对应 module 的运用。

假如是编译咱们自己的运用,则应该在运用的源码根目录(有 Android.bp 和 Android.mk的目录)运用mm编译,也能够运用mmm加源码途径进行编译。

编译后输出途径会显现在操控台上,咱们进入相应的途径就能够找到咱们的编译出的二进制文件。

编译Framework

编译framework源码有多种办法。运用make framework即可编译 framework 的源码。可是要注意 make 指令后跟的是 module name 而不是模块的途径,所以这儿不能写成 frameworks。

或许运用mmm frameworks/base以及在/framework/base目录下履行mm都是能够的。

编译 Android12和今后版别,编译有所调整,运用 make framework-minus-apex

输出目录:out\target\product\generic\system\framework\framework.jar

上面的jar里边都是dex,假如想看代码,能够去下面目录下看,就好像平时看第三方jar相同,导入 Android Studio即可。

\out\soong.intermediates\frameworks\base\framework\android_common\combined\framework.jar

其它的一些指令,能够参阅这张表格。

模块 make 指令 mmm 指令
init make init mmm system/core/init
zygote make app_process mmm frameworks/base/cmds/app_process
system_server make services mmm frameworks/base/services
java framework make framework mmm frameworks/base
res framework make framework-res mmm frameworks/base/core/res
jni framework make libandroid_runtime mmm frameworks/base/core/jni
binder make libbinder mmm frameworks/native/libs/binder

咱们也能够运用 allmod 指令检查一切的 module,再运用 make 指令编译咱们需求的模块。

编译Car API

编译Car API便是编译和 CarService 通讯的接口库,有三种不同指令:

第一种,make android.car

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car/android_common/javac/目录下。

这种办法编译出的CarLib库,包括Car API中定义的一切办法以及完成细节。导入到android studio中翻开后,如下所示:

【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译

第二种,make android.car-system-stubs

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car-system-stubs/android_common/javac/目录下。

这种办法编译出的CarLib库,包括CarAPI中定义的一切办法,可是不包括完成细节,一些与完成细节有关的变量也会被躲藏

实践项目中这种形式较为常用。导入到android studio中翻开后,如下所示:

【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译

第三种,make android.car-stubs

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car-stubs/android_common/javac/目录下。

这种办法编译出的CarLib库,仅包括没有被@SystemApi润饰的办法,并且办法相同不包括完成细节,是最严格的编译形式。

上面这三种指令能够放在一同履行,一同编译。

make android.car android.car-system-stubs android.car-stubs

总结

本期视频咱们整理了车载Android运用开发者应该了解的Android源码的下载与常用编译办法,本视频的文字内容发布在我的个人微信公众号-『车载 Android』和我的个人博客中,视频中运用的 PPT 文件的发布在我的 github中,在视频的简介中你能够找到相应的地址。

上期视频发布后,有观众提问有没有某些运用的示例能够参阅,这儿就能够回答一下,运用的示例咱们参阅AOSP中的原生运用是怎么完成的即可。既能够挑选下载 AOSP 源码,也能够运用咱们在第二节中说到的,在线AOSP源码阅览网站。假如是商用的源码,这触及到了法律问题,博主无法供给。

好,以上便是本视频的全部内容了,感谢您的观看,咱们下期视频再见。