Android5.1系统通过包名给应用开放系统权限的方法

常用的给应用开放系统权限的方法是直接将该应用做成系统应用(即在AndroidManifest.xml文件里加上:android:sharedUserId="android.uid.system"),但是这种做法限制了应用本身的自由,也就是说经过系统签名后的系统应用只能够在对应的Android平台上安装使用,无法向其他应用一样放到Android市场里兼容所有的Android设备。

现在此介绍一种通过修改Android平台系统层代码,根据指定的应用包名给对应的应用在该平台上开放系统权限,这样既不应用应用的兼容性,又解决了应用想调用一些系统层接口而没有权限的矛盾。

该方法的核心是:在ActivityManagerService的startProcessLocked接口中把uid和gid都改为0.

需要开放系统权限的包名:

1、net.forclass.fcstudent

2、com.ckl.launcher

3、com.creative.fcstudent

修改步骤:

1、应用安装在设备上之后,点击启动必定会调用ActivityManagerService的startProcessLocked接口来开启一个新的进程,而给应用开放系统权限目的其实就是使应用能够成为超级应用,运行在系统进程中,这样我们只需要在startProcessLocked接口里面将应用的uid修改为0即可。

ActivityManagerService.java (frameworks\base\services\core\java\com\android\server\am) final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) { // modified by haming patch begin, configure system permission for some special application. if ("net.forclass.fcstudent".equals(info.packageName) || "com.ckl.launcher".equals(info.packageName) || "com.creative.fcstudent".equals(info.packageName) || "com.hampoo.hampoointerfacetestdemo".equals(info.packageName)){ info.uid = 0; } // modified by haming patch end. long startTime = SystemClock.elapsedRealtime(); ProcessRecord app; ...... // 此处省略好多行 checkTime(startTime, "startProcess: stepping in to startProcess"); startProcessLocked( // 再次调用startProcessLocked重载方法 app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs); checkTime(startTime, "startProcess: done starting proc!"); return (app.pid != 0) ? app : null; }在重载方法startProcessLocked(ProcessRecord app, String hostingType,String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs)里面将应用的gid也改为0: private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) { long startTime = SystemClock.elapsedRealtime(); ...... // 此处省略好多行 try { int uid = app.uid; int[] gids = null; int mountExternal = Zygote.MOUNT_EXTERNAL_NONE; if (!app.isolated) { ...... // 此处省略好多行 // modified by haming patch begin, configure system permission for some special application. if ("net.forclass.fcstudent".equals(app.info.packageName) || "com.ckl.launcher".equals(app.info.packageName) || "com.creative.fcstudent".equals(app.info.packageName) || "com.hampoo.hampoointerfacetestdemo".equals(app.info.packageName)){ SystemProperties.set("sys.permission.enable", "true"); // 设置一个系统属性,在Zygote进行判断是否抛出异常 gids[0] = 0; gids[1] = 0; } else { gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid)); gids[1] = UserHandle.getUserGid(UserHandle.getUserId(uid)); } // modified by haming patch end. } ...... // 此处省略好多行 } catch (RuntimeException e) { // XXX do better error recovery. app.setPid(0); mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } Slog.e(TAG, "Failure starting process " + app.processName, e); } }

2、ZygoteConnection.java里的applyUidSecurityPolicy(Arguments args, Credentials peer, String peerSecurityContext)接口会对进程id进行判断,如果小于Process.SYSTEM_UID(1000)则认为是非法,而zygote是具有root权限的唯一server,所有在判断之后就可以通过读取前面设定的系统属性“sys.permission.enable”的值来决定是否抛出异常。

ZygoteConnection.java (frameworks\base\core\java\com\android\internal\os) private static void applyUidSecurityPolicy(Arguments args, Credentials peer, String peerSecurityContext) throws ZygoteSecurityException { int peerUid = peer.getUid(); if (peerUid == 0) { // Root can do what it wants } else if (peerUid == Process.SYSTEM_UID ) { // System UID is restricted, except in factory test mode String factoryTest = SystemProperties.get("ro.factorytest"); boolean uidRestricted; /* In normal operation, SYSTEM_UID can only specify a restricted * set of UIDs. In factory test mode, SYSTEM_UID may specify any uid. */ uidRestricted = !(factoryTest.equals("1") || factoryTest.equals("2")); // modified by haming patch begin, configure system permission for some special application. if (uidRestricted && args.uidSpecified && (args.uid < Process.SYSTEM_UID)) { if (!SystemProperties.getBoolean("sys.permission.enable", false)){ throw new ZygoteSecurityException( "System UID may not launch process with UID < " + Process.SYSTEM_UID); } else { SystemProperties.set("sys.permission.enable", "false"); } } // modified by haming patch end. } else { // Everything else if (args.uidSpecified || args.gidSpecified || args.gids != null) { throw new ZygoteSecurityException( "App UIDs may not specify uid's or gid's"); } } ...... // 此处省略好多行 }

总结

以上所述是小编给大家介绍的Android5.1系统通过包名给应用开放系统权限的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言!

时间: 2024-09-19 03:53:25

Android5.1系统通过包名给应用开放系统权限的方法的相关文章

Win7系统打开扩展名为raw文件的简单方法

  Win7系统打开扩展名为raw文件的简单方法          1.如果没有安装ACDsee这款工具的话,是无法打开raw格式文件的,那么此时我们就要下载安装"ACDsee"文件了; 2.双击打开安装文件,然后按照要求设置,点击"下一步": 3.在随后出现的界面中点击自定义; 4.注意,此时他有捆绑的软件,你可以选择不安装; 5.然后下一步安装成功; 6.注册一个账号,得填入正确的邮箱,接收验证码; 7.到邮箱查看收到的邮件,复制验证码; 8.输入验证码之后验证

Android判断包名和类名是否存在的方法_Android

1.对包名的判断,异常则说明不存在: 复制代码 代码如下: try { PackageManager pm = getPackageManager(); pm.getPackageInfo("com.org", PackageManager.GET_ACTIVITIES); } catch (NameNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace(); } 2.对类名

android检测包名和类名是否存在的方法

1.对包名的判断,异常则说明不存在:  代码如下 复制代码 try { PackageManager pm = getPackageManager(); pm.getPackageInfo("com.org", PackageManager.GET_ACTIVITIES); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } 2.对类名的判断,异常则说

Win10系统修改计算机名、域和工作组的方法

1.在win10桌面找到"此电脑"选中"此电脑"右击再点击"属性",如下图: 计算机名.域和工作组的方法-怎么修改计算机工作组"> 2.在打开系统界面中我们会看到有 计算机名.域和工作组设置,选择"更改设置"细节如下图所示: 3.然后我们找到要修改的组或计算机名点击"更改",如下图: 4.然后在弹出计算机名与域更改窗口我们输入对应的名与选择对应的域再点击修改即可. 5.注意:修改好后,必须重

Android判断包名和类名是否存在的方法

1.对包名的判断,异常则说明不存在: 复制代码 代码如下: try { PackageManager pm = getPackageManager(); pm.getPackageInfo("com.org", PackageManager.GET_ACTIVITIES); } catch (NameNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace(); } 2.对

深度win7系统批量修改文件和文件夹权限的方法

  方法一. 1.通过命令的方式,首先使用管理员用户登录系统,然后打开命令提示符窗口,在命令行程序中输入icacls 命令对文件夹或文件的权限做出修改,并且该命令还支持文件夹或文件权限设置的复原; 示例: icacls c:windows* /save AclFile /T 将 c:windows 及其子目录下所有文件的 ACL 保存到AclFile; icacls file /grant Administrator:(D,WDAC) 将授予用户对文件删除和写入 DAC 的管理员权限; icac

中关村win7系统下获取exe文件的修改权限的方法

  1.首先到网上下载获取文件权限的注册表文件,解压后得到安装"获取文件权限".reg 和 卸载"获取文件权限".reg 两个文件; 2.然后双击安装"获取文件权限".reg ,这样即可完成注册表的修改; 3.接着鼠标右键单击C盘的Windows文件夹,在菜单中找到"获取文件权限"选项,然后稍等一会就完成了对explorer.exe文件的修改了. ps:直接在explorer.exe文件上点击鼠标右键是不会出现"获取

ndk-通过NDK获取手机信息(版本号,sdk版本,包名,屏幕的宽高,系统时间,ip)

问题描述 通过NDK获取手机信息(版本号,sdk版本,包名,屏幕的宽高,系统时间,ip) 5C 通过NDK获取手机信息(版本号,sdk版本,包名,屏幕的宽高,系统时间,ip)求大神解答 解决方案 http://www.2cto.com/kf/201506/407260.htmlhttp://www.xuebuyuan.com/1006760.html

创建独一无二的包名

大家或许已注意到这样一个事实:由于一个包永远不会真的"封装"到单独一个文件里面,它可由多个.class文件构成,所以局面可能稍微有些混乱.为避免这个问题,最合理的一种做法就是将某个特定包使用的所有.class文件都置入单个目录里.也就是说,我们要利用操作系统的分级文件结构避免出现混乱局面.这正是Java所采取的方法. 它同时也解决了另两个问题:创建独一无二的包名以及找出那些可能深藏于目录结构某处的类.正如我们在第2章讲述的那样,为达到这个目的,需要将.class文件的位置路径编码到pa