1. 背景
从桌面(Launcher)里面启动一个app,那么,如何确定这个app是从Launcher上面启动的呢?
2. 日志追查
2.1 START U0
ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.atms.emptydemo/.MainActivity bnds=[811,1611][1063,1893] (has extras) mCallingUid=10193} with LAUNCH_MULTIPLE from uid 10193 (BAL_ALLOW_ALLOWLISTED_COMPONENT) result code=0
start U0是一个Activity启动的最开始的地方,通过查找这条信息,可以查找到 mCallingUid=10193 ,也就是说,启动当前应用的uid为10193
2.2 在event Log里面查找对应的uid
10193在Event Log里面并没有找到,怎么办?
2.3 查看dump activity信息
- 步骤如下 1) adb shell
- id 10193 uid=10193(u0_a193) gid=10193(u0_a193) groups=10193(u0_a193) context=u:r:su:s0
- 在dump 的activities.txt里面搜索u0a193,可以找出对应的app
因此,得出启动应用的是Launcher
3. u0_a193 的含义
- u0_a193
1)u0 默认的手机第一个用户(可以通过设置里面的多用户新增和切换)
2) a 代表app
3) 193 代表着第193个应用转换公式
- 转换公式
简单而言,对应的公式是这样
u0_a193 = “u0_” + “a” + (uid(这里是10193) – FIRST_APPLICATION_UID(固定值10000))
public static final int FIRST_APPLICATION_UID = 10000; 核心实现代码如下:
4. 案例
4.1 案例背景
在一个app里面,启动另外一个Activity:xxxActivity,如何确定启动xxxActivity的是谁?
4.2 追查start U0信息
ActivityTaskManager: START u0 {cmp=com.atms.emptydemo/.OtherActivity mCallingUid=10338} with LAUNCH_MULTIPLE from uid 10338 (BAL_ALLOW_VISIBLE_WINDOW) result code=0
发现启动当前OtherActivity的app的uid为10338
4.3 在Event Log查找
10338 在相应的Event log里面也没有找到
4.4 在dump activity信息里面去找
- 方法一
直接在dump activity里面搜索10338
- 方法二
- 控制台输入adb shell
- 输入 id 10338
uid=10338(u0_a338) gid=10338(u0_a338) groups=10338(u0_a338) context=u:r:su:s0
3)在dump activity文件里面搜索u0a338
因此,启动当前app的就是该app自己