欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年11月11日 09:26:42   投稿:mrr  
這篇文章主要介紹了Android5.1系統(tǒng)通過包名給應用開放系統(tǒng)權(quán)限的方法,此文介紹一種通過修改Android平臺系統(tǒng)層代碼,根據(jù)指定的應用包名給對應的應用在該平臺上開放系統(tǒng)權(quán)限,需要的朋友可以參考下

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

    現(xiàn)在此介紹一種通過修改Android平臺系統(tǒng)層代碼,根據(jù)指定的應用包名給對應的應用在該平臺上開放系統(tǒng)權(quán)限,這樣既不應用應用的兼容性,又解決了應用想調(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、應用安裝在設備上之后,點擊啟動必定會調(diào)用ActivityManagerService的startProcessLocked接口來開啟一個新的進程,而給應用開放系統(tǒng)權(quán)限目的其實就是使應用能夠成為超級應用,運行在系統(tǒng)進程中,這樣我們只需要在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( // 再次調(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)里面將應用的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"); // 設置一個系統(tǒng)屬性,在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權(quán)限的唯一server,所有在判斷之后就可以通過讀取前面設定的系統(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)通過包名給應用開放系統(tǒng)權(quán)限的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言!

相關(guān)文章

  • Android獲取wifi列表的方法

    Android獲取wifi列表的方法

    這篇文章主要為大家詳細介紹了Android獲取wifi列表的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android線程的優(yōu)先級設置方法技巧

    Android線程的優(yōu)先級設置方法技巧

    對于Android平臺上的線程優(yōu)先級設置來說可以處理很多并發(fā)線程的阻塞問題,比如很多無關(guān)緊要的線程會占用大量的CPU時間,雖然通過了MultiThread來解決慢速I/O但是合理分配優(yōu)先級對于并發(fā)編程來說十分重要
    2016-02-02
  • Android實現(xiàn)按鈕點擊效果

    Android實現(xiàn)按鈕點擊效果

    本文主要介紹了Android實現(xiàn)按鈕點擊效果:第一次點擊變色,第二次恢復。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Kotlin中協(xié)程的創(chuàng)建過程詳析

    Kotlin中協(xié)程的創(chuàng)建過程詳析

    使用協(xié)程的專業(yè)開發(fā)者中有超過 50% 的人反映使用協(xié)程提高了工作效率,下面這篇文章主要給大家介紹了關(guān)于Kotlin中協(xié)程創(chuàng)建過程的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Android 設置顏色的方法總結(jié)

    Android 設置顏色的方法總結(jié)

    這篇文章主要介紹了Android 設置顏色的方法總結(jié)的相關(guān)資料,希望通過本文能幫助到大家,讓大家掌握設置顏色的方法,需要的朋友可以參考下
    2017-09-09
  • Android getSystemService用法實例總結(jié)

    Android getSystemService用法實例總結(jié)

    這篇文章主要介紹了Android getSystemService用法,結(jié)合實例形式總結(jié)分析了getSystemService獲取系統(tǒng)Service的相關(guān)使用方法與注意事項,需要的朋友可以參考下
    2016-01-01
  • Android view自定義帶文字帶進度的控件

    Android view自定義帶文字帶進度的控件

    這篇文章主要為大家詳細介紹了Android view自定義帶文字帶進度的控件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android?Activity共享元素動畫示例解析

    Android?Activity共享元素動畫示例解析

    這篇文章主要為大家介紹了Android?Activity共享元素動畫示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Android自定義驗證碼輸入框的方法實例

    Android自定義驗證碼輸入框的方法實例

    這篇文章主要給大家介紹了關(guān)于Android自定義驗證碼輸入框的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友可以參考下
    2022-02-02
  • Android學習教程之下拉刷新實現(xiàn)代碼(11)

    Android學習教程之下拉刷新實現(xiàn)代碼(11)

    這篇文章主要為大家詳細介紹了Android學習教程之下拉刷新實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論