【Framework】🤡 速通 Android AOSP基础(中)

简介: 本文并非笔者亲身实践,是借鉴了参考文献处几位大佬的文章总结得出。asop源码的下载费时,笔者没有编译扫写源码的需求,只是解BUG或了解底层机制时看看源码,SDK自带的android.jar和一些在线源码站点已经够用。环境搭建流程基本是一致的,遇到问题善用搜索引擎~

0x5、编译


同样,先是一些名词的解释:


  • Makefile →  Android平台编译系统,用Makefile写出来的一个独立项目,定义了编译规则,实现自动化编译,将分散在数百个Git库中的代码整合起来,统一编译,而且把产物分门别类地输出到一个目录,打包成手机ROM,还可以生成应用开发时使用的SDK、NDK等。


  • Android.mk → 定义一个模块的必要参数,使模块随着平台编译,简单点说就是告诉系统以什么规则编译源代码,并生成对应目标文件;


  • kati →  Google专门为Android研发的小工具,基于Golang和C++,作用是:将Android中的Makefile转换为Ninja文件


  • Ninja → 致力于速度的小型编译系统,把Makefile看做高级语言,那它就是汇编,文件后缀为.ninja;


  • Android.bp → 替换Android.mk的配置文件;


  • Blueprint → 解析Android.bp文件翻译成Ninja语法文件;


  • Soong → Makefile编译系统的替代品,负责解析Android.bp文件,并将之转换为Ninja文件;


关系描述:


  • Android工程越来越大,Makefile编译耗时越来越长,Android 7.0引入速度和并行效率更佳的Ninja来编译系统;


  • Soong 借助 Blueprint定义的Android.bp语法,完成Android.bp的解析,最终转换成Ninja文件;


  • Makefile文件(.make或.mk)通过kati转换为Ninja文件(.ninja);


  • Makefile是设计来给开发编写的,而Ninja则是设计给其他程序生成的,可类比做高级语言和汇编语言;


① 编译环境准备


# ① 安装jdk 8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
# Tips:使用ubuntu 14+,还需要安装下述依赖包
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip


② 源码整编


# ① 初始化环境
source build/envsetup.sh
# ② 删除out与中间文件,clean会删除本次设置生成的、clobber会删除所有配置生成的
make clobber
# ③ 选择编译目标,下述命令会进入菜单,选择相应的版本,输入序号回车
# 编译目标都采用 BUILD-BUILDTYPE 形式,BUILD 表示特定功能代号,BUILDTYPE是以下类型之一:
# user → 权限受限、适用于生产环境,没root权限,不能debug,adb默认处于停用状态;
# userdebug → 与user类似,但具备root权限和debug权限,一般用于调试真机。
# eng → 具有额外调试工具的开发配置,拥有最大的权限(root等),一般用于模拟器。
# 编译目标示例 → Pixel 3a XL的编译目标 → aosp_bonito-userdebug
lunch
# 也可以直接指定编译目标,如:lunch aosp_bonito-eng
# 还可以直接用序号,如:lunch 8,但不建议,因为不同的系统版本序号对应可能有偏差~
# ③ 开始编译,后面的-jN参数用来设置编译的并行任务数,CPU核心数为6,N值最好选6-12间
# 根据自己CPU核心数动态修改哈,见过有32的~
make -j6
# 也可以把输出结果打印到log文件中:make -j6 2>&1 | tee build_20211206_1403.log
# 编译成功后会生成out目录,比如这里的:~/aosp/out/target/product/bonito
# Tips:有需要还可以键入:make sdk,编译SDK生成修改后的android.jar


③ 源码单编


整编一般会耗费几小时,有时可能只是修改了其中某个应用模块,只需单独编译这个模块,以设置模块为例:


source build/envsetup.sh
lunch aosp_bonito-eng
# 进入模块目录
cd package/apps/Setting
# 编译单独模块的可选指令如下:
# mm → 编译当前目录下的模块,不编译依赖模块
# mmm → 编译指定目录下的模块,不编译依赖模块
# mma → 编译当前目录下的模块及其依赖项
# mmmma → 编译指定路径下所有模块,切包含依赖
mm
# 编译成功会提示生成文件的存放路径,除了生成Setting.odex外,还会在
# priv-app/Settings目录下生成Settings.apk,可直接adb push或adb install
# 安装APK验证效果,也可以使用make snod命令重新打包生成system.img,运行模拟器查看


0x6、刷机


① 亲儿子Pixel或Nexus


恭喜,可以直接刷,先到 Driver Binaries for Nexus and Pixel Devices 根据自己的机型和Android版本号,下载对应的驱动。接着解压执行:


./extract-qcom-sargo.sh
./extract-google_devices-sargo.sh


进入bootloader,执行烧写命令(-w代表清空数据)


adb reboot bootloader
fastboot flashall -w


然后等待烧写完成即可~


② Android虚拟机


得自己编译AVD镜像,lunch那里选择 sdk_phone_x86_64 编译目标,除常规编译外,还得附加 sdksdk_repo 包。


网络异常,图片无法展示
|


上述方法不生效的话,可以把镜像Copy到 SDK/system-images/android-xx/ 的其中一个目录中。

相关文章
|
10月前
|
编解码 Ubuntu Java
Android学习framework及搭建环境
Android学习framework及搭建环境
118 0
“framework必会”系列:Android Input系统(一)事件读取机制
曾经在开发的很长一段时间内,笔者对点击事件的认知只存在于自定义View中的`onTouchEvent`等方法的处理。 后来慢慢的接触到`Android的事件分发机制`,但也只是在**Activity->ViewGroup->View**层面的分发逻辑
|
2月前
|
安全 Linux Android开发
Android最强保活黑科技的最强技术实现,2024年最新阿里资深Android开发带你搞懂Framework
Android最强保活黑科技的最强技术实现,2024年最新阿里资深Android开发带你搞懂Framework
Android最强保活黑科技的最强技术实现,2024年最新阿里资深Android开发带你搞懂Framework
|
2月前
|
存储 编解码 API
Android Media Framework(一)OpenMAX 框架简介
OpenMAX IL是Khronos Group为嵌入式和移动设备设计的低层级接口,用于统一调用音频、视频和图像编解码器,确保跨平台兼容性。它包括Core API(管理组件加载和方法调用)和Component API(组件实现,如源、接收器、编解码器等)。组件通过端口进行数据交互,客户端使用Core API加载和控制组件。Android引入OMX IL以支持不同芯片上的编解码器。组件状态包括Loaded、Idle、Executing和Invalid。组件架构涉及参数配置、命令处理和缓冲区管理,数据交换通过回调函数完成,端口持有预分配或组件自分配的缓冲区。
|
2月前
|
API Android开发
Android Framework增加API 报错 Missing nullability on parameter
Android Framework增加API 报错 Missing nullability on parameter
70 1
|
Ubuntu Java 机器人
Android AOSP入门之环境搭建
最近在做移动机器人项目,要给机器人做一个头台,搭载Android操作系统,要为系统做一些定制。在 好多年前,还是Android 5.0以下系统的时候做游戏画面采集做个AOSP的编译,那个时候电脑配置查,网络也差,搭建一次环境特别费劲。编译完还没有现成的设备可以给刷,一直也没有真正的framework和内核、驱动层的开发经验,现在有了实际的需求了,硬着头皮开搞。
601 0
|
Java Android开发 数据安全/隐私保护
android10.0(Q) AOSP 增加应用锁功能
android10.0(Q) AOSP 增加应用锁功能
160 0
|
API Android开发
Android11.0(R) framework 新增类 lint 编码检查问题
Android11.0(R) framework 新增类 lint 编码检查问题
1074 0
|
XML 存储 设计模式
Android Framework知识整理:WindowManager体系(上)
本篇是Android framework的第一讲《WindowManager体系-上》,重在讲解Window在被添加到WindowManagerService前的流程。