При разработке приложений, требующих root, наиболее распространенным методом является запуск некоторых команд в оболочке su. Например, есть приложение, которое использует команду pm enable/disable
для включения/выключения компонентов.
Этот метод имеет очень большие недостатки:
Шизуку использует совершенно другой способ. Подробное описание смотрите ниже.
https://shizuku.rikka.app/
Во-первых, нам нужно поговорить о том, как приложения используют системные API. Например, если приложение хочет получить установленные приложения, мы все знаем, что нам следует использовать PackageManager#getInstalledPackages()
. На самом деле это процесс межпроцессного взаимодействия (IPC) процесса приложения и процесса системного сервера, просто платформа Android выполнила за нас внутреннюю работу.
Android использует binder
для выполнения такого типа IPC. Binder
позволяет серверной стороне узнать uid и pid клиентской стороны, чтобы системный сервер мог проверить, имеет ли приложение разрешение на выполнение операции.
Обычно, если для приложений существует «менеджер» (например, PackageManager
), в процессе системного сервера должна быть и «служба» (например, PackageManagerService
). Мы можем просто подумать, что если приложение содержит binder
«сервиса», оно может взаимодействовать с «сервисом». При запуске процесс приложения получит привязки системных служб.
Shizuku предлагает пользователям сначала запустить процесс, сервер Shizuku, с помощью root или ADB. Когда приложение запускается, binder
к серверу Shizuku также будет отправлена в приложение.
Самая важная функция, которую предоставляет Shizuku, — это что-то вроде посредника, который получает запросы от приложения, отправляет их на системный сервер и отправляет обратно результаты. Вы можете увидеть метод transactRemote
в классе rikka.shizuku.server.ShizukuService
и классе moe.shizuku.api.ShizukuBinderWrapper
для получения подробной информации.
Итак, мы достигли своей цели — использовать системные API с более высоким разрешением. А для приложения это почти идентично использованию системных API напрямую.
https://github.com/RikkaApps/Shizuku-API
Существующие приложения, конечно, по-прежнему работают.
https://github.com/RikkaApps/Shizuku-API#migration-guide-for-existing-applications-use-shizuku-pre-v11
Разрешения АБР ограничены
ADB имеет ограниченные разрешения и различается в разных версиях системы. Вы можете увидеть разрешения, предоставленные ADB здесь.
Перед вызовом API вы можете использовать ShizukuService#getUid
, чтобы проверить, использует ли Shizuku пользовательский ADB, или использовать ShizukuService#checkPermission
, чтобы проверить, имеет ли сервер достаточные разрешения.
Скрытое ограничение API с Android 9
Начиная с Android 9, использование скрытых API ограничено для обычных приложений. Используйте другие методы (например, https://github.com/LSPosed/AndroidHiddenApiBypass).
Android 8.0 и АБР
В настоящее время способ, которым служба Shizuku получает процесс приложения, заключается в объединении IActivityManager#registerProcessObserver
и IActivityManager#registerUidObserver
(26+), чтобы гарантировать, что процесс приложения будет отправлен при запуске приложения. Однако в API 26 у ADB нет разрешений на использование registerUidObserver
, поэтому, если вам нужно использовать Shizuku в процессе, который не может быть запущен действием, рекомендуется активировать связыватель отправки, запустив прозрачное действие.
Прямое использование transactRemote
требует внимания.
API может отличаться в разных версиях Android, обязательно проверьте его внимательно. Кроме того, android.app.IActivityManager
имеет форму helpl в API 26 и более поздних версиях, а android.app.IActivityManager$Stub
существует только в API 26.
SystemServiceHelper.getTransactionCode
может не получить правильный код транзакции, например, android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
не существует в API 25, и существует android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47
(эта ситуация уже решена) с, но не исключено, что могут быть и другие обстоятельства). Эта проблема не возникает при использовании метода ShizukuBinderWrapper
.
git clone --recurse-submodules
:manager:assembleDebug
или :manager:assembleRelease
Задача :manager:assembleDebug
создает отлаживаемый сервер. Вы можете подключить отладчик к shizuku_server
для отладки сервера. Имейте в виду, что в Android Studio следует выбрать «Запуск/отладка конфигураций» — «Всегда устанавливать с помощью диспетчера пакетов», чтобы сервер использовал последнюю версию кода.
Код этого проекта доступен по лицензии Apache-2.0.
Вам ЗАПРЕЩАЕТСЯ каким-либо образом использовать файлы изображений, перечисленные ниже (за исключением отображения самого Сидзуку).
manager/src/main/res/mipmap-hdpi/ic_launcher.png
manager/src/main/res/mipmap-hdpi/ic_launcher_background.png
manager/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
manager/src/main/res/mipmap-xhdpi/ic_launcher.png
manager/src/main/res/mipmap-xhdpi/ic_launcher_background.png
manager/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
manager/src/main/res/mipmap-xxhdpi/ic_launcher.png
manager/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
manager/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
manager/src/main/res/mipmap-xxxhdpi/ic_launcher.png
manager/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
manager/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Для проекта в целом это не бесплатно. Вам ЗАПРЕЩАЕТСЯ распространять скомпилированный вами APK (в том числе измененный, например, переименовать название приложения «Shizuku» во что-то другое) в любой магазин (IBNLT Google Play Store, F-Droid, Amazon Appstore и т. д.).