安卓版本的升级,系统对于应用程序的权限管控越来越严格。从8.0开始需要使用权限必须在清单文件中声明,否则将不予使用该权限或报错(即使你的apk位于priv-app中也不行,所以你会发现新买的手机即使是系统应用,也需要申请访问权限)。其目的是为了规范开发者对用户隐私的访问。

对于软件包和权限的控制,在Android9及以前位于 PackageInstaller 中,他是一款app(位于[aospsource]/packages/apps/PackageInstaller),此时apk安装和权限控制的逻辑都在这个里面,而在Android10之后,权限管理变得越发复杂,于是谷歌单独把权限功能做到一个app中,叫PermissionController (位于[aospsource]/packages/apps/PermissionController)大家看下面这张图会更加直观;

权限管理java 权限管理程序安装_权限管理java

权限控制

从Android9开始,官方表示系统编译必须为系统应用声明特殊权限,这些权限你可以在你编译好的机器中看到:

权限管理java 权限管理程序安装_权限管理java_02


我们可以看到这里很多文件,实际上针对不同的产品对应的xml文件不一样,基本符合以下规定:

  • 对于已包含在 Android 开源项目 (AOSP) 树中的应用,将其权限列在 /etc/permissions/privapp-permissions-platform.xml 中。
  • 对于 Google 应用,将其权限列在 /etc/permissions/privapp-permissions-google.xml 中。
  • 对于其他应用,使用以下格式的文件:/etc/permissions/privapp-permissions-DEVICE_NAME.xml。

这些东西对我们来讲影响最大的还是访问唯一标识,因为从Android10开始,谷歌已经禁止用户在不声明的情况下访问设备标识,除非有在文件中配置。由于是默认配置,那么我们除了配置默认许可还有可能配置默认不许可(啥都没配就是将选择权限交给用户)。
大家可以参考这种写法(以Aosp源码树的priv-app配置为例,位于/etc/permissions/privapp-permissions-platform.xml):

<!-- This XML file declares which signature|privileged permissions to grant to
privileged apps that come with the platform -->

    <permissions>
    <privapp-permissions package="com.android.backupconfirm">
    <permission name="android.permission.BACKUP"/>
    <permission name="android.permission.CRYPT_KEEPER"/>
    </privapp-permissions>

    <privapp-permissions package="com.android.cellbroadcastreceiver">

    <!-- Don't allow the application to interact across users -->

    <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/>
    <permission name="android.permission.MANAGE_USERS"/>
    <permission name="android.permission.MODIFY_PHONE_STATE"/>
    <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
    <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
    </privapp-permissions>
    ...

实际上,大部分的系统定制并不关心如何配置自己应用的默认权限,更多的是关注如何自动化控制第三方应用的权限申请。

应用安装

就我们熟知的有三种方式安装应用,分别是:

  1. 系统应用和预装应用
  2. 通过官方应用商店
  3. 通过软件安装的应用
  4. 通过Adb安装应用

而不同应用的安装类型是不一样的,Android系统的apk放在了以下几个目录:

  • /system/framwork:保存的是资源型的应用程序,它们用来打包资源文件
  • /system/app:保存系统自带的应用程序
  • /data/app:保存用户安装的应用程序
  • /data/data:应用数据目录
  • /data/app-private:保存受DRM保护的私有应用程序
  • /vendor/app:保存设备厂商提供的应用程序

未完待续……