如何用adb shell am命令启动 MTKLogger?

有时候拨串号*#*#3646633#*#*无法进入工模,从而无法进入MTKLogger去抓mobile log

这时可以用adb shell am 命令手动叫起mobile log这个apk,方式如下:


adb shell am 命令手动叫起mobile log这个apk:

adb shell am start -n com.mediatek.mtklogger/com.mediatek.mtklogger.MainActivity


备注:
adb shell am 命令是一个通用的命令,在知道activity的包名和类名的情况下,可以手动启动activity。

特别是主菜单中应该显示某应用图标,而遇到不显示图标的时候,可以用这个命令做临时测试用。


命令格式如下:
adb shell am start -n packagename/packagename.ClassName


<think>我们正在处理用户的问题:用户想通过ADB命令启动Android应用中的内部类(例如某个Activity或Service)。根据用户提供的引用,特别是引用[2]中提到了隐式Intent,以及引用[3]中提到了adb shell input keyevent,但用户的问题是关于启动内部类,所以我们需要使用`am start`命令。 在Android中,使用`adb shell am start`命令可以启动Activity。如果要启动的类是应用内部的Activity(非导出Activity),则可能需要指定明确的组件名(即包名+类名)。如果Activity是导出的,则可以使用隐式Intent,但用户提到的是“内部类”,所以更可能是未导出的,因此我们需要使用显式Intent。 步骤: 1. 确定要启动的组件的完整类名,格式为:`包名/完整类名`。注意:完整类名包括包名和类名,例如`com.example.app/com.example.app.MainActivity`。 2. 如果这个组件是Activity,则使用以下命令: ``` adb shell am start -n 包名/完整类名 ``` 例如:`adb shell am start -n com.example.app/com.example.app.internal.InternalActivity` 3. 如果这个组件是Service,则使用以下命令: ``` adb shell am startservice -n 包名/完整类名 ``` 例如:`adb shell am startservice -n com.example.app/com.example.app.internal.InternalService` 注意:如果Activity或Service是应用内部的,并且没有在AndroidManifest.xml中声明为`android:exported="true"`,则默认是不导出的(除非有intent-filter且没有显式设置exported为false)。对于未导出的组件,只有同一个应用或者具有相同用户ID(即同一个应用)才能启动。但是,通过adb命令(具有root权限或系统权限)可以启动未导出的组件,前提是设备已经root或者adb有足够的权限(在调试版本上通常可以)。 然而,对于非root设备,如果应用没有导出该组件,则可能无法启动。此时,如果是在开发过程中,可以考虑临时将组件设置为导出(仅用于调试),但发布时要去掉。 另外,如果组件是私有的(未导出),并且设备没有root,则可能无法通过adb启动。 根据引用[1]中提到的`settings`命令,以及引用[2]中提到的权限声明,这些与启动组件关系不大,但引用[2]提到了隐式Intent,所以我们也提一下隐式启动的方式(如果组件是导出的): 使用隐式Intent启动Activity: ``` adb shell am start -a android.intent.action.VIEW -d "scheme://host" -c android.intent.category.DEFAULT ``` 但用户要求启动内部类,所以显式指定组件名更直接。 因此,我们主要回答如何通过显式Intent启动内部类(Activity或Service)。 总结: - 启动Activity:`adb shell am start -n 包名/类全名` - 启动Service:`adb shell am startservice -n 包名/类全名` 注意:类全名指的是包括包名的完整类名,例如`com.example.app.MainActivity`,那么完整的组件名为`com.example.app/com.example.app.MainActivity`(注意包名和类全名可能相同,也可能类全名是包名加上子包名和类名)。 示例: 假设包名为`com.test.app`,内部Activity类名为`com.test.app.internal.InternalActivity`,则命令为: `adb shell am start -n com.test.app/com.test.app.internal.InternalActivity` 如果内部Service类名为`com.test.app.internal.InternalService`,则命令为: `adb shell am startservice -n com.test.app/com.test.app.internal.InternalService` 问题:如果内部类是在子包中,不要遗漏任何一部分包名。 另外,如果类名是应用主包名下的,比如包名是`com.test.app`,而Activity类就在`com.test.app`包下,名为`MainActivity`,那么类全名就是`com.test.app.MainActivity`,命令为: `adb shell am start -n com.test.app/com.test.app.MainActivity` 注意:在`-n`参数中,斜杠前面是包名,后面是完整的类名(包括包名)。所以实际上斜杠后面的完整类名通常和斜杠前面的包名相同,或者更长(如果类在子包中)。 特殊情况:如果类在默认包(不推荐),则类名就是简单类名,但这种情况很少见,因为应用一般都有包名。 最后,确保设备连接正常,并且应用已经安装在设备上。 根据以上内容,我们生成相关问题: 1. 如何通过ADB命令启动一个未导出的Activity? 2. 启动Service和启动Activity的ADB命令有什么区别? 3. 如果内部类在子包中,ADB命令应该如何编写?</think>### 通过ADB命令启动Android内部类 要使用ADB命令启动Android应用中的内部类(如Activity或Service),需通过`am start`命令指定组件的**完整类名**。以下是具体操作步骤: #### 1. **启动Activity** ```bash adb shell am start -n <包名>/<完整类名> ``` - **示例**:启动包名为`com.example.app`中`InternalActivity`类 ```bash adb shell am start -n com.example.app/com.example.app.internal.InternalActivity ``` #### 2. **启动Service** ```bash adb shell am startservice -n <包名>/<完整类名> ``` - **示例**:启动`InternalService`类 ```bash adb shell am startservice -n com.example.app/com.example.app.internal.InternalService ``` #### ⚠️ 关键注意事项 1. **类名格式** 必须使用**完整类名**(包括外层类路径),例如: - 内部类:`OuterClass$InnerClass` - 嵌套类:`com.example.app.OuterClass.InnerClass` 2. **导出组件限制** 若目标组件未在`AndroidManifest.xml`声明`android:exported="true"`,则: - 需**Root权限**设备才能启动 - 非Root设备需临时添加`exported=true`(仅限调试) 3. **隐式Intent启动** 若组件声明了`<intent-filter>`,可通过Action隐式启动: ```bash adb shell am start -a <ACTION_NAME> -d <DATA_URI> ``` 需在Manifest声明权限(参考引用[2])[^2]。 --- ### 操作示例 假设存在内部类`MainActivity$SettingsFragment`: ```bash # 启动内部Activity adb shell am start -n com.demo.app/com.demo.app.MainActivity$SettingsFragment # 启动内部Service adb shell am startservice -n com.demo.app/com.demo.app.Background$UploadService ``` --- ### 常见问题排查 | 问题现象 | 解决方案 | |-------------------------|------------------------------| | `SecurityException` | 检查组件`exported`属性 | | `ClassNotFoundException`| 确认类名路径是否正确 | | 权限拒绝 | 添加`<uses-permission>`声明[^2] | 可通过`adb logcat`查看具体错误日志定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值