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

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

概述常用的给应用开放系统权限的方法是直接将该应用做成系统应用(即在AndroidManifest.xml文件里加上:android:sharedUserId=\"android.uid.system\"),但是这种做法限制了应用本身的自由,也就是说经过系统签名后的系

常用的给应用开放系统权限的方法是直接将该应用做成系统应用(即在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 hostingnameStr,String[] entryPointArgs)里面将应用的gID也改为0:  private final voID startProcessLocked(ProcessRecord app,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,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系统通过包名给应用开放系统权限的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言!

总结

以上是内存溢出为你收集整理的Android5.1系统通过包名给应用开放系统权限的方法全部内容,希望文章能够帮你解决Android5.1系统通过包名给应用开放系统权限的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1143823.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存