文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android5.1系统如何通过包名给应用开放系统权限

2023-05-30 17:31

关注

这篇文章主要介绍了Android5.1系统如何通过包名给应用开放系统权限,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

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

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

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

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

net.forclass.fcstudent

com.ckl.launcher

com.creative.fcstudent

修改步骤:

应用安装在设备上之后,点击启动必定会调用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);    }  }

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;            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系统如何通过包名给应用开放系统权限”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯