LOCAL_PRIVILEGED_MODULE 詳解(1)

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_MODULE
    partition_tag :=
  else
  ifeq (true,$(LOCAL_PROPRIETARY_MODULE))
    partition_tag := _VENDOR
  else ifeq (true,$(LOCAL_OEM_MODULE))
    partition_tag := _OEM
  else ifeq (true,$(LOCAL_ODM_MODULE))
    partition_tag := _ODM
  else
    # 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)
  endif
  endif
  install_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)_PRIVILEGED
  endif
  my_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)_PRIVILEGED
  endif

增加一些調試信息來求證:

  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)_PRIVILEGED
  endif
  $(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)_PRIVILEGED
  endif
  $(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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章