来自阿里面试官刁钻连问:Android-UID的分配、查看及相关知识

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

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开发相关源码解析》

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

这里我希望可以帮助到大家提升进阶。

内容包含:Android学习PDF+架构视频+面试文档+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。

喜欢本文的话,不妨给我点个小赞、评论区留言或者转发支持一下呗~

img

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

b2FkX2ltYWdlcy8yMjQzNjc0MC01OTA0Mjg2Yjk1ZjRkYmEw?x-oss-process=image/format,png)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一篇经验分享,我将分享我参加复旦和人大计算机保研夏令营的英语面试回忆。 复旦计算机保研夏令营英语面试回忆: 面试时间:2019年6月 面试官:一位年轻的女教授 面试内容: 1. 自我介绍 2. 介绍一下你的科研项目 3. 你觉得计算机科学最有趣的方向是什么,为什么? 4. 你觉得计算机科学对社会的影响是什么? 5. 你的职业规划是什么? 6. 如果你有机会去学习一门新技术,你会选择学习什么? 7. 你有什么问题想问我们? 面试感受: 整个面试过程比较轻松,面试官也很友好。自我介绍后,面试官就开始问我关于科研项目的问题,需要我详细介绍。之后是一些关于计算机科学的普遍问题,需要我表达自己的观点。最后面试官还让我自由发挥,问我有什么问题想问他们。我询问了一些有关复旦计算机专业的问题,面试官都耐心回答了我的问题。整个面试过程持续了大约20分钟。 人大计算机保研夏令营英语面试回忆: 面试时间:2019年6月 面试官:一位年轻的男博士 面试内容: 1. 自我介绍 2. 你有什么计算机科学的项目经验吗? 3. 你觉得计算机科学最有趣的方向是什么,为什么? 4. 你觉得计算机科学对社会的影响是什么? 5. 你的职业规划是什么? 6. 你有什么问题想问我们? 面试感受: 整个面试过程比较严肃,面试官也比较严肃。自我介绍后,面试官就开始问我关于项目经验的问题,并要求我详细介绍。之后是一些关于计算机科学的普遍问题,需要我表达自己的观点。最后面试官还让我自由发挥,问我有什么问题想问他们。我询问了一些有关人大计算机专业的问题,面试官都耐心回答了我的问题。整个面试过程持续了大约30分钟。 总的来说,这两个夏令营的英语面试都比较正常,没有出现特别刁钻的问题。只要你对自己的项目经验和职业规划有清晰的认识,并且对计算机科学有一定的了解,应该不会遇到太大的困难。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值