确定 Activity的启动者

1,440 阅读2分钟

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
  1. id 10193 uid=10193(u0_a193) gid=10193(u0_a193) groups=10193(u0_a193) context=u:r:su:s0
  2. 在dump 的activities.txt里面搜索u0a193,可以找出对应的app

image.png

因此,得出启动应用的是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; 核心实现代码如下:

image.png

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 image.png
  • 方法二
  1. 控制台输入adb shell
  2. 输入 id 10338 uid=10338(u0_a338) gid=10338(u0_a338) groups=10338(u0_a338) context=u:r:su:s0 3)在dump activity文件里面搜索u0a338 image.png 因此,启动当前app的就是该app自己