写点什么

来自阿里面试官刁钻连问:Android UID 的分配、查看及相关知识,大厂 Android 面试总结 + 详细解答

作者:嘟嘟侠客
  • 2021 年 11 月 28 日
  • 本文字数:2338 字

    阅读完需:约 8 分钟

....................


return pkg;


}


frameworks\base\services\core\java\com\android\server\pm\Settings.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,此处对


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


应之前有应用被移除的情况,复用之前的 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


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 机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。


一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。


但是不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~


那么该如何复习?


我为大家准备了以下一体系的复习资料:


《Android 开发七大模块核心知识笔记》



《960 全网最全 Android 开发笔记》



《379 页 Android 开发面试宝典》


历时半年,我们整理了这份市面上最全面的安卓面试题解析大全


包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。


如何使用它?


1.可以通过目录索引直接翻看需要的知识点,查漏补缺。


2.五角星数表示面试问到的频率,代表重要推荐指数


《507 页 Android 开发相关源码解析》


只要是程序员,不管是 Java 还是 Android,如果不去阅读源码,只看 API 文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。


真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

最后

一线互联网 Android 面试题含详解(初级到高级专题)


这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率



如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。


最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
来自阿里面试官刁钻连问:Android UID的分配、查看及相关知识,大厂Android面试总结+详细解答