發(fā)布時間:2024-01-24閱讀(14)

面試難度還行,但是如果不好好復習,有幾個點還真是答不上來。
uid機制uid:Android系統(tǒng)中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相當于一個權(quán)限的集合,一個UID可以關(guān)聯(lián)GIDS,表明該UID擁有多種權(quán)限
一個進程就是host應用程序的沙箱,里面一般有一個UID和多個GIDS,每個進程只能訪問UID的權(quán)限范圍內(nèi)的文件和GIDs所允許訪問的接口,構(gòu)成了Android最基本的安全基礎(chǔ)。
2. UID 的分配:app 的 UID 和 GID 是安裝的時候就確認的, 關(guān)鍵的代碼如下:PMS中:
private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg, final int policyFlags, final int scanFlags, long currentTime, @Nullable UserHandle user) throws PackageManagerException { if (DEBUG_PACKAGE_SCANNING) { if ((policyFlags & PackageParser.PARSE_CHATTY) != 0) Log.d(TAG, "Scanning package " pkg.packageName); } applyPolicy(pkg, policyFlags); ..................................... if (pkgSetting == null) { ....................... // SIDE EFFECTS; updates system state; move elsewhere if (origPackage != null) { mSettings.addRenamedPackageLPw(pkg.packageName, origPackage.name); } //主要是這句, PMS 維護著 mSettings 這個數(shù)據(jù)結(jié)構(gòu),里面存儲著所有應用的安裝信息 mSettings.addUserToSettingLPw(pkgSetting); } else { // REMOVE SharedUserSetting from method; update in a separate call. // // TODO(narayan): This update is bogus. nativeLibraryDir & primaryCpuAbi, // secondaryCpuAbi are not known at this point so we always update them // to null here, only to reset them at a later point. Settings.updatePackageSetting(pkgSetting, disabledPkgSetting, suid, destCodeFile, pkg.applicationInfo.nativeLibraryDir, pkg.applicationInfo.primaryCpuAbi, pkg.applicationInfo.secondaryCpuAbi, pkg.applicationInfo.flags, pkg.applicationInfo.privateFlags, pkg.getChildPackageNames(), UserManagerService.getInstance(), usesStaticLibraries, pkg.usesStaticLibrariesVersions); } .................... return pkg;}frameworksaseservicescorejavacomandroidserverpmSettings.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"); }}3. 查看應用UID 的幾種方式
// uid 的分配 // Returns -1 if we could not find an available UserId to assign private int newUserIdLPw(Object obj) { // Lets 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; }
- 方法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; } }所以最后 工作空間內(nèi)應用的 UID 是 100000 * 14 10106 = 1410106
- 方法2: 通過 pid 查看
第2列 的 10854 就是 com.tencent.mm進程當前的PID號,然后執(zhí)行cat proc/pid號/status
就會得到一大串數(shù)據(jù),里面就包含了UID的信息.
4. 通過uid獲取包名,通過包名獲取uid
- 方法3: 如果手機有root權(quán)限的話,可以導出 data/system/packages.list 文件, 里面可以看到所有應用的包名及對應的 UID
- 方法4:通過代碼拿到應用的 ApplicationInfo的實例,applicationInfo.uid,參考第4節(jié)
- 通過包名獲取UID
PackageManager mPm = getPackageManager(); try { ApplicationInfo applicationInfo = mPm.getApplicationInfo("com.tencent.mm", 0); int uid = applicationInfo.uid; Toast.makeText(MainActivity.this, "" uid, Toast.LENGTH_SHORT).show(); }catch (Exception e){ e.printStackTrace(); }
- 通過 UID 獲取包名
String packagename = getPackageManager().getNameForUid(uid);我是如何輕松應對面試官刁鉆連問?
唯一的辦法就是:面試前準備充分!!!
有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什么東西。
一些基礎(chǔ)知識和理論肯定是要背的,要理解的背,用自己的語言總結(jié)一下背下來。
但是不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題做好全面的準備,當然除了這個還需要在平時把自己的基礎(chǔ)打扎實,這樣不論面試官怎么樣一個知識點里往死里鑿,你也能應付如流啊~
那么該如何復習?我為大家準備了以下一體系的復習資料:
《Android開發(fā)七大模塊核心知識筆記》
《960全網(wǎng)最全Android開發(fā)筆記》
《379頁Android開發(fā)面試寶典》
歷時半年,我們整理了這份市面上最全面的安卓面試題解析大全包含了騰訊、百度、小米、阿里、樂視、美團、58、獵豹、360、新浪、搜狐等一線互聯(lián)網(wǎng)公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術(shù)面試的幾率。
如何使用它?
1.可以通過目錄索引直接翻看需要的知識點,查漏補缺。2.五角星數(shù)表示面試問到的頻率,代表重要推薦指數(shù)
《507頁Android開發(fā)相關(guān)源碼解析》
只要是程序員,不管是Java還是Android,如果不去閱讀源碼,只看API文檔,那就只是停留于皮毛,這對我們知識體系的建立和完備以及實戰(zhàn)技術(shù)的提升都是不利的。
真正最能鍛煉能力的便是直接去閱讀源碼,不僅限于閱讀各大系統(tǒng)源碼,還包括各種優(yōu)秀的開源庫。
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖;
需要的朋友,直接轉(zhuǎn)發(fā) 點贊 私信回復【資料】一鍵領(lǐng)取!!!
歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-220784.html
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖