4

pid(int)は、プロセスの一意の識別子である、作成時にosシステムによってプロセスに割り当てられることを知っています。uid(int)は、ユーザー(またはAndroidのアプリ)のunqiue識別子です。

  • Q1:uidが作成され、アプリに割り当てられるのはいつですか?
  • Q2:AndroidManifest.xmlのの属性または他の属性と関係がありますか?shareUerIdは通常、システムuserIdなどです。明らかに、sharedUserIdは文字列です。
  • Q3:システムuid(int)とshareUserId(string)の間のマップはどこにありますか?フレームワーク\base\ core \ java \ android \ osにUserId.javaがあります。ご覧のとおり、メソッドgetUid(int userId、int appId)はuserIdとappIdからuidを取得できます。
  • Q4:ここでのuserIdとappIdは何ですか?

    public static final int getCallingUserId(){return getUserId(Binder.getCallingUid()); 上記のコードから、IPCの場合、バインダーはUserIdではなくuidを使用すると結論付けることができます。その場合、UserIdの機能は何ですか。

ここにはたくさんの質問があります!AndroidのIPCを理解するには、これらすべてが重要だと思います。誰でも私の質問に答えることができますか?すべての答えを1つずつリストすることをお勧めします。よろしくお願いします!

public final class UserId {

     /**
     * Range of IDs allocated for a user.
     *
     * @hide
     */
    public static final int PER_USER_RANGE = 100000;

    public static final int USER_ALL = -1;

    /**
     * Enable multi-user related side effects. Set this to false if there are problems with single
     * user usecases.
     * */
    public static final boolean MU_ENABLED = true;

    /**
     * Checks to see if the user id is the same for the two uids, i.e., they belong to the same
     * user.
     * @hide
     */
    public static final boolean isSameUser(int uid1, int uid2) {
        return getUserId(uid1) == getUserId(uid2);
    }

    /**
     * Checks to see if both uids are referring to the same app id, ignoring the user id part of the
     * uids.
     * @param uid1 uid to compare
     * @param uid2 other uid to compare
     * @return whether the appId is the same for both uids
     * @hide
     */
    public static final boolean isSameApp(int uid1, int uid2) {
        return getAppId(uid1) == getAppId(uid2);
    }

    public static final boolean isIsolated(int uid) {
        uid = getAppId(uid);
        return uid >= Process.FIRST_ISOLATED_UID && uid <= Process.LAST_ISOLATED_UID;
    }

    public static boolean isApp(int uid) {
        if (uid > 0) {
            uid = UserId.getAppId(uid);
            return uid >= Process.FIRST_APPLICATION_UID && uid <= Process.LAST_APPLICATION_UID;
        } else {
            return false;
        }
    }

    /**
     * Returns the user id for a given uid.
     * @hide
     */
    public static final int getUserId(int uid) {
        if (MU_ENABLED) {
            return uid / PER_USER_RANGE;
        } else {
            return 0;
        }
    }

    public static final int getCallingUserId() {
        return getUserId(Binder.getCallingUid());
    }

    /**
     * Returns the uid that is composed from the userId and the appId.
     * @hide
     */
    public static final int getUid(int userId, int appId) {
        if (MU_ENABLED) {
            return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);
        } else {
            return appId;
        }
    }

    /**
     * Returns the app id (or base uid) for a given uid, stripping out the user id from it.
     * @hide
     */
    public static final int getAppId(int uid) {
        return uid % PER_USER_RANGE;
    }

    /**
     * Returns the user id of the current process
     * @return user id of the current process
     */
    public static final int myUserId() {
        return getUserId(Process.myUid());
    }
4

0 に答える 0