我使用这个命令adb shell dumpsys window | findstr mCurrentFocus输出结果mCurrentFocus=Window{b3b5331 u0 com.huawei.android.launcher/com.huawei.android.launcher.unihome.UniHomeLauncher},请问我如果只想获取到com.huawei.android.launcher.unihome.UniHomeLauncher,应该如何编写
时间: 2025-07-24 20:27:05 浏览: 13
<think>我们参考了用户提供的引用内容,特别是引用[1]和引用[2]中关于adb命令输出的例子。
用户的问题:如何从`adb shell dumpsys window windows`的输出中提取当前聚焦的Activity名称?
根据引用[1]的例子,输出行中包含`mCurrentFocus`,例如:`mCurrentFocus=Window{b48a42b u0 com.huawei.android.launcher/com.huawei.android.launcher.Launcher}`
我们需要从中提取出`com.huawei.android.launcher/com.huawei.android.launcher.Launcher`(注意:这里实际上包含了包名和Activity名,中间用斜杠分隔)
但是,用户要求提取的格式是完整的Activity名称,例如`com.huawei.android.launcher.unihome.UniHomeLauncher`(注意:这里没有斜杠,而是用点连接,并且包名和Activity名之间没有斜杠)
实际上,在输出中,Activity的表示通常是`包名/Activity类名`,其中Activity类名可能是全限定类名(即包含包名的一部分,也可能不是)。我们需要将斜杠替换为点吗?注意,有些Activity类名已经是全限定名,但通常我们只需要将斜杠前面的包名和后面的类名用点连接起来吗?其实不是。
观察引用[1]的例子:`com.huawei.android.launcher/com.huawei.android.launcher.Launcher`
如果我们把斜杠替换成点,会变成:`com.huawei.android.launcher.com.huawei.android.launcher.Launcher`,这显然不对。
实际上,在输出中,斜杠前面的部分是包名,后面的是Activity的类名(可能是绝对类名,也可能是相对于包名的类名)。如果后面的类名以点开头,那就是绝对类名,否则是相对于包名的。但通常,我们看到的是绝对类名(以包名开头)或者相对类名(不以包名开头)。所以,正确的做法是:
1. 如果斜杠后面的类名以点开头,那么它就是一个绝对类名,我们直接使用它(去掉开头的点?实际上不会以点开头,而是以包名开头)。
2. 实际上,我们通常看到的是:包名 + 斜杠 + 类名(类名可能是全路径,也可能是前面的包名和后面类名的组合?)
但是,我们再看引用[2]中的例子:`com.huawei.android.launcher/.unihome.UniHomeLauncher`
注意这里在斜杠后面有一个点,所以实际上整个Activity的全名是`com.huawei.android.launcher.unihome.UniHomeLauncher`(因为斜杠后面的部分以点开头,所以是相对于根包名的,但通常我们会把包名和后面的部分拼接起来)。
然而,实际上,在输出中,斜杠后面的部分如果以点开头,那么它表示的是从根包名开始的绝对路径,否则是相对于前面包名的相对路径。但为了得到完整的类名,我们有两种情况:
情况1:斜杠后面没有点开头,例如:`com.example.app/MainActivity` -> 完整类名就是`com.example.app.MainActivity`
情况2:斜杠后面以点开头,例如:`com.example.app/.MainActivity` -> 完整类名还是`com.example.app.MainActivity`(因为点开头的表示从当前包开始的相对路径,但通常我们省略开头的点,直接拼接)
但是,我们再看一个例子:`com.example.app/com.example.app.sub.SubActivity` -> 这种情况,斜杠后面已经是完整类名,那么我们可以直接使用,不需要做任何转换。
实际上,我们观察到的输出中,斜杠后面的部分可能是:
- 相对类名(没有点开头,或者以点开头?)实际上,以点开头的相对类名很少见,通常我们看到的都是完整类名或者简单类名。
然而,在引用[1]和引用[2]中,我们看到两种不同的表示:
引用[1]:`com.huawei.android.launcher/com.huawei.android.launcher.Launcher` -> 这里斜杠后面是完整类名(和包名相同,所以重复了)
引用[2]:`com.huawei.android.launcher/.unihome.UniHomeLauncher` -> 这里斜杠后面以点开头,表示`unihome.UniHomeLauncher`是相对于包`com.huawei.android.launcher`的。
所以,我们可以这样处理:
将斜杠前面的部分作为包名,斜杠后面的部分如果以点开头,则去掉开头的点,然后与包名拼接(注意:如果后面的部分已经是以包名开头的完整类名,则不需要拼接,但这种情况我们无法直接判断,所以实际上,我们只需要将斜杠替换为点,然后去掉可能存在的多余的点?)
但是,更简单且常见的做法是:直接取斜杠后面的部分,如果它包含点,那么它就是一个完整类名(或者是相对类名,但相对类名我们无法单独使用,所以通常我们使用完整类名)。然而,在输出中,我们经常看到两种形式:
形式1: package.name/package.name.ActivityName -> 我们可以将斜杠替换为点,得到package.name.package.name.ActivityName,但这显然是错误的(因为包名重复了)。
形式2: package.name/.ActivityName -> 替换为package.name.ActivityName(正确)
所以,我们需要一个更智能的方法。实际上,在Android开发中,我们通常这样理解:
完整的Activity类名 = 包名 + 斜杠后面的部分(如果斜杠后面的部分以点开头,则去掉开头的点,然后直接作为包名后面的部分;如果斜杠后面的部分不以点开头,那么它可能是:
a) 一个完整的类名(包含包名),那么我们就用这个完整的类名。
b) 一个相对类名(不包含包名),那么完整类名就是包名+这个相对类名(中间用点连接)。
但是,我们无法从字符串上判断斜杠后面的部分是否是完整类名,所以通常的做法是:如果斜杠后面的部分包含点,则认为它是完整类名,否则就是相对类名(需要拼接包名)。然而,这种方法也不可靠。
实际上,从adb命令输出的Activity信息中,我们通常不需要拼接,因为系统记录的就是Activity的完整类名。但是,在输出中,为了节省空间,系统可能会使用相对形式(以点开头)表示在同一个包内的Activity。所以,我们只需要将斜杠替换为点,并处理开头的点即可。
但是,观察实际例子:
例子1(引用[1]):`com.huawei.android.launcher/com.huawei.android.launcher.Launcher`
如果我们直接替换斜杠为点:`com.huawei.android.launcher.com.huawei.android.launcher.Launcher` -> 错误,重复了包名。
例子2(引用[2]):`com.huawei.android.launcher/.unihome.UniHomeLauncher`
替换斜杠为点:`com.huawei.android.launcher..unihome.UniHomeLauncher` -> 有两个连续的点,错误。
因此,我们需要更精确的提取方法:
步骤:
1. 找到包含`mCurrentFocus`的行。
2. 从行中提取出`/`分隔的两个部分:包名和类名部分。
3. 如果类名部分以`.`开头,则去掉开头的点,然后与包名拼接(用点连接)?不对,因为包名已经是完整的,类名部分去掉开头的点后,就是包名下的子包或类名,所以完整类名应该是:包名 + 类名部分(去掉开头的点)。注意:类名部分去掉开头的点后,可能是一个相对路径,比如`.MainActivity`去掉点变成`MainActivity`,那么完整类名就是`包名.MainActivity`。
4. 如果类名部分不以点开头,那么它可能是:
a) 一个完整的类名(如`com.example.AnotherActivity`),那么我们就直接使用这个类名。
b) 或者是一个相对类名(如`MainActivity`),那么完整类名就是`包名.MainActivity`。
但是,我们无法区分类名部分是否是一个完整类名(因为它可能包含点,也可能不包含点)。所以,我们通常采用这样的规则:如果类名部分包含点,则认为是完整类名;否则,需要拼接包名。
然而,这个规则在例子1中会出错:因为例子1中的类名部分`com.huawei.android.launcher.Launcher`包含点,所以我们会认为它是完整类名,那么我们就直接使用它,这样就不会重复包名。而例子2中,类名部分`.unihome.UniHomeLauncher`以点开头,我们去掉开头的点后得到`unihome.UniHomeLauncher`,然后拼接包名:`com.huawei.android.launcher.unihome.UniHomeLauncher`。
所以,规则如下:
- 如果类名部分以点开头,则完整类名 = 包名 + 类名部分(去掉开头的点)
- 否则,如果类名部分不包含点(即没有点),则完整类名 = 包名 + '.' + 类名部分
- 否则(即类名部分不以点开头但包含点),则完整类名 = 类名部分(认为它是完整类名)
但是,这个规则在例子1中会怎样处理?
例子1:包名=`com.huawei.android.launcher`,类名部分=`com.huawei.android.launcher.Launcher` -> 不以点开头,且包含点,所以完整类名就是`com.huawei.android.launcher.Launcher`(正确,因为这就是完整类名)
但是,如果有一个Activity,它的包名是`com.example`,而类名部分是`sub.Activity`(不以点开头,但包含点),按照规则,我们会认为`sub.Activity`是完整类名,但实际上它应该是`com.example.sub.Activity`。所以,这个规则在这种情况下会出错。
因此,更安全的做法是:我们不知道类名部分是否完整,所以统一采用拼接的方式?但是,如果类名部分已经是完整类名,我们拼接就会重复。
实际上,在Android系统中,dumpsys输出的Activity名称格式是固定的:它总是以包名开头,然后斜杠,然后是Activity的类名(这个类名可以是绝对类名,也可以是相对于包名的类名)。但是,系统在输出时,如果Activity属于同一个包,则可能会省略包名部分(用点开头表示省略包名)。所以,我们按照以下规则处理:
规则:如果类名部分以点开头,那么完整类名 = 包名 + 类名部分(将开头的点替换成包名后面的点,即拼接)
否则,完整类名 = 类名部分 (因为如果它不以点开头,那么它就是一个完整的类名?)
这个规则在例子1和例子2中都能正确吗?
例子1:类名部分不以点开头,所以完整类名=类名部分=`com.huawei.android.launcher.Launcher` -> 正确。
例子2:类名部分以点开头,所以完整类名=包名(`com.huawei.android.launcher`) + 类名部分(`.unihome.UniHomeLauncher`) -> 但这样拼接后是`com.huawei.android.launcher.unihome.UniHomeLauncher`(正确,因为去掉了类名部分开头的点,然后直接拼接)。
但是,如果有一个Activity,它的包名是`com.example`,而类名部分是`my.package.Activity`(不以点开头),那么按照规则,我们会认为完整类名就是`my.package.Activity`,但实际上它可能是一个完全不同的包?所以,这种情况下,我们无法确定。
然而,在Android系统中,一个Activity的类名部分如果是不以点开头的,那么它必须是一个完整的类名(包括包名),否则系统无法识别。所以,系统输出时,对于非当前包内的Activity,会输出完整类名。因此,我们按照上述规则处理是合理的。
因此,提取步骤:
1. 使用命令:`adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'`
2. 从输出行中提取出类似`com.example.app/com.example.app.ActivityName`或`com.example.app/.ActivityName`的部分。
3. 将字符串按斜杠`/`分割,得到两部分:包名(part1)和类名部分(part2)。
4. 如果part2以`.`开头,则完整类名 = part1 + part2(注意:这里part2去掉开头的点?不对,因为part2可能是`.ActivityName`,我们想要的是`part1.ActivityName`,所以应该把开头的点替换成点,但实际上就是去掉开头的点,然后拼接到part1后面,中间用点连接?但是,part1后面没有点,所以直接拼接会变成`part1part2`(去掉开头的点后)?所以,应该是:`part1 + part2`(将part2开头的点替换成一个点,但实际就是去掉开头的点,然后在part1和part2之间加一个点)?不对,因为part2可能是`.sub.Activity`,去掉开头的点后变成`sub.Activity`,然后与part1拼接:`part1sub.Activity`,这显然不对。所以,应该是:`part1 + part2`(不删除点,而是将开头的点保留,然后直接拼接)?这样会变成`com.example.sub.Activity`,但part1是`com.example`,拼接后是`com.example.sub.Activity`,正确。所以,实际上,我们不需要去掉开头的点,而是直接拼接?因为part2以点开头,表示它是相对于part1的包名的相对路径,所以直接拼接(part1和part2连起来)就是完整类名。
例如:
包名:`com.huawei.android.launcher`
类名部分:`.unihome.UniHomeLauncher`
拼接:`com.huawei.android.launcher.unihome.UniHomeLauncher` -> 正确。
所以,规则是:完整类名 = part1 + part2 (注意,part2以点开头,所以拼接后中间没有多余的点,因为part1后面没有点,而part2开头有点,所以连接起来自然就是正确的)
但是,如果part2不以点开头,那么完整类名就是part2(因为part2是一个完整类名)。
因此,我们可以用以下命令提取:
在Linux/macOS下:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | sed -E 's/.*[^A-Za-z0-9]([A-Za-z0-9_.]+)\/([^ ]*).*/\1\/\2/' | awk -F '/' '{ if ($2 ~ /^\../) { print $1 $2 } else { print $2 } }'
```
但是,这个命令比较复杂,而且可能不健壮。我们分步解释:
第一步:用grep找到包含mCurrentFocus或mFocusedApp的行。
第二步:用sed提取出包名和类名部分,格式为“包名/类名部分”。但是,这个正则表达式可能不够健壮。
第三步:用awk按斜杠分割,然后判断类名部分($2)是否以点开头(注意,我们匹配的是“以点开头且后面跟着任意字符”,所以用`/^\../`),如果是,则输出$1$2(即包名和类名部分直接连接),否则输出$2(类名部分)。
但是,这个awk命令中,如果类名部分以点开头,我们输出`$1$2`,例如:包名是com.example,类名部分是`.Activity`,输出`com.example.Activity`(正确)。如果类名部分不是以点开头,输出类名部分(例如`com.example.Activity`),正确。
但是,这个命令在类名部分包含空格的情况下会出错,因为我们用空格分割了。不过,在dumpsys的输出中,Activity名称通常不会包含空格,所以可以接受。
然而,我们也可以使用更简单的命令,例如:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -oE "[^ ]+/[^ }]+" | awk -F '/' '{ if ($2 ~ /^\../) { print $1 $2 } else { print $2 } }'
```
但是,这个命令可能还不够健壮。
考虑到跨平台和简单性,我们可以使用一个简单的grep提取出包名/类名部分,然后手动处理(或者在脚本中处理)。但是,用户要求用命令直接提取。
实际上,我们可以用更简单的方法:使用`adb shell dumpsys activity activities | grep mResumedActivity`,然后提取类名,这个输出更直接。
但是,用户指定了要从`dumpsys window windows`中提取。
因此,我们给出一个在Linux/macOS下可用的命令:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | sed -E 's/^.*mCurrentFocus=.*[ \t]([^ /]+\/[^ ]+).*$/\1/' | sed -E 's/^.*mFocusedApp=.*ActivityRecord{[^ ]+ [^ ]+ [^ ]+ ([^ /]+\/[^ }]+).*$/\1/' | head -1 | awk -F'/' '{ if ($2 ~ /^\./) { print $1 $2 } else { print $2 } }'
```
这个命令比较复杂,因为要同时处理mCurrentFocus和mFocusedApp两种可能的行,并且提取出包名/类名部分。然后使用awk进行转换。
但是,我们注意到在引用[1]中,输出行是:`mCurrentFocus=Window{b48a42b u0 com.huawei.android.launcher/com.huawei.android.launcher.Launcher}`,所以我们可以用以下命令提取:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | head -1 | sed -E 's/.*[ /]([a-zA-Z0-9._]+)\/([a-zA-Z0-9._]+).*/\1\/\2/' | awk -F'/' '{ if ($2 ~ /^\./) { print $1 $2 } else { print $2 } }'
```
但是,这个sed可能不够健壮,因为输出格式可能变化。
实际上,我们可以用更精确的提取方法:使用perl正则表达式,但考虑到通用性,我们采用以下方法:
在Android开发中,常用的一个命令是:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | cut -d' ' -f3 | cut -d'/' -f1,2
```
但是,这只能提取出包名/类名部分,然后我们再用awk处理。
综合以上,我们给出一个相对健壮的命令:
步骤1:提取出包含包名/类名的那一段(通常是在最后一个斜杠分隔的部分)
但是,我们可以尝试:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -oE "[a-zA-Z0-9._]+/[a-zA-Z0-9._{}$]+"
```
这个命令可以提取出像`com.huawei.android.launcher/com.huawei.android.launcher.Launcher`这样的部分。然后,我们再对提取出的这个部分进行转换:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -oE "[a-zA-Z0-9._]+/[a-zA-Z0-9._{}$]+" | head -1 | awk -F'/' '{ if ($2 ~ /^\./) { print $1 $2 } else { print $2 } }'
```
测试:
例子1:输入`com.huawei.android.launcher/com.huawei.android.launcher.Launcher`,awk分割后,$1=com.huawei.android.launcher, $2=com.huawei.android.launcher.Launcher -> 不以点开头,所以输出$2 -> com.huawei.android.launcher.Launcher(正确)
例子2:输入`com.huawei.android.launcher/.unihome.UniHomeLauncher`,awk分割后,$2以点开头,所以输出$1$2 -> com.huawei.android.launcher.unihome.UniHomeLauncher(正确)
但是,注意$2可能包含特殊字符(如$),在引用[1]中我们看到有`com.android.settings/com.android.settings.Settings$NetworkDashboardActivity`,所以我们在grep的正则表达式中允许$。
因此,命令为:
对于Linux/macOS:
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -oE "[a-zA-Z0-9._$]+/[a-zA-Z0-9._{}$]+" | head -1 | awk -F'/' '{ if ($2 ~ /^\./) { print $1 $2 } else { print $2 } }'
```
对于Windows,由于没有grep,我们可以使用findstr,但是提取和转换会更复杂,建议使用PowerShell或者WSL。
但是,如果用户只需要包名/类名部分(不进行转换),那么我们可以直接输出。但是用户要求提取出完整的Activity名称(如com.huawei.android.launcher.unihome.UniHomeLauncher)。
另外,在引用[2]中,我们看到另一种方法:`adb shell dumpsys activity top | grep ACTIVITY`,这个命令也可以获取当前Activity,而且输出更简洁。例如:
```bash
adb shell dumpsys activity top | grep ACTIVITY | head -1 | awk '{print $2}'
```
输出示例:`com.huawei.android.launcher/.unihome.UniHomeLauncher`,然后我们可以用同样的awk转换:
```bash
adb shell dumpsys activity top | grep ACTIVITY | head -1 | awk '{print $2}' | awk -F'/' '{ if ($2 ~ /^\./) { print $1 $2 } else { print $2 } }'
```
所以,如果用户不限定必须使用`dumpsys window`,那么这种方法更简单。
但是,用户明确要求从`adb shell dumpsys window`的输出中提取。
因此,我们提供以下解决方案:
方法一:使用`dumpsys window`,然后通过grep和awk提取转换
方法二:使用`dumpsys activity`命令,可能更简单
根据用户需求,我们提供方法一的命令。
注意:在有些设备上,`mCurrentFocus`可能输出多行,我们取第一个匹配的。
最终命令(Linux/macOS):
```bash
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -oE "[a-zA-Z0-9._$]+/[a-zA-Z0-9._{}$]+" | head -1 | awk -F'/' '{
if ($2 ~ /^\./) {
print $1 $2
} else {
print $2
}
}'
```
测试用例:
输入:`mCurrentFocus=Window{b48a42b u0 com.huawei.android.launcher/com.huawei.android.launcher.Launcher}`
输出:`com.huawei.android.launcher.Launcher`
输入:`mCurrentFocus=Window{b48a42b u0 com.huawei.android.launcher/.unihome.UniHomeLauncher}`
输出:`com.huawei.android.launcher.unihome.UniHomeLauncher`
如果用户需要包名+类名的完整形式(即保持斜杠分隔),可以省略后面的转换步骤。
但是,用户要求的是类似`com.huawei.android.launcher.unihome.UniHomeLauncher`这样的形式,所以我们提供了转换。
注意:在Windows上,我们可以使用以下步骤:
1. 使用findstr获取行
2. 使用for循环或者手动截取字符串(比较复杂),建议使用PowerShell
PowerShell命令:
```powershell
$output = adb shell dumpsys window windows | findstr "mCurrentFocus mFocusedApp"
# 提取出包含包名/类名的部分,假设在行中有一个连续的 包名/类名 的字符串
# 使用正则表达式匹配
if ($output -match '([a-zA-Z0-9._$]+)/([a-zA-Z0-9._{}$]+)') {
$package = $matches[1]
$classPart = $matches[2]
if ($classPart.StartsWith('.')) {
$fullActivity = $package + $classPart
} else {
$fullActivity = $classPart
}
Write-Host $fullActivity
}
```
或者写成一行:
```powershell
adb shell dumpsys window windows | findstr "mCurrentFocus mFocusedApp" | ForEach-Object { if ($_ -match '([a-zA-Z0-9._$]+)/([a-zA-Z0-9._{}$]+)') { if ($matches[2].StartsWith('.')) { $matches[1] + $matches[2] } else { $matches[2] } } }
```
但是,这个命令在PowerShell中可能过长,而且findstr在Windows中可能不支持同时匹配两个字符串(可以用多个findstr),这里我们简化了。
考虑到跨平台的复杂性,我们建议Linux/macOS用户使用上面的命令,Windows用户使用PowerShell命令。
最后,我们也可以考虑使用`adb shell`命令结合`awk`来实现,但Android设备上的awk可能不是所有设备都有,所以我们建议在PC端处理。
总结:用户要求从`dumpsys window`输出中提取当前聚焦的Activity名称,并转换为完整类名格式,我们提供了Linux/macOS和Windows(PowerShell)的解决方案。</think>要從 `adb shell dumpsys window windows` 的輸出中精確提取當前聚焦的 Activity 名稱(如 `com.huawei.android.launcher.unihome.UniHomeLauncher`),可通過以下步驟實現:
---
### 提取原理與步驟
1. **定位關鍵行**
使用 `grep` 過濾包含 `mCurrentFocus` 或 `mFocusedApp` 的行(這些行包含當前聚焦的 Activity 信息)[^1][^2]。
2. **提取包名/類名組合**
從關鍵行中提取 `包名/類名` 格式的字符串(如 `com.huawei.android.launcher/.unihome.UniHomeLauncher`)[^2]。
3. **轉換為完整類名**
將 `/` 替換為 `.`,並處理開頭的點(如 `/.unihome` → `.unihome` → 直接拼接包名)[^1][^2]。
---
### 具體命令(Linux/macOS)
```bash
adb shell dumpsys window windows | \
grep -E 'mCurrentFocus|mFocusedApp' | \
grep -oE '[a-zA-Z0-9._]+/[a-zA-Z0-9._{}$]+' | \
head -n 1 | \
awk -F/ '{ if ($2 ~ /^\./) print $1 $2; else print $2 }'
```
#### 輸出示例:
```bash
com.huawei.android.launcher.unihome.UniHomeLauncher
```
#### 命令說明:
1. `grep -E 'mCurrentFocus|mFocusedApp'`
過濾出包含 Activity 信息的行[^1]。
2. `grep -oE '[a-zA-Z0-9._]+/[a-zA-Z0-9._{}$]+'`
精確提取 `包名/類名` 格式的字符串(支援特殊字符如 `$`)[^5]。
3. `awk -F/ '{...}'`
- `$2 ~ /^\./`:若類名以 `.` 開頭(如 `/.unihome`),直接拼接包名和類名(`$1$2`)。
- `else`:否則直接輸出類名(如 `com.huawei.android.launcher.Launcher`)[^1][^2]。
---
### Windows 用戶(使用 PowerShell)
```powershell
adb shell dumpsys window windows | `
Select-String -Pattern "mCurrentFocus|mFocusedApp" | `
ForEach-Object {
if ($_ -match '([\w.]+)/([.\w{$}]+)') {
if ($matches[2].StartsWith('.')) {
$matches[1] + $matches[2]
} else {
$matches[2]
}
}
}
```
---
### 驗證與注意事項
1. **輸出對比**
- 輸入:`mCurrentFocus=Window{... com.huawei.android.launcher/.unihome.UniHomeLauncher}`
- 輸出:`com.huawei.android.launcher.unihome.UniHomeLauncher`[^1][^2]
2. **特殊情況處理**
- 若類名包含 `$`(如 `Settings$NetworkDashboardActivity`),命令會自動保留[^4][^5]。
- 支援多種格式(完整類名或相對類名)的轉換[^1][^2]。
3. **設備差異**
- 部分定制 ROM 可能需要調整正則表達式(如 EMUI 的 `UniHomeLauncher`)[^1][^2]。
- 確保 USB 調試模式已啟用。
---
### 替代方案(更簡潔)
若設備支援 `dumpsys activity`,可直接用:
```bash
adb shell dumpsys activity activities | grep mResumedActivity | grep -oE '[^ ]+$'
```
輸出示例:`com.huawei.android.launcher.unihome.UniHomeLauncher`[^3]
---
阅读全文
相关推荐




















