Android权限机制验证性实验

来源:互联网 发布:软件项目维护合同范本 编辑:程序博客网 时间:2024/05/29 04:41

  在PackageInstaller源码分析(二) 中提到,Android在安装App的时候,会更新/data/system/packages.xml,/data/system/packages.list和/data/system/users/0/package-restrictions.xml这三个文件。并且,在packages.xml中记录有app申请的全新信息,在packages.list文件中记录了App的Gid信息。我们知道,Android Permission机制是基于Linux权限机制的,也就说App申请的对应的permission是通过向App添加对应的gid完成,下面我们就通过实验证实这一点。

一、 实验源码

      button.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View v) {        // TODO Auto-generated method stub          PackageManager pm=getPackageManager();          try {            int[] gids=pm.getPackageGids("org.ncnipc.androidgroup.venscor.poc");            for(int i:gids){                tv.append(i+"\n");            }        } catch (NameNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }});

二、 分析

  运行实验程序,查看结果,发现程序的打印的gid是:3003,1028,1015,这和packages.list文件中记录的gid是对应的。

这里写图片描述

这里写图片描述

  接着,我们查看App申请了哪些权限,对于App的manifest文件和packages.xml文件,这也是对应的。

这里写图片描述

这里写图片描述

  最后,我们查看一下这些权限是不是全部对应到gid为3003,1028,1015的这三个组。

  在/system/core/include/private/android_filesystem_config.h文件中,对用户/用户组做了宏定义。Android权限机制正是基于用户、用户组的。

这里写图片描述

  在/etc/permission.xml查看这三个gid对应的权限。

这里写图片描述


这里写图片描述


  这里也说明了android.permission.WRITE_EXTERNAL_STORAGE和android.permission.ACCESS_ALL_EXTERNAL_STORAGE包含了android.permission.READ_EXTERNAL_STORAGE权限,即只要申请了前两个中的任意一个,都将自动拥有后一个权限。这也是为什么在package.xml中多出一个android.permission.READ_EXTERNAL_STORAGE权限的原因。

这里写图片描述

  至此,已经说明了上面10个权限中的两个已经和底层的gid挂钩,即因为App的gid中已经包含上面三个gid,所有权限已经获得。那么还剩下8个权限咋回事?

  上面申请的权限中,第2,6,7,8,9属于Normal级的权限,直接申请不需要通过用户同意就能获得,所以不考虑,最后一个是5.1之后deprecated的权限,也不考虑,剩下第4,5和10个权限。第4,5个属于location组的权限,第10个属于phone组的权限。这里有个猜想不知道对不对,就是Android权限应该有两种,一种是用了系统资源,即Linux资源;另一种没有使用系统资源。对于前一种,在App安装授予权限的过程中,需要把platform.xml中定义的gid添加到App中,以后对于Linux底层的系统资源能够调用。对于后者,在platform.xml中没有定义gid和permission的对应关系,由于其也不调用系统资源,所以直接在framework层就可以检测。

0 0
原创粉丝点击