久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當前位置:首頁>職場>阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)

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

導讀面試難度還行,但是如果不好好復習,有幾個點還真是答不上來。uid機制uid:Android系統(tǒng)中uid用于標識一個應用程序,uid在應用安裝時被分配,并且在....

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(1)

面試難度還行,但是如果不好好復習,有幾個點還真是答不上來。

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"); }}

// 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; }

3. 查看應用UID 的幾種方式
  • 方法1: ps 命令計算

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(2)

這個 u0_a106 就表示該應用是 user 0(主用戶)下面的應用,id是 106,前面說過 普通應用程序的UID 都是從 10000開始的,所以 最終計算出的 UID 就是 10106

多用戶情況下的 UID 計算類似:

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(3)

可以看到 工作用戶的 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 查看

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(4)

第2列 的 10854 就是 com.tencent.mm進程當前的PID號,然后執(zhí)行cat proc/pid號/status

就會得到一大串數(shù)據(jù),里面就包含了UID的信息.

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(5)

  • 方法3: 如果手機有root權(quán)限的話,可以導出 data/system/packages.list 文件, 里面可以看到所有應用的包名及對應的 UID
  • 方法4:通過代碼拿到應用的 ApplicationInfo的實例,applicationInfo.uid,參考第4節(jié)
4. 通過uid獲取包名,通過包名獲取uid
  • 通過包名獲取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);

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(6)

我是如何輕松應對面試官刁鉆連問?

唯一的辦法就是:面試前準備充分!!!

有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什么東西。

一些基礎(chǔ)知識和理論肯定是要背的,要理解的背,用自己的語言總結(jié)一下背下來。

但是不管怎么樣,不論是什么樣的大小面試,要想不被面試官虐的不要不要的,只有刷爆面試題做好全面的準備,當然除了這個還需要在平時把自己的基礎(chǔ)打扎實,這樣不論面試官怎么樣一個知識點里往死里鑿,你也能應付如流啊~

那么該如何復習?

我為大家準備了以下一體系的復習資料:

《Android開發(fā)七大模塊核心知識筆記》

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(7)

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(8)

《960全網(wǎng)最全Android開發(fā)筆記》

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(9)

《379頁Android開發(fā)面試寶典》

歷時半年,我們整理了這份市面上最全面的安卓面試題解析大全包含了騰訊、百度、小米、阿里、樂視、美團、58、獵豹、360、新浪、搜狐等一線互聯(lián)網(wǎng)公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術(shù)面試的幾率。

如何使用它?

1.可以通過目錄索引直接翻看需要的知識點,查漏補缺。2.五角星數(shù)表示面試問到的頻率,代表重要推薦指數(shù)

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(10)

《507頁Android開發(fā)相關(guān)源碼解析》

只要是程序員,不管是Java還是Android,如果不去閱讀源碼,只看API文檔,那就只是停留于皮毛,這對我們知識體系的建立和完備以及實戰(zhàn)技術(shù)的提升都是不利的。

真正最能鍛煉能力的便是直接去閱讀源碼,不僅限于閱讀各大系統(tǒng)源碼,還包括各種優(yōu)秀的開源庫。

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(11)

資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖;

需要的朋友,直接轉(zhuǎn)發(fā) 點贊 私信回復【資料】一鍵領(lǐng)取!!!

阿里面試題設(shè)計一個任務(wù)調(diào)度系統(tǒng)(阿里面試官刁鉆連問)(12)

歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-220784.html

Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖