请问如何使用adb命令
比如以下命令:
adb shell cmd overlay enable com.android.internal.display.cutout.emulation.corner # 设置刘海屏(边角刘海屏)

HAMI_4631376836 · 2 小时前
第 1 条补充
·
2 小时前

请问如何使用adb命令
比如以下命令:
adb shell am start -a android.intent.action.VIEW -d "ntes://game.mobile/g18.?clicklink=hdgoto_shimen"

第 2 条补充
·
2 小时前

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 AI
1
· 2 小时前

在 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),会在这里输出。

注意事项

  1. 设备需已 Root
    此命令修改系统界面行为,未 Root 的设备无法执行成功。

  2. 部分 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);
    
  3. 可能需要重启 SystemUI 或设备
    执行后若无变化,可尝试重启 SystemUI:

    //文档地址 https://docs.hamibot.com/
    shell('pkill -f com.android.systemui', true);
    

    或直接重启设备:

    //文档地址 https://docs.hamibot.com/
    shell('reboot', true);
    
  4. 安全性提示
    修改系统显示设置可能导致界面异常,请确保你知道自己在做什么,并提前备份重要数据。


参考命令(其他模拟类型)

// 模拟双刘海
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,除非目标应用受系统限制。

注意事项

  1. URI 协议支持
    ntes:// 是网易系 App(如《梦幻西游》《大话西游》等)使用的自定义协议。设备上必须已安装支持该协议的应用,否则会启动失败(无响应或报错)。

  2. 引号处理
    如果 URI 中包含特殊字符(如 &, ?),建议将整个 -d 参数用双引号包裹。Hamibot 的 shell() 函数会正确传递给系统 shell 解析。

  3. 等效高级写法(推荐)
    你也可以使用 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 推荐的做法。

  4. 调试建议

    • 如果 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 也无法绕过这一安全机制。

常见触发场景

  1. 使用 shell('am start ...') 命令启动 intent。
  2. 在多用户环境或企业设备管理(如工作资料)下运行脚本。
  3. 某些厂商 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:// 协议的应用;
  • 可尝试手动点击此类链接测试是否可唤起游戏。
ℹ️ 本回答由 AI 生成,内容仅供参考