IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 开机权限白名单默认授予系统app权限 -> 正文阅读

[移动开发]Android 开机权限白名单默认授予系统app权限

之前不明白为什么权限白名单不生效,现在通过分析系统加载流程,得到了答案

以前在android 8.1的时候,直接在privapp-permissions-mediatek.xml里添加对应app想要的运行时权限就可以了,但是在另外的项目里发现即使写了权限白名单也没用。
device/mediatek/common/device.mk里看到

PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,vendor/mediatek/proprietary/frameworks/base/data/etc/privapp-permissions-mediatek.xml:system/etc/permissions/privapp-permissions-mediatek.xml)
PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,vendor/mediatek/proprietary/frameworks/base/data/etc/system-ext-permissions-mediatek.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/etc/permissions/system-ext-permissions-mediatek.xml)
PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,vendor/mediatek/proprietary/frameworks/base/data/etc/product-permissions-mediatek.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/product-permissions-mediatek.xml)

privapp-permissions-mediatek.xml
system-ext-permissions-mediatek.xml
product-permissions-mediatek.xml
这三个文件都被内置到etc目录下
然后他们的内容也都是写的权限白名单,而且有相同的包名,也就是说有重复或者覆盖的可能。
分析系统流程发现

PermissionManagerService.java

SystemConfig systemConfig = SystemConfig.getInstance();

public static SystemConfig getInstance() {
    synchronized (SystemConfig.class) {
        if (sInstance == null) {
            sInstance = new SystemConfig();
        }
        return sInstance;
    }
}

SystemConfig() {
    try {
        readAllPermissions();
    } finally {
        log.traceEnd();
    }
}

private void readAllPermissions() {
     // Read configuration from system
     readPermissions(Environment.buildPath(
             Environment.getRootDirectory(), "etc", "sysconfig"), ALLOW_ALL);
     readPermissions(Environment.buildPath(
             Environment.getVendorDirectory(), "etc", "sysconfig"), vendorPermissionFlag);
     readPermissions(Environment.buildPath(
             Environment.getOdmDirectory(), "etc", "permissions"), odmPermissionFlag);
     readPermissions(Environment.buildPath(
             Environment.getProductDirectory(), "etc", "sysconfig"), ALLOW_ALL);
     readPermissions(Environment.buildPath(
             Environment.getSystemExtDirectory(), "etc", "permissions"), ALLOW_ALL);

}

会把 system vendor product odm systemext 目录下的permission xml文件全都解析出来

case "privapp-permissions": {
 if (allowPrivappPermissions) {
     // privapp permissions from system, vendor, product and system_ext
     // partitions are stored separately. This is to prevent xml files in
     // the vendor partition from granting permissions to priv apps in the
     // system partition and vice versa.
     boolean vendor = permFile.toPath().startsWith(
             Environment.getVendorDirectory().toPath() + "/")
             || permFile.toPath().startsWith(
             Environment.getOdmDirectory().toPath() + "/");
     boolean product = permFile.toPath().startsWith(
             Environment.getProductDirectory().toPath() + "/");
     boolean systemExt = permFile.toPath().startsWith(
             Environment.getSystemExtDirectory().toPath() + "/");
     if (vendor) {
         readPrivAppPermissions(parser, mVendorPrivAppPermissions,
                 mVendorPrivAppDenyPermissions);
     } else if (product) {
         readPrivAppPermissions(parser, mProductPrivAppPermissions,
                 mProductPrivAppDenyPermissions);
     } else if (systemExt) {
         readPrivAppPermissions(parser, mSystemExtPrivAppPermissions,
                 mSystemExtPrivAppDenyPermissions);
     } else {
         readPrivAppPermissions(parser, mPrivAppPermissions,
                 mPrivAppDenyPermissions);
     }
 } else {
     logNotAllowedInPartition(name, permFile, parser);
     XmlUtils.skipCurrentTag(parser);
 }
} break;

再然后根据app的属性来决定加载哪个xml文件,
如果编译的时候编译app到 systemext 目录,那么加载的就会是system-ext-permissions-mediatek.xml里面的白名单权限。
这样一来,我们如果写的不是这个文件里,就不会生效。

白名单权限授权过程

PermissionManagerService

public void onNewUserCreated(int userId)

            
private void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdated,
            @NonNull PermissionCallback callback)
private void updatePermissions(final @Nullable String changingPkgName,
  final @Nullable AndroidPackage changingPkg,
  final @Nullable String replaceVolumeUuid,
  @UpdatePermissionFlags int flags,
  final @Nullable PermissionCallback callback)
private void restorePermissionState(@NonNull AndroidPackage pkg, boolean replace,
        @Nullable String packageOfInterest, @Nullable PermissionCallback callback)
        {
        ...
	if (bp.isSignature()) {
       // For all apps signature permissions are install time ones.
        allowedSig = grantSignaturePermission(perm, pkg, ps, bp, origPermissions);
        if (allowedSig) {
            grant = GRANT_INSTALL;
        }
    }
    ...
}

起决定作用的就是这里是否能找到白名单权限hasPrivappWhitelistEntry

private boolean hasPrivappWhitelistEntry(String perm, AndroidPackage pkg) {
ArraySet<String> wlPermissions;
 if (pkg.isVendor()) {
     wlPermissions =SystemConfig.getInstance().getVendorPrivAppPermissions(pkg.getPackageName());
 } else if (pkg.isProduct()) {
     wlPermissions=SystemConfig.getInstance().getProductPrivAppPermissions(pkg.getPackageName());
 } else if (pkg.isSystemExt()) {
     wlPermissions =SystemConfig.getInstance().getSystemExtPrivAppPermissions(
                     pkg.getPackageName());
 } else {
     wlPermissions = SystemConfig.getInstance().getPrivAppPermissions(pkg.getPackageName());
 }

 return wlPermissions != null && wlPermissions.contains(perm);
}

SystemConfig.getInstance().getPrivAppPermissions获取的权限名单列表,就是开机加载的白名单列表。

总结:

权限白名单可以使系统app开机即可获取运行时权限,因为在开机过程中会去检测权限是否有白名单,而对应的白名单会根据app编译的路径而做不同的更改。
例如:Launcher的makefile里添加了LOCAL_SYSTEM_EXT_MODULE := true,所以编译的结果会是Launcher被编译到了system\system_ext路径下,而对应的白名单权限,就会去加载system-ext-permissions-mediatek.xml这个文件里的列表。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:41:04  更:2022-03-12 17:42:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:54:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码