往日微忆
文章目录

前序

首先,这是我使用 Obsidian 进行记录的第一篇笔记。

一直以来,我都想找一款称心如意的文件和应用隐藏app, Amarok 是用过的其中一款,使用体验较佳,准备长期使用。

Amarok 是轻量级隐私保护小工具,可一键隐藏隐私文件和应用。它不对文件与应用进行加密,而是进行“隐藏”。它不加密文件内容,只混淆文件名以及文件签名,使文件“损坏”无法打开并且隐藏起来;Amarok 使用停用应用的方式“隐藏”应用,使它们在启动器中不可见。其详细介绍请详见官网(https://deltazefiro.github.io/Amarok-doc/ )。

Amarok 目前提供4种应用隐藏模式:Root 模式、Shizuku/Sui 模式、Dhizuku 模式、DSM 模式。目录建议使用Shizuku/Sui 、Dhizuku 两种模式之一,Shizuku/Sui 模式手机有无 root 都可以,无 root 手机重启后需再次激活。Dhizuku 模式工作在无 root 手机,只需一次激活即可使用,重启设备不需要重新激活

我的手机不想 root ,又不想频繁重启后重新激活,于是选择了Dhizuku 模式。激活 Dhizuku 大概率(为什么这么说,以下会有说明)需要首先运行 Shizuku 。我的实践操作步骤详述如下。

有关准备工作

  1. 下载相关 app 和工具:
  1. 手机 USB 数据线,用于连接电脑。
  2. 电脑终端,建议选择 Linux 系统终端。Windows 系统会产生莫名的错误,较难排查。我测试的这台 Windows10 电脑就始终不能连接手机进行 adb 操作,在 Linux 就一点问题都没,省折腾。

几点说明

  • 激活 Dhizuku 有两种方式:通过 Shizuku 激活、通过电脑激活。
  • 对于没有 root 的设备,运行 Shizuku 可以通过无线调试启动和通过连接电脑(使用 adb )启动。两种方式启动运行 Shizuku 均基本不会出现错误。
  • 即便通过无线调试启动运行 Shizuku 后,也不能肯定可以直接通过 Shizuku 成功激活 Dhizuku ,除非是未使用新机,否则很可能会出现激活错误,得需要安装上述的 Accounts、Hail 两个 app 进行辅助,而 Accounts 的运行需要首先运行 Shizuku 。
  • 通过电脑激活方式激活 Dhizuku 也可能需要 Accounts、Hail 两个 app
  • 并不是所有手机都能开启无线调试功能,我的华为 P40pro+ 就没有,小米13pro就有:

综上,最理想的状态是手机可以开启无线调试,利用无线调试运行 Shizuku,再通过 Shizuku 激活 Dhizuku 。这是未出错的极端情况,以下是在最复杂的情况下的具体步骤,具体可视情况跳过。

具体操作步骤

手机连接电脑

手机开启 USB 调试,连接电脑,在电脑终端运行 adb 开启调试。命令如下最后的结果才表示已经成功连接并可以运行 adb 相关的命令。

[liy@Arch-inLe platform-tools]$ ./adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
GMUY889898223888	unauthorized

[liy@Arch-inLe platform-tools]$ ./adb devices
List of devices attached
GMUY889898223888	device

手机启动运行 Shizuku

手机安装并运行 Shizuku ,通过无线调试启动可详参官网通过无线调试启动。通过连接电脑启动,需在电脑终端下运行如下命令:

[liy@liArch-inLe platform-tools]$ ./adb shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.api/start.sh
info: start.sh begin
info: attempt to copy starter from /storage/emulated/0/Android/data/moe.shizuku.privileged.api/starter to /data/local/tmp/shizuku_starter
info: exec /data/local/tmp/shizuku_starter
info: starter begin
info: killing old process...
info: apk path is /data/app/~~PIIJFfJDXgUM5XlLnrHToQ==/moe.shizuku.privileged.api-YHr4Rf4TkSVNWmNzxHCiiw==/base.apk
info: starting server...
info: shizuku_starter exit with 0

手机启动运行 Dhizuku

手机运行 Dhizuku ,通过电脑激活,在电脑终端运行激活命令: ./adb shell dpm set-device-owner com.rosan.dhizuku/.server.DhizukuDAReceiver,可能有三种情况发生:

激活成功

[liy@liArch-inLe platform-tools]$ ./adb shell dpm set-device-owner com.rosan.dhizuku/.server.DhizukuDAReceiver
Success: Device owner set to package com.rosan.dhizuku/.server.DhizukuDAReceiver
Active admin set to component com.rosan.dhizuku/.server.DhizukuDAReceiver

表示成功激活。

Existing user 错误

[liy@liArch-inLe platform-tools]$ ./adb shell dpm set-device-owner com.rosan.dhizuku/.server.DhizukuDAReceiver

Exception occurred while executing 'set-device-owner':
java.lang.IllegalStateException: Not allowed to set the device owner because there are already several users on the device.
	at com.android.server.devicepolicy.DevicePolicyManagerService.enforceCanSetDeviceOwnerLocked(DevicePolicyManagerService.java:9645)
	at com.android.server.devicepolicy.DevicePolicyManagerService.setDeviceOwner(DevicePolicyManagerService.java:8568)
	at com.android.server.devicepolicy.DevicePolicyManagerServiceShellCommand.runSetDeviceOwner(DevicePolicyManagerServiceShellCommand.java:256)
	at com.android.server.devicepolicy.DevicePolicyManagerServiceShellCommand.onCommand(DevicePolicyManagerServiceShellCommand.java:89)
	at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97)
	at android.os.ShellCommand.exec(ShellCommand.java:38)
	at com.android.server.devicepolicy.DevicePolicyManagerService.onShellCommand(DevicePolicyManagerService.java:9967)
	at android.os.Binder.shellCommand(Binder.java:962)
	at android.os.Binder.onTransact(Binder.java:846)
	at android.app.admin.IDevicePolicyManager$Stub.onTransact(IDevicePolicyManager.java:6966)
	at com.android.server.devicepolicy.DevicePolicyManagerService.onTransact(DevicePolicyManagerService.java:17958)
	at android.os.Binder.execTransactInternal(Binder.java:1197)
	at android.os.Binder.execTransact(Binder.java:1156)

表示手机系统存在多个 user ,激活 Dhizuku 过程中不允许其他 user 存在。其他 user 的产生可能是因为 app clone、double app、guest 和 multi-user functions ,详见官网说明。解决方法:官方说明里建议是从手机设置里直接删除有关双开应用,我采用的是相关明了的“暴力”手段:

[liy@liArch-inLe platform-tools]$ ./adb shell pm list users
Users:
	UserInfo{0:机主:c13} running
	UserInfo{10:隐私空间:2020410}
[liy@liArch-inLe platform-tools]$ ./adb shell pm remove-user 10
Success: removed user

再次运行 Dhizuku 激活命令即可。

Existing account 错误

[liy@liArch-inLe platform-tools]$ ./adb shell dpm set-device-owner com.rosan.dhizuku/.server.DhizukuDAReceiver

Exception occurred while executing 'set-device-owner':
java.lang.IllegalStateException: Not allowed to set the device owner because there are already some accounts on the device.
	at com.android.server.devicepolicy.DevicePolicyManagerService.enforceCanSetDeviceOwnerLocked(DevicePolicyManagerService.java:9645)
	at com.android.server.devicepolicy.DevicePolicyManagerService.setDeviceOwner(DevicePolicyManagerService.java:8568)
	at com.android.server.devicepolicy.DevicePolicyManagerServiceShellCommand.runSetDeviceOwner(DevicePolicyManagerServiceShellCommand.java:256)
	at com.android.server.devicepolicy.DevicePolicyManagerServiceShellCommand.onCommand(DevicePolicyManagerServiceShellCommand.java:89)
	at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97)
	at android.os.ShellCommand.exec(ShellCommand.java:38)
	at com.android.server.devicepolicy.DevicePolicyManagerService.onShellCommand(DevicePolicyManagerService.java:9967)
	at android.os.Binder.shellCommand(Binder.java:962)
	at android.os.Binder.onTransact(Binder.java:846)
	at android.app.admin.IDevicePolicyManager$Stub.onTransact(IDevicePolicyManager.java:6966)
	at com.android.server.devicepolicy.DevicePolicyManagerService.onTransact(DevicePolicyManagerService.java:17958)
	at android.os.Binder.execTransactInternal(Binder.java:1197)
	at android.os.Binder.execTransact(Binder.java:1156)

表示手机系统存在多个 account ,激活 Dhizuku 过程中需要删除所有的accounts。详见官网说明。这就需要用到之前准备的工具 Accounts 和 Hail 了,步骤如下:

  1. 打开 Accounts ,点击右上角按钮,导出到剪贴板。
  1. 打开 Hail 应用,先设置工作模式,选择Shizuku - 停用
  1. 从剪贴板导入
  1. 点击冻结按钮即可冻结相关 accounts 。

此时再运行再次运行 Dhizuku 激活命令即可激活。

上述两种错误结果可能会相继发生,次序不定,照上述方法解决即可。

启动运行 Amarok

进入设置界面,应用隐藏模式,选择Dhizuku 模式,确认即可应用 Amarok 隐藏文件和应用。

最后有关说明

  1. 照上激活 Dhizuku 后,如不是人为手动取消激活,重启后,Dhizuku 还是处于激活状态。
  2. 激活 Dhizuku 后,记得在 Hail 里解决刚已经冻结的 accounts 并删除,否则手机有些程序不能正常使用。