AOSP构建、编译基础理解

news/2024/11/30 8:59:51/

AOSP构建、编译基础理解

构建系统

参考这篇文章,写的比较好,我就不狗尾续貂了!
android build system编译系统概述

source build/envsetup.sh之后的事情

source也就是执行build/envsetup.sh里面的脚本,改脚本定义许多命令,比如lunch命令选择编译某个产品,同时它内部调用include或者inherit-product包含其他的mk文件,其他mk文件又包含了另外的mk,这样层层包含就依次展开了;

$(call inherit-product, device/google/common/common.mk)
或
include $(BUILD_SYSTEM)/version_defaults.mk

当执行了envsetup.sh后,整个系统的mk文件包含大致如下:
在这里插入图片描述
如果我们遇到不清楚某个mk是如何被包含到build构建时,就可以查看这个图,然后grep他的目录看看是如何被包含进去的

如何创建一个新的编译产品product?

一般是在device/company/产品ming/下,创建AndroidProducts.mk,在里面配置两个属性即可:

PRODUCT_MAKEFILES := \$(LOCAL_DIR)/makefiles.mk
COMMON_LUNCH_CHOICES := \product_name

COMMON_LUNCH_CHOICES :表示lunch时选择的产品名
PRODUCT_MAKEFILES:是构建此product,需要的mk配置文件
当然,不仅仅如此,要做的工作更多,需要你去编写makefiles是如何去编译的;

如何为系统添加property属性?

用如下命令即可:

PRODUCT_PROPERTY_OVERRIDES += \com.jack.perproty = 12345

但是在哪个文件添加呢?如上如何创建一个新的编译产品product?章节,在makefiles.mk里面添加即可,或者在其他mk,只要被makefile.mk包含的mk文件添加即可生效

文件拷贝PRODUCT_COPY_FILES

PRODUCT_COPY_FILES += device/qcom/media/demo.xml:system/etc/demo.xml

在哪个文件写入这个命令呢?同上个命令一样,被AndroidProducts.mk中编译配置mk包含的即可!

如何把apk编译进入系统?

这个很简单!在被AndroidProducts.mk包含的mk中假如:

PRODUCT_PACKAGES += \apps \

其中apps表示你要编译进入系统的名字;
当然,这里还没完,你还得写编译apk的mk文件,这里的apk可以分为编译apk文件和编译apk的源代码,

先说说编译apk,Android.mk和apk在同级目录,如下文件:

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
#JAVA_LIBRAYIES jar包 SHARED_LIBRAYIES so库 EXECUTABLES二进制可执行文件
LOCAL_MODULE_CLASS := APPS
#可以为user、eng、tests、optional,optional代表在任何版本下都编译
LOCAL_MODULE_TAGS := optional
#编译模块的名称
LOCAL_MODULE := CarSkin
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#可以为testkey、platform、shared、media、PRESIGNED(使用原签名),platform代表为系统应用
LOCAL_CERTIFICATE := PRESIGNED
#不设置或者设置为false,安装位置为system/app,如果设置为true,则安装位置为system/priv-app?
LOCAL_PRIVILEGED_MODULE := false
#module的后缀,可不设置
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# 关闭预编译,不会生成OAT文件
LOCAL_DEX_PREOPT := true
# 可忽略,设置后将会安装到product分区
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)

如果App要安装到data目录,则需要将上面LOCAL_PRIVILEGED_MODULE行替换为:

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

某些特殊的apk可能需要依赖第三方lib,则可以通过PRODUCT_COPY_FILES将lib拷贝到对应的系统目录下,如system/priv-app/apk名字/lib下面

编译apk源代码

首先,需要将java源代码,依赖的第三方jar包、so拷贝到同一个目录,然后编写如下的Android.mk,

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
#递归调用java文件
LOCAL_SRC_FILES := $(call all-subdir-java-files)  
LOCAL_PACKAGE_NAME := Test
#第三方jar依赖
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := AndroidUtil:libs/AndroidUtil.jar
include $(BUILD_PACKAGE)

第三方引用可以参考此链接


http://www.ppmy.cn/news/73991.html

相关文章

python笔记:命名规则

在我编写python代码的时候,总是随心命名(有时候变量用驼峰法,有时候变量用下划线),个人感觉特别混乱,统一一下命名规则会比较好。所以记录一下自己的笔记。 硬性规则: 1.变量不以数字开头 2.大…

MyBatis之缓存机制

缓存即为存在内存中的临时数据.将用户经常查询的数据存放在缓存(内存)中,用户去查询数据就不用去每次去数据库中查询,而是去缓存中查询,从而提高了查询的效率,解决了高并发系统的性能问题.MyBatis提供了两种缓存机制:一级缓存(本地)和二级缓存…

Dropwizard 开发环境搭建

Dropwizard是一个Java框架,其目标是提供高性能、高可靠的Web 应用程序的实现。 一、使用Maven原型创建项目 1、新建项目->选择Maven Archetype 填写好项目名称、路径、选择JDK版本,这里使用JDK11及以上的版本,如下图所示: 2…

【回眸】JupiterTC397的PWM开发

前言 正文部分 电路分频是社么 电路分频怎么分? PWM 里的结构体开发思路 使用CAN方法发送PWM参数的开发思路 更新PWM输出开发思路 给PWM输出一个初值 设置PWM输出通道的电平状态开发思路 结语 前言 笔者在之前的三周都在准备毕业论文和相关资料的定稿&am…

JavaScript:对象

对象 ① Object.create(原型指向) 用于创建对象,和 new Object() 的区别在于:该方法创建出来的对象的原型取决于传递的参数,而 new Object() 创建出来的对象永远指向 Object的 prototype var obj1 Object.create(null); // 创建一个纯净对…

记一次支付宝支付的功能开发

背景: 公司需要增加一项支付宝PC端的收款功能 解决: 使用的支付宝官方文档中的电脑网站支付->统一收单下单并支付,当然,我们的支付宝账号需要开通该产品。官方API连接:https://opendocs.alipay.com/open/028r8t?…

【C++】基础知识--程序的结构(1)

C简介: C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州…

基于html+css的图展示85

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…