Android中的UID和AppId

这篇博客探讨了Android操作系统的UID概念,分析了应用程序的appId分配过程。通过UserHandle.java代码示例和adb shell ps命令的输出,揭示了UID的结构,其中userId和appId的区分。讲解了在同一设备不同用户下,进程的appId保持不变,仅userId发生变化。此外,文章还跟踪了Android 8.0中appId的分配流程,涉及PKMS和Settings.java的相关函数。
摘要由CSDN通过智能技术生成

本篇博客主要记录一下Android中UID的含义,并简单分析应用appId的分配流程。


1、UID
Android是支持多用户的操作系统,其中进程对应的UID由用户ID和应用ID共同决定。
我们来看看UserHandle.java的代码:

    public static int getUid(@UserIdInt int userId, @AppIdInt int appId) {
        //支持多用户时
        if (MU_ENABLED) {
            //userId * 100000 + (appId % 100000)
            return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);
        } else {
            return appId;
        }
    }

在android手机上,我们利用adb shell执行ps命令后,可以看到如下信息:

从图中可以看出,其中第一项将显示进程对应的UID。
这里截取的两个进程为root组的,没有分配具体的编号。


对于用户组的进程来说,如上图所示,会显示类似于u0_a86这样的UID。

Android手机可以通过使用移动端一键登录SDK实现手机号一键登录。以下是一些常见的移动端一键登录SDK: 1. 云片移动端一键登录SDK ```java // 初始化 CloudAuth.init(context, appid, appkey); // 请求授权页 CloudAuth.requestToken(activity, new CloudAuthCallback() { @Override public void onComplete(CloudAuthUser user) { // 登录成功,获取用户信息 String phone = user.getPhone(); String uid = user.getUid(); String token = user.getToken(); // TODO: 处理用户信息 } @Override public void onError(CloudAuthException e) { // 登录失败,处理异常 } @Override public void onCancel() { // 取消登录 } }); ``` 2. Mob移动端一键登录SDK ```java // 初始化 MobSDK.init(context, appkey, appsecret); // 请求授权页 OnekeyLoginManager.getInstance().setAuthThemeConfig(new AuthThemeConfig.Builder() .setStatusBarColor(Color.parseColor("#FFFFFF")) .setNavColor(Color.parseColor("#FFFFFF")) .setNavText("一键登录") .setNavTextColor(Color.parseColor("#333333")) .setLogoImgPath("logo.png") .setLogoWidth(100) .setLogoHeight(100) .setLogoOffsetY(50) .setLogoOffsetX(0) .setLogoHidden(false) .setSloganHidden(false) .setSloganText("一键登录,畅享无限") .setSloganTextColor(Color.parseColor("#666666")) .setSloganOffsetY(180) .setSloganOffsetX(0) .setNumberColor(Color.parseColor("#333333")) .setNumberSize(18) .setNumberOffsetY(230) .setNumberOffsetX(0) .setSwitchText("其他方式登录") .setSwitchTextColor(Color.parseColor("#666666")) .setSwitchOffsetY(280) .setSwitchOffsetX(0) .setLogBtnText("本机号码一键登录") .setLogBtnTextColor(Color.parseColor("#FFFFFF")) .setLogBtnImgPath("login_btn_bg.png") .setLogBtnWidth(300) .setLogBtnHeight(50) .setLogBtnOffsetY(350) .setLogBtnOffsetX(0) .setPrivacyState(true) .setPrivacyOffsetY(420) .setPrivacyOffsetX(0) .setPrivacyText("登录即同意《用户协议》和《隐私政策》") .setPrivacyTextColor(Color.parseColor("#666666")) .setPrivacyProtocol("https://www.mob.com/about/policy") .setPrivacyProtocolColor(Color.parseColor("#666666")) .setPrivacyProtocol2("https://www.mob.com/about/terms") .setPrivacyProtocol2Color(Color.parseColor("#666666")) .setPrivacyWithBookTitleMark(false) .setPrivacyCheckboxHidden(false) .setPrivacyCheckboxSize(16) .setPrivacyCheckboxOffsetY(420) .setPrivacyCheckboxOffsetX(0) .setPrivacyCheckboxResId(R.drawable.mob_auth_privacy_checkbox_selector) .setPrivacyCheckboxDefaultState(true) .setPrivacyProtocolHighlightColor(Color.parseColor("#FF4081")) .setPrivacyProtocol2HighlightColor(Color.parseColor("#FF4081")) .build()); OnekeyLoginManager.getInstance().setAuthListener(new OneKeyLoginCallback() { @Override public void onLogin(String phone, String token) { // 登录成功,获取用户信息 String uid = OnekeyLoginManager.getInstance().getUid(); // TODO: 处理用户信息 } @Override public void onError(String errorMsg) { // 登录失败,处理异常 } @Override public void onCancel() { // 取消登录 } }); OnekeyLoginManager.getInstance().login(); ``` 3. 一键登录SDK ```java // 初始化 OneKeyLogin.getInstance().init(context, appid, appkey); // 请求授权页 OneKeyLogin.getInstance().requestToken(activity, new OneKeyLoginCallback() { @Override public void onLogin(String phone, String token) { // 登录成功,获取用户信息 String uid = OneKeyLogin.getInstance().getUid(); // TODO: 处理用户信息 } @Override public void onError(String errorMsg) { // 登录失败,处理异常 } @Override public void onCancel() { // 取消登录 } }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值