安卓application_阿里面试官刁钻连问:安卓 UID的分配、查看及相关知识
面試難度還行,但是如果不好好復習,有幾個點還真是答不上來。
uid機制
uid:Android系統中uid用于標識一個應用程序,uid在應用安裝時被分配,并且在應用存在于手機上期間,都不會改變。一個應用程序只能有一個uid,多個應用可以使用sharedUserId 方式共享同一個uid,前提是這些應用的簽名要相同。
- uid pid gid gids 的含義和作用
- uid 的分配
- 查看應用UID 的幾種方式
- 通過uid獲取包名,通過包名獲取uid
下面所有涉及的示例代碼都是基于 Android 8.1的。
1. uid pid gid gids 的含義和作用
- uid:android中uid用于標識一個應用程序,uid在應用安裝時被分配,并且在應用存在于手機上期間,都不會改變。一個應用程序只能有一個uid,多個應用可以使用sharedUserId 方式共享同一個uid,前提是這些應用的簽名要相同。
- pid:進程ID,可變的
- gid:對應于linux中用戶組的概念,android 中 gid 等于uid
- gids:個GIDS相當于一個權限的集合,一個UID可以關聯GIDS,表明該UID擁有多種權限
一個進程就是host應用程序的沙箱,里面一般有一個UID和多個GIDS,每個進程只能訪問UID的權限范圍內的文件和GIDs所允許訪問的接口,構成了Android最基本的安全基礎。
2. UID 的分配:
app 的 UID 和 GID 是安裝的時候就確認的, 關鍵的代碼如下:
PMS中:
frameworksbaseservicescorejavacomandroidserverpmSettings.java:
/** * Registers a user ID with the system. Potentially allocates a new user ID. * @throws PackageManagerException If a user ID could not be allocated. */void addUserToSettingLPw(PackageSetting p) throws PackageManagerException { if (p.appId == 0) { // Assign new user ID p.appId = newUserIdLPw(p); } else { // Add new setting to list of user IDs addUserIdLPw(p.appId, p, p.name); } if (p.appId < 0) { PackageManagerService.reportSettingsProblem(Log.WARN, "Package " + p.name + " could not be assigned a valid UID"); throw new PackageManagerException(INSTALL_FAILED_INSUFFICIENT_STORAGE, "Package " + p.name + " could not be assigned a valid UID"); }} // uid 的分配 // Returns -1 if we could not find an available UserId to assign private int newUserIdLPw(Object obj) { // Let's be stupidly inefficient for now... final int N = mUserIds.size(); //從0開始,找到第一個未使用的ID,此處對應之前有應用被移除的情況,復用之前的ID for (int i = mFirstAvailableUid; i < N; i++) { if (mUserIds.get(i) == null) { mUserIds.set(i, obj); return Process.FIRST_APPLICATION_UID + i; } } //最多只能安裝 9999 個應用 // None left? if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) { return -1; } mUserIds.add(obj); // 可以解釋為什么普通應用的UID 都是從 10000開始的 return Process.FIRST_APPLICATION_UID + N; }3. 查看應用UID 的幾種方式
- 方法1: ps 命令計算
這個 u0_a106 就表示該應用是 user 0(主用戶)下面的應用,id是 106,前面說過 普通應用程序的UID 都是從 10000開始的,所以 最終計算出的 UID 就是 10106
多用戶情況下的 UID 計算類似:
可以看到 工作用戶的 userID 是 14,后面是一樣的。計算方式是:
/** * Returns the uid that is composed from the userId and the appId. * @hide */ public static int getUid(@UserIdInt int userId, @AppIdInt int appId) { if (MU_ENABLED) {//是否支持多用戶 //PER_USER_RANGE 為 100000 return userId * PER_USER_RANGE + (appId % PER_USER_RANGE); } else { return appId; } }所以最后 工作空間內應用的 UID 是 100000 * 14 + 10106 = 1410106
- 方法2: 通過 pid 查看
第2列 的 10854 就是 com.tencent.mm進程當前的PID號,然后執行
cat proc/pid號/status
就會得到一大串數據,里面就包含了UID的信息.
- 方法3: 如果手機有root權限的話,可以導出 data/system/packages.list 文件, 里面可以看到所有應用的包名及對應的 UID
- 方法4:通過代碼拿到應用的 ApplicationInfo的實例,applicationInfo.uid,參考第4節
4. 通過uid獲取包名,通過包名獲取uid
- 通過包名獲取UID
- 通過 UID 獲取包名
我是如何輕松應對面試官刁鉆連問?
唯一的辦法就是:面試前準備充分!!!
有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什么東西。
一些基礎知識和理論肯定是要背的,要理解的背,用自己的語言總結一下背下來。
但是不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題做好全面的準備,當然除了這個還需要在平時把自己的基礎打扎實,這樣不論面試官怎么樣一個知識點里往死里鑿,你也能應付如流啊~
那么該如何復習?
我為大家準備了以下一體系的復習資料:
《Android開發七大模塊核心知識筆記》
《960全網最全Android開發筆記》
《379頁Android開發面試寶典》
歷時半年,我們整理了這份市面上最全面的安卓面試題解析大全
包含了騰訊、百度、小米、阿里、樂視、美團、58、獵豹、360、新浪、搜狐等一線互聯網公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的幾率。
如何使用它?
1.可以通過目錄索引直接翻看需要的知識點,查漏補缺。
2.五角星數表示面試問到的頻率,代表重要推薦指數
《507頁Android開發相關源碼解析》
只要是程序員,不管是Java還是Android,如果不去閱讀源碼,只看API文檔,那就只是停留于皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。
真正最能鍛煉能力的便是直接去閱讀源碼,不僅限于閱讀各大系統源碼,還包括各種優秀的開源庫。
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖;
需要的朋友,直接轉發+點贊+私信回復【資料】一鍵領取!!!
總結
以上是生活随笔為你收集整理的安卓application_阿里面试官刁钻连问:安卓 UID的分配、查看及相关知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python百度网盘_百度网盘突然大调整
- 下一篇: 薜荔藤的功效与作用、禁忌和食用方法