国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android5.1系統(tǒng)通過包名給應(yīng)用開放系統(tǒng)權(quán)限的方法

2019-12-12 01:42:57
字體:
供稿:網(wǎng)友

常用的給應(yīng)用開放系統(tǒng)權(quán)限的方法是直接將該應(yīng)用做成系統(tǒng)應(yīng)用(即在AndroidManifest.xml文件里加上:android:sharedUserId="android.uid.system"),但是這種做法限制了應(yīng)用本身的自由,也就是說經(jīng)過系統(tǒng)簽名后的系統(tǒng)應(yīng)用只能夠在對(duì)應(yīng)的Android平臺(tái)上安裝使用,無法向其他應(yīng)用一樣放到Android市場里兼容所有的Android設(shè)備。

    現(xiàn)在此介紹一種通過修改Android平臺(tái)系統(tǒng)層代碼,根據(jù)指定的應(yīng)用包名給對(duì)應(yīng)的應(yīng)用在該平臺(tái)上開放系統(tǒng)權(quán)限,這樣既不應(yīng)用應(yīng)用的兼容性,又解決了應(yīng)用想調(diào)用一些系統(tǒng)層接口而沒有權(quán)限的矛盾。

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

需要開放系統(tǒng)權(quán)限的包名:

1、net.forclass.fcstudent

2、com.ckl.launcher

3、com.creative.fcstudent

修改步驟:

1、應(yīng)用安裝在設(shè)備上之后,點(diǎn)擊啟動(dòng)必定會(huì)調(diào)用ActivityManagerService的startProcessLocked接口來開啟一個(gè)新的進(jìn)程,而給應(yīng)用開放系統(tǒng)權(quán)限目的其實(shí)就是使應(yīng)用能夠成為超級(jí)應(yīng)用,運(yùn)行在系統(tǒng)進(jìn)程中,這樣我們只需要在startProcessLocked接口里面將應(yīng)用的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( // 再次調(diào)用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)里面將應(yīng)用的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"); // 設(shè)置一個(gè)系統(tǒng)屬性,在Zygote進(jìn)行判斷是否拋出異常          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)接口會(huì)對(duì)進(jìn)程id進(jìn)行判斷,如果小于Process.SYSTEM_UID(1000)則認(rèn)為是非法,而zygote是具有root權(quán)限的唯一server,所有在判斷之后就可以通過讀取前面設(shè)定的系統(tǒng)屬性“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");      }    }    ...... // 此處省略好多行  }

總結(jié)

以上所述是小編給大家介紹的Android5.1系統(tǒng)通過包名給應(yīng)用開放系統(tǒng)權(quán)限的方法,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桦南县| 林西县| 衢州市| 皋兰县| 武胜县| 蒙自县| 达拉特旗| 当阳市| 松滋市| 黑龙江省| 涿州市| 舞阳县| 玉门市| 玉山县| 论坛| 德清县| 蒲江县| 库伦旗| 阿图什市| 乌拉特中旗| 泗水县| 阳信县| 秀山| 房产| 米泉市| 东辽县| 江川县| 合作市| 石首市| 偏关县| 东乡县| 晋中市| 富裕县| 秦皇岛市| 通江县| 沙洋县| 广西| 仪陇县| 阿拉善右旗| 牙克石市| 昆明市|