LOCAL_PRIVILEGED_MODULE 是Android ROM编译时的一个变量,其与编译、安装、权限管理等几个方面都有关系。本文整理一下与LOCAL_PRIVILEGED_MODULE有关的知识。本文源代码分析基于Android6.0.1。

1.编译时作用

对于Android系统应用,LOCAL_PRIVILEGED_MODULE 决定了其编译后的在ROM中的安装位置:
如果不设置或者设置为false,安装位置为system/app;
如果设置为true,安装位置为system/priv-app。
那么,Android的编译系统是如何处理这个变量的呢?
我们知道,Android编译系统源代码主要是位于 build/core下的xxx.mk文件,在build/下搜索对于LOCAL_PRIVILEGED_MODULE的使用,可以看到:

$ grep -nr "LOCAL_PRIVILEGED_MODULE" *
core/clear_vars.mk:148:LOCAL_PRIVILEGED_MODULE:=
core/base_rules.mk:129:  ifeq (true,$(LOCAL_PRIVILEGED_MODULE))

base_rules.mk里面有对LOCAL_PRIVILEGED_MODULE的处理。从base_rules.mk的头部注释来看,这个文件是用来定义通用的编译命令,并且支持自定义扩展。

# Users can define base-rules-hook in their buildspec.mk to perform
# arbitrary operations as each module is included.
ifdef base-rules-hook
$(if $(base-rules-hook),)
endif###########################################################
## Common instructions for a generic module.
###########################################################

在build/下搜索也发现base_rules.mk多处include:

$ grep -nr "base_rules" *
core/java.mk:74:# Define the intermediate targets before including base_rules so they get
core/java.mk:292:# TODO: It looks like the only thing we need from base_rules is
core/java.mk:294:# common_java.mk, and moving the include of base_rules.mk to
core/java.mk:298:include $(BUILD_SYSTEM)/base_rules.mk
core/java.mk:340:# Override some target variables that base_rules set up for us.
core/install_jni_libs_internal.mk:7:#   partition_tag (from base_rules.mk)
core/host_static_library_internal.mk:4:## Additional inputs from base_rules.make:
core/binary.mk:9:include $(BUILD_SYSTEM)/base_rules.mk
core/package_internal.mk:20:## Additional inputs from base_rules.make:
core/phony_package.mk:8:include $(BUILD_SYSTEM)/base_rules.mk
core/install_jni_libs.mk:5:#   my_module_path (from base_rules.mk)
core/install_jni_libs.mk:6:#   partition_tag (from base_rules.mk)
core/host_java_library.mk:43:include $(BUILD_SYSTEM)/base_rules.mk
core/prebuilt.mk:4:## Additional inputs from base_rules.make:
core/static_library_internal.mk:4:## Additional inputs from base_rules.make:
core/build-system.html:909:<p>Set by the host_xxx.make includes to tell base_rules.make and the other
core/build-system.html:929:variable names used to locate the modules.  See base_rules.make and
core/build-system.html:942:<p>Calculated in base_rules.make to determine if this module should actually
core/dex_preopt_odex_install.mk:2:# This file depends on variables set in base_rules.mk
core/host_executable_internal.mk:4:## Additional inputs from base_rules.make:
core/java_library.mk:21:# base_rules.mk looks at this
core/executable_internal.mk:4:## Additional inputs from base_rules.make:
core/dynamic_binary.mk:16:# This duplicates logic from base_rules.mk because we need to
core/dynamic_binary.mk:17:# know its results before base_rules.mk is included.
core/shared_library_internal.mk:4:## Additional inputs from base_rules.make:
core/host_dalvik_java_library.mk:51:include $(BUILD_SYSTEM)/base_rules.mk
core/host_shared_library_internal.mk:4:## Additional inputs from base_rules.make:
core/host_java_library_common.mk:42:# base_rules.mk looks at this
core/prebuilt_internal.mk:4:## Additional inputs from base_rules.make:
core/prebuilt_internal.mk:85:  include $(BUILD_SYSTEM)/base_rules.mk
tools/apicheck/Android.mk:31:include $(BUILD_SYSTEM)/base_rules.mk
tools/fs_config/Android.mk:67:include $(BUILD_SYSTEM)/base_rules.mk
tools/fs_config/Android.mk:78:include $(BUILD_SYSTEM)/base_rules.mk

好,下面看看base_rules.mk中对于LOCAL_PRIVILEGED_MODULE的处理逻辑:

ifeq ($(my_module_path),)ifdef LOCAL_IS_HOST_MODULEpartition_tag :=elseifeq (true,$(LOCAL_PROPRIETARY_MODULE))partition_tag := _VENDORelse ifeq (true,$(LOCAL_OEM_MODULE))partition_tag := _OEMelse ifeq (true,$(LOCAL_ODM_MODULE))partition_tag := _ODMelse# The definition of should-install-to-system will be different depending# on which goal (e.g., sdk or just droid) is being built.partition_tag := $(if $(call should-install-to-system,$(my_module_tags)),,_DATA)endifendifinstall_path_var := $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)ifeq (true,$(LOCAL_PRIVILEGED_MODULE))install_path_var := $(install_path_var)_PRIVILEGEDendifmy_module_path := $($(install_path_var))ifeq ($(strip $(my_module_path)),)$(error $(LOCAL_PATH): unhandled install path "$(install_path_var) for $(LOCAL_MODULE)")endif
endif

如果LOCAL_PRIVILEGED_MODULE为true,对安装路径变量install_path_var做了修改:

  ifeq (true,$(LOCAL_PRIVILEGED_MODULE))install_path_var := $(install_path_var)_PRIVILEGEDendif

增加一些调试信息来求证:

  install_path_var := $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)$(warning ******************** test **********************************)$(warning step1 - install_path_var : $(install_path_var))$(warning ******************** test **********************************)ifeq (true,$(LOCAL_PRIVILEGED_MODULE))
    install_path_var := $(install_path_var)_PRIVILEGEDendif$(warning ******************** test **********************************)$(warning step2 - install_path_var : $(install_path_var))$(warning ******************** test **********************************)

随便编译某个将LOCAL_PRIVILEGED_MODULE设置为true的系统应用,mm,看到如下warning信息:

build/core/base_rules.mk:130: ******************** test **********************************
build/core/base_rules.mk:131: step1 - install_path_var : TARGET_OUT_APPS
build/core/base_rules.mk:132: ******************** test **********************************
build/core/base_rules.mk:138: ******************** test **********************************
build/core/base_rules.mk:139: step2 - install_path_var : TARGET_OUT_APPS_PRIVILEGED
build/core/base_rules.mk:140: ******************** test **********************************

再打印TARGET_OUT_APPS和TARGET_OUT_APPS_PRIVILEGED两个变量:

  install_path_var := $(LOCAL_2ND_ARCH_VAR_PREFIX)$(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)$(warning ******************** test **********************************)$(warning step1 - install_path_var : $(install_path_var))$(warning ******************** test **********************************)ifeq (true,$(LOCAL_PRIVILEGED_MODULE))
    install_path_var := $(install_path_var)_PRIVILEGEDendif$(warning ******************** test **********************************)$(warning step2 - install_path_var : $(install_path_var))$(warning ******************** test **********************************)$(warning ******************** test **********************************)$(warning values - install_path_var : $(TARGET_OUT_APPS))$(warning values - install_path_var : $(TARGET_OUT_APPS_PRIVILEGED))$(warning ******************** test **********************************)

warning信息:

build/core/base_rules.mk:138: ******************** test **********************************
build/core/base_rules.mk:139: values - install_path_var : out/target/product/xxx/system/app
build/core/base_rules.mk:140: values - install_path_var : out/target/product/xxx/system/priv-app
build/core/base_rules.mk:141: ******************** test **********************************

可以看到,正是对于LOCAL_PRIVILEGED_MODULE的处理,将安装路径从system/app改为system/priv-app。

LOCAL_PRIVILEGED_MODULE 详解(1)
LOCAL_PRIVILEGED_MODULE 详解(2)
LOCAL_PRIVILEGED_MODULE 详解(3)
LOCAL_PRIVILEGED_MODULE 详解(4)
LOCAL_PRIVILEGED_MODULE 详解(5)

LOCAL_PRIVILEGED_MODULE 详解(1)相关推荐

  1. LOCAL_PRIVILEGED_MODULE 详解(4)

    2.3 packages.xml中的privateFlags字段 前文提到,packages.xml 这个文件位于ROM设备的 data/system,读取需要root权限.记录系统中所有安装的应用信 ...

  2. LOCAL_PRIVILEGED_MODULE 详解(2)

    2.安装时作用 2.1 准备知识 在介绍LOCAL_PRIVILEGED_MODULE在安装时的作用之前,先介绍几个关键的准备知识: (1)packages.xml 这个文件位于ROM设备的 data ...

  3. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  4. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  5. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  6. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  7. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  8. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  9. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

最新文章

  1. 转发和重定向的区别?
  2. php 商场收银收费系统,使用的策略模式
  3. java grizzly_java grizzly实现http服务器
  4. 低效能人士的七个习惯
  5. 工作70:验证放在直接父级
  6. php strlen遇0截断,聊下php下的截断问题
  7. 第十节:实现vue组件之间的通信
  8. Prolog 语言入门(一)
  9. datagrid getselected/getselections/getData之间的用法差异
  10. 算法设计——电路布线问题(动态规划)
  11. CPN|一个Anchor-free, Two-stage的目标检测器
  12. gis坐标|度分秒与十进制转换公式
  13. Docker Hub Automated Build with GitHub
  14. [转][汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)
  15. axure 图片切换图片的交互_Axure教程:在动态面板里面设置图片自动/手动切换
  16. 老年机按键串号_老人机怎么打字母
  17. 无线充电技术究竟有何神秘之处?一篇文章带你读懂什么是无线充电技术
  18. 牛客IOI周赛22-提高组 华丽转身 C++
  19. Acrelcloud-6000安全用电管理平台是一套电气火灾预警和预防管理系统
  20. c语言程序设计双色板实训教程答案,可锁定输出的数控稳压电源-完全开源

热门文章

  1. 阿里云肖力:云即信任
  2. 区块链 fisco bcos 2.72 在多机器上部署多个docker节点 ubuntu
  3. ip反查域名的详细信息(多种方法)
  4. 使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角
  5. Java常用集合List、Map、Set介绍以及一些面试问题
  6. [C++] 计算行列式的若干种方法
  7. 神经网络原理与实例精解,神经网络计算机的组成
  8. 日志易之Agent统一IP地址开通多个端口
  9. 荣耀出鸿蒙,横空出世 揭开鸿蒙真容!荣耀智慧屏抢先体验
  10. 基于Linux的C++ Part 5 程序组织与开发方法