android8.0编译系统简述(代码片段)

Welljia Welljia     2022-12-05     209

关键词:

Android 8.0编译系统简述

概述

Android 7.0之前,android编译主要依赖makefile,随着android工程越来越大,makefile编译花费时间也越来越多,所以7.0开始逐步引入了kati soong(可选,用的话需要在执行编译时将USE_SOONG=true开启),soong会将Android.bp(用于替换Android.mk文件)文件转化为ninja文件,然后由ninja去对系统进行管理。到了8.0,android 默认启用Soong,不需要配置USE_SOONG了。

kati

kati是一个基于Makefile来生成ninja.build的小项目。 主要用于把Makefiel转成成ninja file,自身没有编译能力,转换后使用Ninja编译。

在编译过程中,kati负责把既有的Makefile、Android.mk文件,转换成Ninja文件。 在Android 7.0中,它独挑大梁。 在Android 8.0以后,它与Soong一起,成为Ninja文件的两大来源。 Kati更像是Google过渡使用的一个工具,等所有Android.mk都被替换成Android.bp之后,相信Soong工具会被打开使用来替换Kati.

在单独使用时,它对普通的小项目还能勉强生效。 面对复杂的、多嵌套的Makefile时,它往往无法支持,会出现各种各样的问题。 当然,也可以理解为,它只为Android而设计。

总之,不推荐在Android以外的任何项目中使用kati。

Soong

soong是由Go语言写的一个项目,从Android 7.0开始,在prebuilts/go/目录下新增了Go语言所需的运行环境,Soong在编译时使用,解析Android.bp,将之转化为Ninja文件,完成Android的选择编译,解析配置工作等。故Soong相当于Makefile编译系统的核心,即build/make/core下面的内容。

另外Soong还会编译产生一个androidmk命令,可以用来手动将Android.mk转换成Android.bp文件。不过这只对无选择、循环等复杂流程控制的Android.mk生效。

Android.bp

Android.bp是用来替换Android.mk的,用类似JSON的声明来描述需要构建的模块,使用Blueprint框架来解析,最终转换成ninja,与Android.mk相比设计非常简洁,没有分支、循环等流程控制,android的选择编译、解析配置等需求,就交给了Soong去完成。

Blueprint

Blueprint也是由Go语言写的,是Soong的一部分,负责解析Android.bp,主要是解析文件的形式,内容还是交由soong去解释。

在Android编译最开始的准备阶段,会执行build/soong/soong.bash进行环境准备。 其中会先编译、安装Blueprint到out目录下。 也就是说,在编译Android项目时,Android.bp相关工具链会自动编译,无需费神。

Soong是与Android强关联的一个项目,而Blueprint则相对比较独立,可以单独编译、使用。

Ninja

Ninja是一个致力于速度的小型编译系统(类似于Make),如果把其他编译系统比做高级语言的话,Ninja就是汇编语言。通常使用Kati或soong把makefile转换成Ninja files,然后用Ninja编译。

主要有两个特点:

  1. 可以通过其他高级的编译系统生成其输入文件;
  2. 它的设计就是为了更快的编译;

ninja核心是由C/C++编写的,同时有一部分辅助功能由python和shell实现。由于其开源性,所以可以利用ninja的开源代码进行各种个性化的编译定制。

各工具之间的关系

Android.mk文件、Android.bp、kati、Soong、Blueprint、Ninja之间的关系如下:

Android.bp --> Blueprint --> Soong --> Ninja
Makefile or Android.mk --> kati --> Ninja
(Android.mk --> Soong --> Blueprint --> Android.bp)

Blueprint是生成、解析Android.bp的工具,是Soong的一部分。 Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义。

Android.mk可以通过Soong提供的androidmk转换成Android.bp,但仅限简单配置。 目前Oreo的编译流程中,仍然是使用kati来做的转换。

现存的Android.mk文件、既有的Android.bp,都会分别被转换成Ninja。 从Android.mk与其它Makefile,会生成out/build-<product_name>.ninja文件。 而从Android.bp,则会生成out/soong/build.ninja。 此外,还会生成一个较小的out/combined-<product_name>.ninja文件,负责把二者组合起来,作为执行入口。

最终,Ninja文件才是真正直接控制源码编译的工具。

android8.0以上打开系统文件管理器(代码片段)

代码如下://mPath实际路径是/storage/emulated/0/MyScreenRecorder/,这里只写后面那个就行valmPath="/MyScreenRecorder/"valuri=Uri.parse("content://com.android.externalstorage.documents/docume 查看详情

android8.0以上打开系统文件管理器(代码片段)

代码如下://mPath实际路径是/storage/emulated/0/MyScreenRecorder/,这里只写后面那个就行valmPath="/MyScreenRecorder/"valuri=Uri.parse("content://com.android.externalstorage.documents/document/primary:$mPath")vali=Intent(Intent.ACTION_OPEN_DOCU... 查看详情

android8.0移除系统apk(代码片段)

vendor\\rockchip\\common\\apps\\apps.mk++#ifneq($(filterrk312xrk3126c,$(TARGET_BOARD_PLATFORM)),)++#PRODUCT_PACKAGES+=\\++#RkVideoPlayer++#else++#ifeq($(strip$(PRODUCT_BUILD_MODULE)),px5car)++#PRODUCT_PACKAGES+=\\++# Rk3grVideoP... 查看详情

android8.0删除lightningapk(代码片段)

vendor/rockchip/common/apps/apps.mk-PRODUCT_PACKAGES+=\\-Lightningvendor/rockchip/common/apps/Lightning/Android.mk清空 查看详情

android8.0修改默认时区(代码片段)

build\\make\\tools\\buildinfo.shecho"persist.sys.timezone=Asia/Shanghai"build\\tools\\buildinfo.shecho"persist.sys.timezone=Asia/Shanghai" 查看详情

android8.0删除mtp模式(代码片段)

device/rockchip/common/device.mk--persist.sys.usb.config=mtp,adb\\++persist.sys.usb.config=adb\\ 查看详情

android8.0修改默认语言(代码片段)

build\\make\\tools\\buildinfo.sh--echo"ro.product.locale=$PRODUCT_DEFAULT_LOCALE"++echo"ro.product.locale=zh-CN" 查看详情

android8.0及以上基于系统mediarecorder实现录屏最基础步骤(代码片段)

1.申请到必须的相关权限xml配置,另外需要动态获取权限才行<uses-permissionandroid:name="android.permission.FOREGROUND_SERVICE"/><uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><uses-permissionandroid:name="android.per... 查看详情

android8.0及以上基于系统mediarecorder实现录屏最基础步骤(代码片段)

1.申请到必须的相关权限xml配置,另外需要动态获取权限才行<uses-permissionandroid:name="android.permission.FOREGROUND_SERVICE"/><uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><uses-permissionandroid:name="android.per... 查看详情

android8.0修改默认媒体音量(代码片段)

build/make/tools/buildinfo.sh++echo"ro.config.media_vol_default=10"开发者涨薪指南48位大咖的思考法则、工作方式、逻辑体系 查看详情

android8.0换模具(代码片段)

kernel\\arch\\arm64\\boot\\dts\\rockchip\\rk3326-evb-ai-va-v11.dts sensor@4c compatible="gs_mc3230"; reg=<0x4c>; type=<2>; irq_enable=<0>; poll_delay 查看详情

android8.0修改recovery方向(代码片段)

device\\rockchip\\common\\BoardConfig.mk--TARGET_RECOVERY_DEFAULT_ROTATION?=ROTATION_LEFT++TARGET_RECOVERY_DEFAULT_ROTATION?=ROTATION_RIGHTdevice\\rockchip\\rk3326\\device-common.mk--r 查看详情

避免在android8.0的电视频道中创建重复频道(代码片段)

我正在使用Android8.0及更高版本的电视频道,我可以通过下面的代码在其电视频道上显示我的App频道privatevoidcreateChannel(Contextc)//NOTE:THESEINFOMUSTMATCHWITHDATAINMANIFEST.XMLComponentNamecn=newComponentName(c,MainActivity.class.getName());S 查看详情

android8.0修改厂商品牌型号设备名(代码片段)

build\\make\\toolsecho"ro.product.model=BBB"echo"ro.product.brand=aa"echo"ro.product.name=BBB"echo"ro.product.device=BBB" 查看详情

android8.0内置谷歌浏览器(代码片段)

vendor/rockchip/common/apps/Chrome/Android.mk################################################################################ChromeLOCAL_PATH:=$(callmy-dir)my_archs:=armarm64x86x86_64my_src_ar 查看详情

android8.0编译过程初步分析

Android8.0编译过程分析概述要想知道编译的过程,其实看编译的脚本,以及编译时产生的log是比较快的方法。编译相关的核心文件位于build/core下,而生成的文件在out/soong下,里面有编译过程中产生的编译相关文件... 查看详情

如何在android8.0以下高效地复用图片?(代码片段)

好文推荐:作者:爱奇艺技术我们都知道日常开发的AndroidApp是运行在Java虚拟机的环境中,Java虚拟机会自动进行垃圾回收(garbagecollection,以下简称gc),但gc发生时有可能会造成一定程度的卡顿,... 查看详情

android8.0删除cast功能(代码片段)

frameworks\\base\\packages\\SystemUI\\res\\values\\config.xml删除:状态栏里的Cast图标<!--ThedefaulttilestodisplayinQuickSettings--><stringname="quick_settings_tiles_default"translatable="false">--wifi,dnd,flashlight,rotation,battery,cell,airplane,ca... 查看详情