来自阿里面试官刁钻连问:Android UID 的分配、查看及相关知识,大厂 Android 面试总结 + 详细解答
....................
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、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。
最后送给大家一句话,望共勉,永远不要放弃自己的梦想和追求;
评论