背景:
经常在实际的项目开发中经常会分析一些日志里面带有uid的情况,例如如下日志:
12-10 10:39:09.673 4761 4783 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.settings/.Settings bnds=[0,1201][288,1516]} with LAUNCH_MULTIPLE from uid 10108 (BAL_ALLOW_ALLOWLISTED_COMPONENT) result code=2
这里面就有这个from uid 10108,即看到uid = 10108,但是这个uid = 10108到底是谁呢?对我们来说uid = 10108基本上没啥可读性,那么应该怎么把这个uid = 10108对应到相关的可读性包名呢?
下面文章就带大家学习一下怎么从uid映射到包名。
uid映射包名方法
方法1(一般java相关程序都可以,存native不行):
使用命令: adb shell pm list package --uid xxxxx
比如针对上面写的uid = 10108,实战结果如下:
test@test:~$ adb shell pm list package --uid 10108
package:com.android.launcher3 uid:10108
确定出来了这里的uid = 10108对应的进程是com.android.launcher3
看看常见uid =1000(1000一般这个是system,属于一种熟知记忆)
test@test:~$ adb shell pm list package --uid 1000
package:com.android.localtransport uid:1000
package:android uid:1000
package:com.android.dynsystem uid:1000
package:com.dsi.ant.server uid:1000
package:org.lineageos.lineageparts uid:1000
package:com.tencent.soter.soterserver uid:1000
package:com.android.inputdevices uid:1000
package:org.lineageos.settings.doze uid:1000
package:com.android.location.fused uid:1000
package:com.android.settings uid:1000
package:org.lineageos.lineagesettings uid:1000
package:org.lineageos.setupwizard uid:1000
package:lineageos.platform uid:1000
package:com.android.DeviceAsWebcam uid:1000
package:com.android.keychain uid:1000
package:com.android.server.telecom uid:1000
package:com.android.providers.settings uid:1000
package:com.android.wallpaperbackup uid:1000
方法2:
去设备上的/data/system目录进行cat packages.list |grep uid 查看
NX563J:/data/system # cat packages.list | grep 10108
com.android.launcher3 10108 0 /data/user/0/com.android.launcher3 default:privapp:targetSdkVersion=34 none 0 34 1 @system
也可以看到uid= 10108对应的包名就是com.android.launcher3
方法3(计算推导方式):
预先判断uid的值大小,一般普通的apk程序等,uid的值一般大于10000,这种uid大于10000情况确定可以使用直接计算法
如何计算呢?拿uid= 10108举例
10108 - 10000 = 108
那么就用这个108前面加上字符a,即a108去ps -A中进行搜索
test@test:~$ adb shell ps -A | grep a108
u0_a108 5242 4631 15386108 177040 SyS_epoll_wait 0 S com.android.launcher3
可以看到也是得到一样的结果就是com.android.launcher3这个报名
u0_a108 分为两部分,前面u0中的0代表就是userId = 0这个用户,除了0设备还有可能有其他用户比如常见的分身10,后面a108的108就是代表基于10000的累积是108,
所以最后得出的uid就是10000 + 108 = 10108,可以用这种算法相互推出对方
其他native uid直接查表
native程序一般uid都是小于2000的,所以一看到uid在2000以下,就直接在下面表中查询既可以,更加方便
public static final int INVALID_UID = -1;
public static final int SYSTEM_UID = 1000;
public static final int PHONE_UID = 1001;
public static final int SHELL_UID = 2000;
public static final int LOG_UID = 1007;
public static final int WIFI_UID = 1010;
public static final int MEDIA_UID = 1013;
public static final int DRM_UID = 1019;
public static final int VPN_UID = 1016;
public static final int KEYSTORE_UID = 1017;
public static final int CREDSTORE_UID = 1076;
public static final int NFC_UID = 1027;
public static final int CLAT_UID = 1029;
public static final int BLUETOOTH_UID = 1002;
public static final int SHARED_RELRO_UID = 1037;
public static final int AUDIOSERVER_UID = 1041;
public static final int CAMERASERVER_UID = 1047;
public static final int DNS_TETHER_UID = 1052;
public static final int WEBVIEW_ZYGOTE_UID = 1053;
public static final int OTA_UPDATE_UID = 1061;
public static final int STATSD_UID = 1066;
public static final int INCIDENTD_UID = 1067;
public static final int SE_UID = 1068;
public static final int NETWORK_STACK_UID = 1073;
public static final int FSVERITY_CERT_UID = 1075;
public static final int UWB_UID = 1083;
public static final int SDK_SANDBOX_VIRTUAL_UID = 1090;
public static final int NOBODY_UID = 9999;
public static final int FIRST_APPLICATION_UID = 10000;
public static final int LAST_APPLICATION_UID = 19999;
public static final int FIRST_SDK_SANDBOX_UID = 20000;
public static final int LAST_SDK_SANDBOX_UID = 29999;
public static final int FIRST_APP_ZYGOTE_ISOLATED_UID = 90000;
public static final int LAST_APP_ZYGOTE_ISOLATED_UID = 98999;
public static final int FIRST_ISOLATED_UID = 99000;
public static final int LAST_ISOLATED_UID = 99999;
更多framework实战干货,请关注下面“千里马学框架”