Android预置应用基础

目录

  • 一、应用预置
  • 二、应用预置分区
  • 三、编译规则
    • 3.1 Android.mk
    • 3.2 Android.bp


一、应用预置

预置指智能终端设备出厂前,将文件预先安装到系统中。预置对象包括应用程序、可执行文件、so库(.so 文件)、jar 包等。

预置方式有以下两种:

  • 预编译方式
    -如果文件有明确的预编译规则,且预编译不破坏当前程序完整性,则可使用预编译方式。
    -如果文件有其他模块编译依赖,或需要系统签名,则需要定义一个预编译模块,例如一些 so库、apk 文件、jar 包等。
    预置应用时,可使用变量 LOCAL_CERTIFICATE 指定签名类型Android.mk。
  • 复制方式
    -将文件复制到目标目录,参与打包即可实现预置。
    -使用 shell 命令“cp”进行复制。
    -如果文件只需预置到指定目录,将该文件添加到 PRODUCT_COPY_FILES 变量中即可。例如一些 bin 文件、配置文件

二、应用预置分区

应用预置目录常见的应用预置分区包括 system、system_ext、product、vendor、odm、data 等。不同的分区下安装路径所对应的权限和域不相同,如 system,system_ext 属于 system 域,data 主要用于在线安装第三方的应用,除 data 外其余分区都属于 vendor 域。

定义宏 PARTITION 为 system_ext、product、vendor、odm 中的任意一个分区。应用预置目录说明如下图所示
在这里插入图片描述在这里插入图片描述


三、编译规则

编译规则有 Android.mk 和 Android.bp 两种,可根据需求选择编译规则。Android.mk 在 Android 13.0 之后的安卓版本中会被淘汰,建议使用 Android.bp作为编译规则

3.1 Android.mk

Android.mk 中,每个编译模块都以 include $(CLEAR_VARS)开始,以 include $(BUILD_xxx)结束,示例如下。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := myapp

LOCAL_SRC_FILES := app/myapp.apk

LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/app

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_TAGS := optional

LOCAL_CERTIFICATE := platfrom

LOCAL_SHARED_LIBRARIES := liba libc

LOCAL_MULTILIB := 64

include $(BUILD_PREBUILT)

LOCAL_PATH
模块编译路径,需要与 Android.mk 脚本在同一目录。每一个 Android.mk 文件必须先定义LOCAL_PATH。my-dir 是系统提供的宏函数,$(call my-dir)将返回当前目录(Android.mk 文件本身所在的目录)的路径。

Build 系统中还定义了一些便捷的函数以便在 Android.mk 中使用,例如:

−$(call all-java-files-under,xxx):获取指定目录下的所有 Java 文件。

−$(call all-c-files-under,xxx):获取指定目录下的所有 C 文件。

−$(call all-Iaidl-files-under,xxx):获取指定目录下的所有 AIDL 文件。

−$(call all-makefiles-under,xxx):获取指定目录下的所有 make 文件。

**include $(CLEAR_VARS)**CLEAR_VARS 是系统提供的宏变量,用于清理除 LOCAL_PATH 以外的所有 LOCAL_XXX 变量。整个编译上下文中,所有的变量都是全局变量,CLEAR_VARS 可以保证这些变量只在局部范围内起作用。LOCAL_PATH 要求在每个模块中都要设置,无需清空。

LOCAL_MODULE
模块名称,是模块在编译中的唯一标识,该值必须唯一且不包含空格。模块间的依赖关系通过模块名称进行引用。编译系统会根据编译类型自动添加适当的后缀,例如要编译成一个 apk,则生成myapp.apk。

LOCAL_SRC_FILES
模块生成目标文件所需要的所有 C 和/或 C++源文件列表,多个文件用空格隔开。

LOCAL_MODULE_PATH
指定模块编译产物的输出路径,都是 out 目录下的子目录。如果 Android.mk 中没有指定该值,系统会根据“LOCAL_MODULE_CLASS”的值来生成。“LOCAL_MODULE_PATH”赋值主要应用在“BUILD_PREBUILT”模块的编译上,其他情况尽量采用默认值。常用值包括:

−TARGET_OUT:/system 目录
−TARGET_OUT_ETC:/system/etc 目录
−TARGET_OUT_VENDOR:/vendor 目录
−TARGET_OUT_DATA:/data 目录

以上目录均在 build/core/envsetup.mk 中有定义。

LOCAL_MODULE_CLASS
模块编译类型,用于定制 LOCAL_MODULE_PATH 的路径。当模块 include 不同编译类型选项时,系统会默认指定当前的 LOCAL_MODULE_CLASS 的值。但 include BUILD_PREBUILT 编译选项时,需要明确指定 LOCAL_MODULE_CLASS 的值,帮助系统确定 LOCAL_MODULE_PATH 的值。

如果不指定 LOCAL_MODULE_CLASS,编译产物不会放到系统中,会放在最后的 obj 目录下的对应目录。常用值包括:

−APPS:system/app 目录
−SHARED_LIBRARIES:system/lib 目录
−ETC:system/etc 目录

LOCAL_MODULE_TAGS
模块标签,表明该模块在什么版本下才编译。常用值包括:

−eng:工程师版本,用于开发调试
−user:用户发布版本
−userdebug:用户调试版本
−test:测试版本
−optional:所有版本,默认值

LOCAL_CERTIFICATE
模块签名方式,常用值包括:

−PERSIGNED:源 apk 自带的签名,编译过程不再重新签名。
−testkey:非 user 版本默认签名
−releasekey:user 版本默认签名
−platform:平台的核心应用签名,使用该签名的 apk 需要获取 platform signature,例如 Settings
−shared:使用该签名方式的 apk 需要和 home/contacts 进程共享数据,例如 Launcher
−media:使用该签名方式的 apk 是 media/download 系统中的一环,例如 Gallery

LOCAL_SHARED_LIBRARIES
模块在编译时依赖的动态库。模块的外部依赖一般包括:

−LOCAL_STATIC_LIBRARIES:模块所依赖的静态库
−LOCAL_STATIC_JAVA_LIBRARIES:模块所依赖的 Java 静态库(jar 包等)
−LOCAL_JAVA_LIBRARIES:模块所依赖的 Java 动态(共享)库

LOCAL_MULTILIB
使用 LOCAL_MULTILIB 变量可以配置要编译的 arch 架构。若不指定,系统根据模块类型和其他LOCAL_XXX 变量,决定构建的架构,如 LOCAL_MODULE_TARGET_ARCH。常用值包括:

−both:同时构建 32 位和 64 位架构
−32:仅构建 32 位架构
−64:仅构建 64 位架构
−first:仅构建第一个架构(在 32 位设备中构建 32 位架构,在 64 位设备中构建 64 位架构)

include $(BUILD_PREBUILT)
表示该模块的编译类型,它指向一个 NDK(Native Development Kit,Native 开发工具集)的默认脚本,会收集从上次调用 include $(CLEAR_VARS)后所有定义的 LOCAL_XXX 变量,然后根据它们定义模块的目标、依赖关系、编译命令和编译参数等。常用值包括:

−BUILD_PREBUILT:编译成一个预置程序
−BUILD_PACKAGE:编译成一个 apk 或者资源包文件
−BUILD_JAVA_LIARARY:编译成一个 Java 共享库
−BUILD_STATIC_JAVA_LIARARY:编译成一个 Java 静态库
−BUILD_EXECUTABLE:编译成一个可执行文件
−BUILD_SHARED_LIARARY:编译成一个 native 共享库,前缀为 lib,后缀为.so

3.2 Android.bp

Android.bp 定义一个模块类型,模块中包含的属性示例如下。

android_app_import {

name: "myapp",

src: "app/myapp.apk"

uses_libs: ["liba","libc"],

compile_multilib: "64",

vendor: true,

certificate: "platform",

}

android_app_import

模块编译类型,类似 Android.mk 中的“BUILD_XXX”。

name:模块名称,唯一且必须存在,类似 Android.mk 中的“LOCAL_MODULE”。

src:模块源文件,类似 Android.mk 中的“LOCAL_SRC_FILES”。

uses_libs:模块在编译时依赖的动态库列表,类似 Android.mk 中的“LOCAL_USES_LIBRARIES”。

compile_multilib:使用 compile_multilib 变量控制此模块是为 32 位、64 位还是两者都编译。常用值包括:

−both:同时构建 32 位和 64 位架构

−32:仅构建 32 位架构

−64:仅构建 64 位架构

−first:仅构建第一个架构

vendor:当 vendor 设置为 true 时,安装该模块至/vendor 目录,如果 vendor 分区不存在,则安装到/system/vendor 目录。

certificate:模块签名方式,类似 Android.mk 中的“LOCAL_CERTIFICATE”。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/500451.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

交换机干道链路

干道链路是用于交换机之间或交换机与路由器之间互连的物理链路。干道链路传输的数据帧都必须打上Tag,便于设备识别数据帧所属的VLAN。因此一条干道链路可以承载多个VLAN的数据帧,如图1-1所示。 图1-1 干道链路功能示意图 干道链路可以透传VLAN。换言之&…

2023年后端面试总结

备注:这篇文章是我在2023年年初在自己的网站上写的,最近在迁移技术文章,我感觉这个也是和咱程序员相关,所以今天就决定把它迁移过来。 .......................................................................分割线..........…

代码随想录算法训练营 Day31 贪心算法1

Day31 贪心算法1 理论基础 贪心算法的本质:找到每个阶段的局部最优,从而去推导全局最优 贪心的两个极端:要么觉得特别简单,要么觉得特别难 贪心无套路 不像二叉树、递归,有固定模式 贪心题目的思考方式 做题的时候…

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言,实现一个导航与内容二级联动的效果。 2 标题 二级联动(ArkTS) 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能: 切换左侧导航&#xff…

SpringMVC源码分析(七)--数据绑定工厂

1.数据绑定工厂的使用 数据绑定工厂能够创建数据绑定器,将数据绑定到对象中,比如说当接收到请求时,经过http协议解析后数据刚开始都是字符串,此时我们希望将这些属性进行类型转换,并为对象赋值,示例如下: 1)先创建两个实体类Student和Teacher @Getter @Setter @ToSt…

学习鸿蒙基础(10)

目录 一、轮播组件 Swiper 二、列表-List 1、简单的List 2、嵌套的List 三、Tabs容器组件 1、系统自带tabs案例 2、自定义导航栏: 一、轮播组件 Swiper Entry Component struct PageSwiper {State message: string Hello Worldprivate SwCon: SwiperControl…

[Python人工智能] 四十五.命名实体识别 (6)利用keras构建CNN-BiLSTM-ATT-CRF实体识别模型(注意力问题探讨)

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解融合Bert的实体识别研究,使用bert4keras和kears包来构建Bert+BiLSTM-CRF模型。这篇文章将详细结合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别…

基于单片机宿舍防火防盗系统的设计

**单片机设计介绍,基于单片机宿舍防火防盗系统的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机宿舍防火防盗系统的设计概要主要涉及单片机技术的应用,以实现对宿舍环境的防火和防盗功能的…

31-5 命令执行漏洞 - RCE漏洞利用

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、打开pikachu靶场 二、远程命令执行利用 正常情况下这一关卡就是个ping命令,我们只能输入个 ip 靶场就就会ping 这ip 但是我们可以用管道符拼接来执行其他命令,详细可以看我…

Android 开发投屏软件

一、背景 作为Android开发总会有给他人share自己APP情况,一般在线会议投屏,总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力,可以在电脑端直接控制手机,同步起来非常方便简单 打开步骤 …

【Docker】搭建简单易用的网站分析工具 - umami

【Docker】搭建简单易用的网站分析工具 - umami 前言 本教程基于绿联的NAS设备DX4600 Pro的docker功能进行搭建,采用umami MySQL实例作为演示。 简介 umami是一个开源的、简单的、易于使用的网站分析工具。其设计目的是提供一个简单、易于理解的方式来查看网站…

ATTCK学习笔记

ATT&CK 前言知识 威胁情报:一般为网络流量中或者操作系统上观察到的能高度表明计算机被入侵的痕迹,例如某病毒的Hash值、服务器的IP地址等等。简单来说,威胁情报就像是当计算机被入侵时所表现出来的某种特征,我们将这些威胁…

Kitex 提供的服务注册与发现 etcd 拓展

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 <br> &#x1f4d8;相关专栏<a href"https://blog.csdn.net/studycodeday/category_12460797.html">…

SmartChart的部署以及可能遇见的报错解决方案

简介 数据可视化是一种将数据转化为图形的技术&#xff0c;可以帮助人们更好地理解和分析数据。但是&#xff0c;传统的数据可视化开发往往需要编写大量的代码&#xff0c;或者使用复杂的拖拽工具&#xff0c;不仅耗时耗力&#xff0c;而且难以实现个性化的需求。有没有一种更…

Linux部分命令

目录 1.文件介绍 2.ls命令 3.目录命令 4.相对路径以及绝对路径 5.命令创建目录&#xff08;文件夹&#xff09; 6.which命令 7.find命令 8.grep命令 9.wc命令 10.echo、tail、重定向符 1.文件介绍 和window不同&#xff0c;Linux没有盘路径&#xff0c;所有的文件都存…

VSCode在文件生成添加作者,创建时间、最后编辑人和最后编辑时间等信息

一、安装插件 我使用的是 korofileheader 二、配置文件 左下角点击设置图标—设置—输入"ext:obkoro1.korofileheader"—点击"在setting.json中编辑" 进入后会自动定位到你添加信息的地方 "Author": "tom", "Date": "…

接口自动化框架搭建(五):生成allure报告

1&#xff0c;安装allure 参考连接&#xff1a; https://blog.csdn.net/lixiaomei0623/article/details/120185069 2&#xff0c;安装python的allure依赖 pip install allure-pytest或者从pycharme上安装 3&#xff0c;生成报告 执行前目录 执行测试用例 import pytest …

js逆向之非对称加密RSA某奇艺登录密码

通过案例主要是学会逆向的过程. 一些正常的js代码可以看懂,可是有些网站会给你混淆, 让你看的不舒服, --打断点慢慢来. # RSA加密 --非对称加密 # 对称加密&#xff1a;加密和解密共用一把钥匙 # 非对称加密: 加密和解密使用两把钥匙 &#xff1a; 公钥&#xff08;加密&…

吴恩达2022机器学习专项课程(一) 4.3 梯度下降的直观理解

问题预览/关键词 本节内容是&#xff1f;J对w求导的含义是&#xff1f;如何确定切线的方向&#xff1f;w在函数J递增处的切线方向是&#xff1f;导数项为正数&#xff0c;w和函数J的关系是&#xff1f;w在函数J递减处的切线方向是&#xff1f;导数项为负数&#xff0c;w和函数…

Visual Studio 2022报错c1083,win11解决办法

如果头文件报错&#xff0c;并且编译器报错是c1083&#xff0c;无法处理的时候&#xff0c;包括卸载重装也是无济于事的时候 此时可以采取一下办法进行修改 出现这个的主要原因是安装 Windows SDK 时版本出错&#xff0c;需要根据自己的 windows 版本选择安装对应版本的 Wind…