Android13预置应用权限配置实战:从XML声明到系统集成

张开发
2026/4/9 22:00:05 15 分钟阅读

分享文章

Android13预置应用权限配置实战:从XML声明到系统集成
1. Android13预置应用权限配置概述在Android系统开发中预置应用Pre-installed Apps是指那些随系统一起出厂安装的应用。这类应用通常需要特殊的权限配置因为它们往往承担着系统级功能。Android13对权限管理做了进一步强化特别是针对预置应用的特殊权限授予方式。我最近在为一个对讲机应用做系统集成时发现传统的权限配置方式在Android13上已经不够用了。过去我们习惯在framework/base/data/etc/privapp-permissions-platform.xml中统一声明所有特权应用的权限但这种方式在维护性和模块化方面存在明显缺陷。Android13推荐的做法是将权限声明文件与预置应用放在同一目录下。这样做有几个好处权限配置与应用代码高度内聚便于维护不同预置应用的权限相互隔离避免冲突编译时可以更灵活地控制权限授予范围举个例子如果你的预置应用放在vendor/yourcompany/package/apps/YourApp目录下那么权限配置文件也应该放在这个目录中而不是像以前那样全部堆在系统框架目录下。2. 权限声明文件创建实战2.1 privapp-permissions配置文件首先需要在应用目录下创建privapp-permissions-yourpackage.xml文件。这个文件的作用是声明你的应用需要哪些特权权限。以对讲机应用为例?xml version1.0 encodingutf-8? permissions privapp-permissions packagecom.demo.dmr permission nameandroid.permission.RECORD_AUDIO/ permission nameandroid.permission.MODIFY_AUDIO_SETTINGS/ permission nameandroid.permission.FOREGROUND_SERVICE/ permission nameandroid.permission.READ_PHONE_STATE/ /privapp-permissions /permissions这里有几个关键点需要注意package属性必须与应用的包名完全一致每个permission标签对应一个需要申请的权限权限名称必须使用Android标准权限常量我在实际项目中遇到过因为包名大小写不一致导致权限失效的情况所以建议直接从应用的AndroidManifest.xml中复制包名。2.2 default-permissions配置文件除了特权权限声明还需要创建default_permissions_yourpackage.xml文件来实际授予这些权限exceptions exception packagecom.demo.dmr permission nameandroid.permission.RECORD_AUDIO fixedfalse/ permission nameandroid.permission.MODIFY_AUDIO_SETTINGS fixedfalse/ permission nameandroid.permission.FOREGROUND_SERVICE fixedfalse/ permission nameandroid.permission.READ_PHONE_STATE fixedfalse/ /exception /exceptions这里的fixedfalse表示用户仍然可以在设置中撤销这些权限。如果设为true则权限将无法被用户撤销。3. Android.mk编译配置详解3.1 应用模块配置在应用目录下创建Android.mk文件这是整个编译过程的核心。我们需要配置三个主要部分LOCAL_PATH: $(call my-dir) # 应用模块配置 include $(CLEAR_VARS) LOCAL_MODULE_TAGS : optional LOCAL_MODULE : DMR LOCAL_MODULE_STEM : FlyscaleDmr.apk LOCAL_MODULE_CLASS : APPS LOCAL_CERTIFICATE : PRESIGNED LOCAL_MODULE_PATH : $(TARGET_OUT)/priv-app LOCAL_SRC_FILES : FlyscaleDmr.apk LOCAL_PRIVILEGED_MODULE : true LOCAL_ENFORCE_USES_LIBRARIES : false # 配置JNI库 ifeq ($(TARGET_ARCH),arm64) LOCAL_PREBUILT_JNI_LIBS : $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/arm64-v8a/*.so)) else LOCAL_PREBUILT_JNI_LIBS : $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/armeabi-v7a/*.so)) endif include $(BUILD_PREBUILT)这部分有几个容易踩坑的地方LOCAL_MODULE_STEM必须与APK文件名一致LOCAL_PRIVILEGED_MODULE必须设为true才能使用特权权限JNI库路径必须与APK内的lib结构一致3.2 权限模块配置继续在同一个Android.mk中添加权限配置# 默认权限配置 include $(CLEAR_VARS) LOCAL_MODULE : default_permissons_dmr.xml LOCAL_MODULE_CLASS : ETC LOCAL_MODULE_PATH : $(TARGET_OUT_ETC)/default-permissions LOCAL_SRC_FILES : $(LOCAL_MODULE) include $(BUILD_PREBUILT) # 特权权限配置 include $(CLEAR_VARS) LOCAL_MODULE : privapp-permissions-flydmr.xml LOCAL_MODULE_TAGS : optional LOCAL_MODULE_CLASS : ETC LOCAL_MODULE_PATH : $(TARGET_OUT_ETC)/permissions LOCAL_SRC_FILES : $(LOCAL_MODULE) include $(BUILD_PREBUILT)注意两个权限文件的安装路径不同default-permissions安装在/system/etc/default-permissionsprivapp-permissions安装在/system/etc/permissions4. 系统集成与问题排查4.1 产品配置文件修改要让预置应用真正集成到系统中需要在产品配置文件中添加引用。通常修改handheld_product.mk或类似的产品配置文件PRODUCT_PACKAGES \ DMR \ privapp-permissions-flydmr.xml \ default_permissons_dmr.xml这里有个小技巧PRODUCT_PACKAGES中的模块名必须与Android.mk中定义的LOCAL_MODULE完全一致。我曾经因为模块名大小写不一致导致编译通过但应用没有预置进去。4.2 常见问题解决问题1应用崩溃提示权限不足这种情况通常是因为default_permissions配置没有生效。检查步骤确认default_permissons_dmr.xml是否正确安装到/system/etc/default-permissions检查文件权限是否为644确认包名拼写是否正确问题2应用找不到JNI库系统应用加载JNI库的路径与普通应用不同。解决方案确保APK中的lib文件已解压到Android.mk同级目录检查LOCAL_PREBUILT_JNI_LIBS配置的路径是否正确确认设备架构与so文件架构匹配问题3输入法无法设为默认如果需要将预置输入法设为默认需要修改两处packages/SettingsProvider/res/values/defaults.xml中添加默认输入法配置DatabaseHelper.java中加载默认输入法设置5. 高级配置技巧5.1 多架构支持对于需要支持多种CPU架构的应用可以这样优化JNI配置ifeq ($(TARGET_ARCH),arm64) LOCAL_PREBUILT_JNI_LIBS : $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/arm64-v8a/*.so)) else ifeq ($(TARGET_ARCH),x86_64) LOCAL_PREBUILT_JNI_LIBS : $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/x86_64/*.so)) else LOCAL_PREBUILT_JNI_LIBS : $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/lib/armeabi-v7a/*.so)) endif5.2 权限分组管理对于需要大量权限的应用可以按功能分组管理权限privapp-permissions packagecom.demo.dmr !-- 音频相关权限 -- permission nameandroid.permission.RECORD_AUDIO/ permission nameandroid.permission.MODIFY_AUDIO_SETTINGS/ !-- 后台运行权限 -- permission nameandroid.permission.FOREGROUND_SERVICE/ permission nameandroid.permission.RECEIVE_BOOT_COMPLETED/ /privapp-permissions5.3 条件权限授予在某些情况下可能需要根据设备特性动态授予权限。可以在default_permissions中使用条件判断exception packagecom.demo.dmr permission nameandroid.permission.CAMERA fixedfalse/ !-- 仅当设备有NFC硬件时才授予此权限 -- permission nameandroid.permission.NFC fixedfalse feature nameandroid.hardware.nfc / /permission /exception在实际项目中我发现权限配置虽然看似简单但细节决定成败。特别是在系统升级时权限策略的变化往往会导致之前正常工作的应用出现各种问题。建议每次Android版本升级都重新检查权限配置是否符合新的规范要求。

更多文章