`

android2.3权限问题

 
阅读更多


    android2.3相对于2.2来说,有个最大的变化就是权限管理模块的更新,导致明明有root权限,但是无法执行很多底层命令和api,举例:在终端上su到root用户,执行ls等命令都会报没有权限。
    该问题引发的问题包括:
    A 大多数PC客户端(包括91助手、豌豆夹等)都无法自动安装daemon程序
    B 很多需要root权限执行的程序无法正常运行


    那么就到底是什么原因导致的呢? 这些权限问题又如何来解决呢? 下面我们先分析一下权限的设计:

    


    1.    权限

    每个程序在安装时都有建立一个系统ID,如app_15,用以保护数据不被其它应用获取。Android根据不同的用户和组,分配不同权限,比如访问SD卡,访问网络等等。底层映射为Linux权限。

    


    2.    应用申请权限

    1)        应用开发者通过AndroidManifest.xml中<uses-permission>指定对应权限,再映射到底层的用户和组,默认情况下不设定特殊的权限。AndroidManifest加入权限后系统安装程序时会在图形界面中提示权限

    2)        如果是缺少某个权限(程序中使用的某种权限而在AndroidManifest.xml中并未声名),程序运行时会在logcat中打印出错误信息requires <permission>

    3)        与某个进程使用相同的用户ID
    应用程序可与系统中已存在的用户使用同一权限,需要在AndroidManifest.xml中设置sharedUserId,如android:sharedUserId="android.uid.shared",作用是获得系统权限,但是这样的程序属性只能在build整个系统时放进去(就是系统软件)才起作用,共享ID的程序必须是同一签名的

    


    3.    Android权限的实现

    1)        第一层:由应用设置,修改AndroidManifest.xml,形如:
    <uses-permission android:name=”android.permission.INTERNET”/>

    2)        第二层:框架层,权限对应组,frameworks/base/data/etc/platform.xml,形如:
    <permission name=”android.permission.INTERNET”>
        <group gid=inet” />
    </permission>

    这次就碰到fd = socket(AF_INET, type, 0);打开失败,其实就是这个文件的格式发生变化,应该是utf-8,但是却

    不知为何变成了unicode格式导致xml解析错误,从而获取不到group gid,其为空值导致框架层检测权限失败。

    


    3)        第三层:系统层,系统的权限,system/core/include/private/android_filesystem_config.h,形如:
    #define AID_INET 3003              建立SOCKET的权限
    ……
    { “inet”, AID_INET, },

    4.    系统权限

    1)        特殊权限的用户

    a)         system     uid 1000

    b)        radio       uid 1001

    2)        查看可用系统的权限
    $ adb shell
    # pm list permissions

    


    5.    framework层对权限的判断

    1)        相关源码实现 www.2cto.com
    frameworks/base/services/java/com/android/server/PackageManagerService.java
    frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

    检查权限的代码片段:

        public int checkPermission(String permName, String pkgName) {
            synchronized (mPackages) {
                PackageParser.Package p = mPackages.get(pkgName);
                if (p != null && p.mExtras != null) {
                    PackageSetting ps = (PackageSetting)p.mExtras;
                    if (ps.sharedUser != null) {
                        if (ps.sharedUser.grantedPermissions.contains(permName)) {
                            return PackageManager.PERMISSION_GRANTED;
                        }
                    } else if (ps.grantedPermissions.contains(permName)) {
                        return PackageManager.PERMISSION_GRANTED;
                    }
                }
            }
            return PackageManager.PERMISSION_DENIED;
        }


        public int checkUidPermission(String permName, int uid) {
            synchronized (mPackages) {
                Object obj = mSettings.getUserIdLP(uid);
                if (obj != null) {
                    GrantedPermissions gp = (GrantedPermissions)obj;
                    if (gp.grantedPermissions.contains(permName)) {
                        return PackageManager.PERMISSION_GRANTED;
                    }
                } else {
                    HashSet<String> perms = mSystemPermissions.get(uid);
                    if (perms != null && perms.contains(permName)) {
                        return PackageManager.PERMISSION_GRANTED;
                    }
                }
            }
            return PackageManager.PERMISSION_DENIED;
        }

    

    

    2)        在系统层,如何查看某个应用的权限

    a)         在应用进程开启时,ActivityManagerService.java会在logcat中输出该应用的权限,形如:
    I/ActivityManager(1730): Start proc com.anbdroid.phone for restart com.android.phone:pid=2605 uid=1000 gids={3002,3001,3003}
    即它有3001,3002,3003三个权限:访问蓝牙和建立socket

    b)        注意:此打印输出在应用第一次启动时。如果进程已存在,需要先把对应进程杀掉,以保证该进程重新启动,才能显示

    c)         具体实现,见:
    framewors/base/services/java/com/android/server/am/ActivityManagerService.java的函数startProcessLocked(),其中取其组信息的具本语句是
    mContext.getPackageManager().getPackageGids(app.info.packageName);

    


    代码片段如下:

                int uid = app.info.uid;
                int[] gids = null;
                try {
                    gids = mContext.getPackageManager().getPackageGids(
                            app.info.packageName);
                } catch (PackageManager.NameNotFoundException e) {
                    Slog.w(TAG, "Unable to retrieve gids", e);
                }

    

     摘自 andyhuabing的专栏
    
分享到:
评论

相关推荐

    Android SDK 2.3 官方下载 2

    Andoird SDK 官方下载,本人权限有限,分3个压缩包下载,只有第一个包需要资源分。

    kingroot_v5.1.0-176_Android-2.3.apk

    一个用于一键获取ROOT权限的程序

    Android SDK 2.3 官方下载 3

    Android SDK 官方安装程序,通用版本,本人权限有限,分3个包发布,只有第一个压缩包需要资源分,保证正版。

    android reverse tethering2.3

    Android Reverse Tethering是个不错的选择!轻松通过一条USB线帮助手机上网! 首先请注意:* C9 f6 d$ R: [# M+ P ①设备需ROOT; ②确保电脑上有你设备的usb驱动(仅windows系统); ③确保【USB调试】已开启...

    Android SDK 2.3 官方下载 1

    本人权限有限,只能提供15上传空间,故分3个包下载,只有第一包需要资源分,保证官方下载。

    安卓_Android一键root工具/软件/权限

    移动叔叔首个一键ROOT工具,适用android2.3等系统,联想A60亲测试通过! 理论上支持所有android2.3系统机型,包括正牌军! 能力有限程序难免有bug,大家反馈测试结果,我们改进! 移动叔叔-专业的移动设备网络服务...

    Android代码-BluetoothLELibrary

    demo运行环境 Android Studio 2.3 低功耗蓝牙库。优势: 适配到Android5.0和Android6.0、7.0的扫描方式(速度极快)。 适配小米手机连接蓝牙操作。 适配三星手机发现服务、开启通知等。 支持直接连发数百条数据,而...

    RE管理器 2.3安卓系统

    RE管理器 2.3安卓系统 汉化版Root Explorer这款Android文件管理器的霸主几乎无人不知无人不晓。这是获取ROOT权限之后必装的文件管理器

    Android高级编程--源代码

    2.3 To-Do List示例 35 2.4 Android开发工具 40 2.4.1 Android模拟器 41 2.4.2 Dalvik调试监控服务(DDMS) 41 2.4.3 Android调试桥(ADB) 41 2.5 小结 42 第3章 创建应用程序和活动 43 3.1 Android应用程序的...

    《Android高级编程》

    2.2 面向移动设备的开发 2.2.1 关于硬件设计的考虑事项 2.2.2 考虑用户环境 2.2.3 Android开发 2.3 To-Do List示例 2.4 Android开发工具 2.4.1 Android模拟器 2.4.2 Dalvik调试监控服务(DDMS) 2.4.3 Android调试桥...

    《Android系统源代码情景分析》

    2.3.4 处理硬件设备访问权限问题 2.4 开发Android硬件访问服务 2.4.1 定义硬件访问服务接口 2.4.2 实现硬件访问服务 2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序...

    太阳通话录音

    本软件支持的系统包括:Android 1.6、Android 2.0.1、Android 2.1、Android 2.2、Android 2.3、Android 3.0、Android 3.1、Android 3.2、Android 4.0; 本软件支持的屏幕尺寸包括:320*480、480*854、480*800、240*...

    Android开发与应用——张荣,原书配套课件

    2.3 Android模拟器 2.3.1 创建AVD 2.3.2 开发环境测试 2.3.3 模拟器的使用 2.4 SDK中的常用命令 2.4.1 adb命令 2.4.2 Android命令 2.5 小结 练习 第3章 Android应用程序框架 3.1 第一个Android...

    debdroid:适用于 Android 设备的 Linux Chroot 守护程序

    ##Linux Chroot Daemon for Android ##Supports Android 2.3 到 5.0 #Overview:Debdroid 是 Android 平台的工具,它作为守护程序运行完整的 Linux 发行版。 任何有 root 权限的设备都可以运行完全受支持的 ARM ...

    2010年谢彦的android笔记

    1.6 编译在N1上运行的android 2.3(GingerBread)代码 18 1.7 系统结构 21 1.8 模拟器调试与真机调试 22 1.9 安装和卸载应用程序(apk包) 23 1.10 系统升级 26 1.11 android系统支持app2sd(修改boot.img) 27 2 基本...

    安机网一键ROOT 2.0

    安机网一键ROOT工具,支持所有Android2.1以及Android2.3手机系统,真正实现一键轻松获取root权限!

    Android系统源代码情景分析-罗升阳-源码

    2.3.4 处理硬件设备访问权限问题 2.4 开发Android硬件访问服务 2.4.1 定义硬件访问服务接口 2.4.2 实现硬件访问服务 2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序来使用...

    精通ANDROID 3(中文版)1/2

    2.3 Hello World!  2.4 AVD  2.5 剖析Android应用程序的结构  2.6 分析Notepad应用程序  2.6.1 加载和运行Notepad应用程序  2.6.2 分解应用程序  2.7 了解应用程序生命周期  2.8 调试应用程序  ...

    疯狂Android讲义源码

     1.5.5 应用程序权限说明 29  1.6 Android应用的基本组件  介绍 31  1.6.1 Activity和View 31  1.6.2 Service 32  1.6.3 BroadcastReceiver 32  1.6.4 ContentProvider 32  1.6.5 Intent和IntentFilter 33 ...

Global site tag (gtag.js) - Google Analytics