当前位置: 首页 > news >正文

Android 特权应用 privapp-permissions 权限解读

特权应用 官网说明

特权应用是位于系统映像某个分区上 priv-app 目录下的应用,如 system/priv-app/

特权应用

  • 相比安装在 system/app/ 目录的应用,具有更高的权限。
  • 基本都是系统预装,不可卸载。
  • 可以不是系统签名。

源码预制

源码下预制到 priv 分区,根据编译规则配置即可。

Android.mk

配置 LOCAL_PRIVILEGED_MODULE := true ,如

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
  LOCAL_MODULE := LuoDemo
  LOCAL_MULTILIB := 32
  LOCAL_MODULE_CLASS := APPS
  LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  LOCAL_CERTIFICATE := platform
  LOCAL_PRIVILEGED_MODULE := true
  LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))

Android.bp

配置 privileged: true

android_app {
    name: "LuoDemo",

    srcs: ["src/**/*.java"],

    certificate: "platform",
    privileged: true,
    platform_apis: true,

    static_libs: [
        "xz-java",
        "androidx.leanback_leanback",
        "androidx.appcompat_appcompat",
    ],
}

privapp-permissions 权限配置

特权应用申请的特殊权限,需要在 xml 中声明权限。

如果不配置权限,机器预制特权应用,编译后开机可能会异常,常见的表现是:卡在开机Logo 或者 开机动画,无限重启
报错 log 中典型特征 Signature|privileged permissions not in privapp-permissions whitelist
完整log如下,

--------- beginning of crash
10-16 14:18:39.065  3151  3151 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
10-16 14:18:39.065  3151  3151 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.demo.permission: android.permission.DELETE_PACKAGES, com.demo.permission: android.permission.READ_NETWORK_USAGE_HISTORY, com.demo.permission: android.permission.READ_LOGS, com.demo.permission: android.permission.PACKAGE_USAGE_STATS, com.demo.permission: android.permission.CLEAR_APP_CACHE, com.demo.permission: android.permission.REAL_GET_TASKS, com.demo.permission: android.permission.READ_PRIVILEGED_PHONE_STATE}
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:3118)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:122)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.systemReady(PermissionManagerService.java:3179)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:21886)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.SystemServer.startOtherServices(SystemServer.java:1995)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.SystemServer.run(SystemServer.java:513)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.SystemServer.main(SystemServer.java:350)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:916)

配置 privapp-permissions 权限的方法如下,任选其一即可。逐个说明。

原生 privapp-permissions-platform.xml

修改 frameworks/base/data/etc/privapp-permissions-platform.xml ,

根据 log 中的报错逐个添加权限,添加如下,

<permissions>

+    <privapp-permissions package="com.demo.permission">
+        <permission name="android.permission.DELETE_PACKAGES"/>
+        <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
+        <permission name="android.permission.READ_LOGS"/>
+        <permission name="android.permission.PACKAGE_USAGE_STATS"/>
+        <permission name="android.permission.CLEAR_APP_CACHE"/>
+        <permission name="android.permission.REAL_GET_TASKS"/>
+        <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+    </privapp-permissions>

</permissions>

厂商的 privapp-permissions-xxx.xml

厂商基本都有自己定制 privapp-permissions-xxx.xml ,如

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := privapp-permissions-xxx.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/permissions
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := privapp-permissions-xxx.xml
include $(BUILD_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))

最终编译到 system/etc/permissions/

新增

自己新增一个 privapp-permissions-my.xml 文件,在 device.mk 中拷贝到 system/etc/permissions/ 下,

PRODUCT_COPY_FILES += \
    device/tv201/DAEWOO/etc/permissions/privapp-permissions-my.xml:system_ext/etc/permissions/privapp-permissions-my.xml \

此方法可能不完全适用,谨慎使用。

提前获取应用的特殊权限

前面是根据报错 log 来知道特权应用申请的权限,如果可以提前获取,就可以避免编译耗时。

如果应用可以直接安装,就可以用命令获取。

安装

先安装特权应用,pm install -r --user 0 apkFilePath 。 -r 、–user 0 参数按需使用。

获取

pm get-privapp-permissions TARGET-PACKAGE 命令获取

get-privapp-permissions TARGET-PACKAGE
Prints all privileged permissions for a package.

如,

console:/ # pm get-privapp-permissions com.demo.permission                 
{android.permission.REAL_GET_TASKS, android.permission.PACKAGE_USAGE_STATS, android.permission.READ_PRIVILEGED_PHONE_STATE, android.permission.READ_LOGS, android.permission.READ_NETWORK_USAGE_HISTORY, android.permission.CLEAR_APP_CACHE, android.permission.DELETE_PACKAGES}
console:/ #

这是串口获取的, adb 获取的话用 adb shell pm get-privapp-permissions TARGET-PACKAGE 。

源码分析

报错 log Signature|privileged permissions not in privapp-permissions whitelist 位于 frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java

    private void systemReady() {
        mSystemReady = true;
        if (mPrivappPermissionsViolations != null) {
            throw new IllegalStateException("Signature|privileged permissions not in "
                    + "privapp-permissions whitelist: " + mPrivappPermissionsViolations);
        }

        mPermissionControllerManager = mContext.getSystemService(PermissionControllerManager.class);
        mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);
    }

待续

相关文章:

  • 华为数通方向HCIP-DataCom H12-831题库(多选题:1-20)
  • Ansible 的脚本 --- playbook 剧本
  • SSD算法学习(单步多框目标检测)
  • 美格智能出席无锡智能网联汽车生态大会,共话数字座舱新势力
  • 【数据结构】模拟实现无头单向非循环链表
  • JOSEF约瑟 JHOK-ZBM1;JHOK-ZBL1多档切换式漏电(剩余)继电器 面板导轨安装
  • Flink之常用处理函数
  • 使用cxf将wsdl文件转换成java文件 webservice
  • 中文编程开发语言工具开发的实际软件案例:称重管理系统软件
  • 2023年最新版CorelDraw(cdr)软件下载安装教程
  • 【广州华锐互动】VR营销心理学情景模拟培训系统介绍
  • Mysql数据库表操作--存储
  • 数据结构与算法(十):动态规划与贪心算法
  • 如何借助边缘智能网关打造智慧城市便民驿站
  • Linux性能优化--性能工具:下一步是什么
  • CAdUiPaletteSet创建后乱码 2023/10/17 下午11:25:07
  • 第十五章:输入输出流I/O
  • 用Node.js开发基于稳定扩散的AI应用
  • AD9371 官方例程
  • 【树莓派c++图像处理起航1】
  • 五部门:开展新就业形态劳动者劳动权益保障水平提升专项行动
  • 国台办:“台独”是绝路,外人靠不住
  • 交行一季度净利253.72亿元增1.54%,不良率微降
  • 马上评丨又见酒店坐地起价,“老毛病”不能惯着
  • 昆明破获一起算命破灾诈骗案,民警:大师算不到自己的未来
  • 今年一季度全国社会物流总额达91万亿元,工业品比重超八成