root を必要とするアプリを開発する場合、最も一般的な方法は、su シェルでいくつかのコマンドを実行することです。たとえば、 pm enable/disable
コマンドを使用してコンポーネントを有効または無効にするアプリがあります。
この方法には非常に大きな欠点があります。
雫は全く違うやり方をします。以下の詳細な説明を参照してください。
https://shizuku.rikka.app/
まず、アプリがシステム API をどのように使用するかについて説明する必要があります。たとえば、アプリがインストールされているアプリを取得したい場合、 PackageManager#getInstalledPackages()
使用する必要があることは誰もが知っています。これは実際にはアプリ プロセスとシステム サーバー プロセスのプロセス間通信 (IPC) プロセスであり、Android フレームワークが内部処理を行っているだけです。
Android はbinder
使用してこのタイプの IPC を実行します。 Binder
使用すると、サーバー側がクライアント側の uid と pid を学習できるため、システム サーバーはアプリに操作を実行する権限があるかどうかを確認できます。
通常、アプリが使用する「マネージャー」(例: PackageManager
) がある場合、システム サーバー プロセスに「サービス」(例: PackageManagerService
) が存在する必要があります。アプリが「サービス」のbinder
保持していれば、「サービス」と通信できると単純に考えることができます。アプリプロセスは、開始時にシステムサービスのバインダーを受け取ります。
Shizuku は、最初に root または ADB を使用してプロセス (Shizuku サーバー) を実行するようにユーザーをガイドします。アプリ起動時に雫サーバーへのbinder
もアプリに送信されます。
雫が提供する最も重要な機能は、アプリからのリクエストを受け取り、システムサーバーに送信し、結果を返す仲介者のようなものです。詳細はrikka.shizuku.server.ShizukuService
クラスのtransactRemote
メソッド、 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 の権限は限られており、システム バージョンによって異なります。ここで、ADB に付与された権限を確認できます。
API を呼び出す前に、 ShizukuService#getUid
使用して Shizuku がユーザー ADB を実行しているかどうかを確認するか、 ShizukuService#checkPermission
使用してサーバーに十分な権限があるかどうかを確認できます。
Android 9 からの隠れた API 制限
Android 9 以降、通常のアプリでは隠し API の使用が制限されています。他の方法 (https://github.com/LSPosed/AndroidHiddenApiBypass など) を使用してください。
Android 8.0 と ADB
現時点では、Shizuku サービスがアプリ プロセスを取得する方法は、 IActivityManager#registerProcessObserver
とIActivityManager#registerUidObserver
(26+) を組み合わせて、アプリの起動時にアプリ プロセスが送信されるようにすることです。ただし、API 26 では、ADB にregisterUidObserver
使用する権限がないため、アクティビティによって開始されない可能性のあるプロセスで Shizuku を使用する必要がある場合は、透過的なアクティビティを開始して送信バインダーをトリガーすることをお勧めします。
transactRemote
の直接使用には注意が必要です
Android のバージョンによって API が異なる場合がありますので、よくご確認ください。また、 android.app.IActivityManager
には API 26 以降の aidl 形式があり、 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 ストア、F-Droid、Amazon アプリストアなど) に配布することは禁止されています。