请问如何使用adb命令
比如以下命令:
adb shell cmd overlay enable com.android.internal.display.cutout.emulation.corner # 设置刘海屏(边角刘海屏)
请问如何使用adb命令
比如以下命令:
adb shell am start -a android.intent.action.VIEW -d "ntes://game.mobile/g18.?clicklink=hdgoto_shimen"
17:48:33.827/D: 错误: Security exception: Permission Denial: startActivityAsUser asks to run as user -2 but is calling from uid u0a96; this requires android.permission.INTERACT_ACROSS_USERS_FULL
java.lang.SecurityException: Permission Denial: startActivityAsUser asks to run as user -2 but is calling from uid u0a96; this requires android.permission.INTERACT_ACROSS_USERS_FULL
at com.android.server.am.UserController.handleIncomingUser(UserController.java:1683)
at com.android.server.am.ActivityManagerService$LocalService.handleIncomingUser(ActivityManagerService.java:18137)
at com.android.server.wm.ActivityTaskManagerService.handleIncomingUser(ActivityTaskManagerService.java:1449)
at com.android.server.wm.ActivityStartController.checkTargetUser(ActivityStartController.java:258)
at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1083)
at com.android.server.wm.ActivityTaskManagerService.startActivityAsUser(ActivityTaskManagerService.java:1072)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3600)
at com.android.server.am.ActivityManagerShellCommand.runStartActivity(ActivityManagerShellCommand.java:524)
at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityManagerShellCommand.java:176)
at android.os.ShellCommand.exec(ShellCommand.java:104)
at com.android.server.am.ActivityManagerService.onShellCommand(ActivityManagerService.java:9897)
at android.os.Binder.shellCommand(Binder.java:881)
at android.os.Binder.onTransact(Binder.java:765)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:4500)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2833)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
回答
在 Hamibot 中,你可以通过 shell() 函数来执行类似于 ADB Shell 的命令,无需电脑或外部 ADB 工具。你提供的命令是用于设置 Android 设备显示为“边角刘海屏”样式的系统覆盖层(Overlay),可以在 Hamibot 脚本中直接调用。
使用方法
//文档地址 https://docs.hamibot.com/
var result = shell('cmd overlay enable com.android.internal.display.cutout.emulation.corner', true);
log("返回码: " + result.code);
log("输出: " + result.result);
log("错误: " + result.error);
参数说明
'cmd overlay enable ...':这是你要执行的 shell 命令。true:表示以 root 权限运行。由于cmd overlay涉及系统 UI 修改,通常需要 root 权限才能生效。result.code:如果返回0表示执行成功,非 0 表示失败。result.error:如果有错误信息(例如 Permission denied),会在这里输出。
注意事项
-
设备需已 Root
此命令修改系统界面行为,未 Root 的设备无法执行成功。 -
部分 ROM 不支持 cutout 模拟
并非所有 Android 系统都支持com.android.internal.display.cutout.emulation.*这些 Overlay 包名。常见有效值包括:corner:边角刘海double:双刘海tall:高刘海waterfall:瀑布屏disable:关闭模拟
示例:关闭模拟
//文档地址 https://docs.hamibot.com/ shell('cmd overlay disable-all', true); -
可能需要重启 SystemUI 或设备
执行后若无变化,可尝试重启 SystemUI://文档地址 https://docs.hamibot.com/ shell('pkill -f com.android.systemui', true);或直接重启设备:
//文档地址 https://docs.hamibot.com/ shell('reboot', true); -
安全性提示
修改系统显示设置可能导致界面异常,请确保你知道自己在做什么,并提前备份重要数据。
参考命令(其他模拟类型)
// 模拟双刘海
shell('cmd overlay enable com.android.internal.display.cutout.emulation.double', true);
// 模拟高刘海
shell('cmd overlay enable com.android.internal.display.cutout.emulation.tall', true);
// 关闭所有 cutout 模拟
shell('cmd overlay disable-all', true);
这些命令均可在 Hamibot 脚本中使用 shell() 执行,前提是你有 root 权限且系统支持 overlay 功能。
补充回答 1
在 Hamibot 中,你可以使用 shell() 函数来执行类似于 ADB Shell 的 am start 命令,比如你提供的这个用于启动特定 intent 的命令。
你原来的 ADB 命令是:
adb shell am start -a android.intent.action.VIEW -d "ntes://game.mobile/g18.?clicklink=hdgoto_shimen"
在 Hamibot 中的等效写法
//文档地址 https://docs.hamibot.com/
var result = shell('am start -a android.intent.action.VIEW -d "ntes://game.mobile/g18.?clicklink=hdgoto_shimen"', false);
log("返回码: " + result.code);
log("输出: " + result.result);
log("错误: " + result.error);
参数说明
am start:Android 的 Activity Manager 命令,用于启动应用组件。-a android.intent.action.VIEW:指定动作为 VIEW,通常用于打开链接或 URI。-d "ntes://...":指定数据(Data)为一个自定义协议 URI(这里是网易游戏的 deep link)。false:表示不需要 root 权限。大多数应用跳转无需 root,除非目标应用受系统限制。
注意事项
-
URI 协议支持
ntes://是网易系 App(如《梦幻西游》《大话西游》等)使用的自定义协议。设备上必须已安装支持该协议的应用,否则会启动失败(无响应或报错)。 -
引号处理
如果 URI 中包含特殊字符(如&,?),建议将整个-d参数用双引号包裹。Hamibot 的shell()函数会正确传递给系统 shell 解析。 -
等效高级写法(推荐)
你也可以使用 Hamibot 提供的app.intent()方法构造意图,更安全且易于维护://文档地址 https://docs.hamibot.com/ var i = app.intent({ action: 'VIEW', data: 'ntes://game.mobile/g18.?clicklink=hdgoto_shimen' }); if (app.startActivity(i)) { log('成功发送 intent'); } else { log('启动失败,可能未安装对应应用'); }这种方式不依赖 shell 和 root,兼容性更好,是 Hamibot 推荐的做法。
-
调试建议
- 如果
code不为 0 或error有输出,常见原因包括:- 未安装对应 App
- 应用未注册该 scheme
- 系统限制后台启动 Activity
- 可先手动测试:在手机浏览器中点击
ntes://...链接,看是否能唤起游戏。
- 如果
总结
| 方式 | 是否推荐 | 说明 |
|---|---|---|
shell('am start ...') |
✅ 可用 | 直接模拟 ADB 命令,适合熟悉 adb 的用户 |
app.intent() + startActivity() |
✅✅ 推荐 | 更稳定、无需 root、更易调试 |
建议优先使用 app.intent() 方式实现 intent 跳转。
补充回答 2
这个错误:
Security exception: Permission Denial: startActivityAsUser asks to run as user -2 but is calling from uid u0a96; this requires android.permission.INTERACT_ACROSS_USERS_FULL
表示你尝试通过 am start 或类似方式启动一个 Activity 时,系统拒绝了请求,原因是没有跨用户操作的权限。
错误原因分析
user -2:这是 Android 的特殊用户 ID,代表USER_CURRENT_OR_SELF,即“当前用户或调用者自己”。虽然看起来合理,但某些设备(尤其是华为、小米、三星等定制 ROM)会对此进行严格限制。uid u0a96:表示当前运行 Hamibot 的应用 UID(通常是普通应用级别)。- 缺少权限:要以
-2用户身份启动 Activity,系统要求持有android.permission.INTERACT_ACROSS_USERS_FULL权限。 - 该权限是系统级签名权限:只有系统应用或具有系统签名的应用才能拥有此权限。普通应用(包括 Hamibot)无法获得这个权限,即使 root 也无法绕过这一安全机制。
常见触发场景
- 使用
shell('am start ...')命令启动 intent。 - 在多用户环境或企业设备管理(如工作资料)下运行脚本。
- 某些厂商 ROM(如华为 EMUI、小米 MIUI)默认开启用户隔离策略。
解决方案
✅ 方案一:改用 app.startActivity()(推荐)
不要使用 shell('am start ...'),而是使用 Hamibot 提供的高阶 API:
//文档地址 https://docs.hamibot.com/
var intent = app.intent({
action: 'VIEW',
data: 'ntes://game.mobile/g18.?clicklink=hdgoto_shimen'
});
if (app.startActivity(intent)) {
log('成功发送 intent');
} else {
log('启动失败,可能未安装对应应用');
}
这种方式:
- 不涉及跨用户调用问题。
- 更安全、兼容性更好。
- 不需要 root。
- 是 Hamibot 推荐的标准做法。
❌ 避免使用 shell 执行 am 命令(除非必要)
// 不推荐,容易触发权限异常
shell('am start -a android.intent.action.VIEW -d "ntes://..."', false);
即使你有 root,也不能保证能绕过 INTERACT_ACROSS_USERS_FULL 限制,因为这是 Binder 层的安全检查,不是文件权限问题。
⚠️ 特殊情况处理(仅限已 root + 系统修改)
如果你确实需要在 shell 中执行 am start 并避免用户切换问题,可以显式指定用户为 0(主用户):
//文档地址 https://docs.hamibot.com/
shell('am start --user 0 -a android.intent.action.VIEW -d "ntes://game.mobile/g18.?clicklink=hdgoto_shimen"', true);
说明:
--user 0明确指定在主用户环境下启动。- 需要
true(root 权限)才可能生效。 - 仍不保证成功,取决于 ROM 是否允许非系统应用代理用户 0。
总结
| 方法 | 是否可行 | 说明 |
|---|---|---|
shell('am start ...') |
❌ 多数情况下失败 | 触发 INTERACT_ACROSS_USERS_FULL 权限限制 |
app.startActivity() |
✅ 强烈推荐 | 安全、稳定、无需 root |
shell('am start --user 0 ...') |
⚠️ 可能有效 | 仅限 root 设备,且依赖 ROM 支持 |
建议立即改用
app.startActivity()方式构造 intent 并启动,这是最可靠的方式。
如果仍然无法打开,请检查:
- 是否已安装支持
ntes://协议的应用; - 可尝试手动点击此类链接测试是否可唤起游戏。