Lors du développement d'applications nécessitant root, la méthode la plus courante consiste à exécuter certaines commandes dans le shell su. Par exemple, il existe une application qui utilise la commande pm enable/disable
pour activer/désactiver les composants.
Cette méthode présente de très gros inconvénients :
Shizuku utilise une manière complètement différente. Voir la description détaillée ci-dessous.
https://shizuku.rikka.app/
Tout d’abord, nous devons parler de la manière dont les applications utilisent les API du système. Par exemple, si l'application souhaite installer des applications, nous savons tous que nous devons utiliser PackageManager#getInstalledPackages()
. Il s'agit en fait d'un processus de communication interprocessus (IPC) du processus d'application et du processus du serveur système, seul le framework Android a fait le travail interne pour nous.
Android utilise binder
pour effectuer ce type d'IPC. Binder
permet au côté serveur d'apprendre l'UID et le pid du côté client, afin que le serveur système puisse vérifier si l'application est autorisée à effectuer l'opération.
Habituellement, s'il existe un « gestionnaire » (par exemple, PackageManager
) pour les applications à utiliser, il devrait y avoir un « service » (par exemple, PackageManagerService
) dans le processus du serveur système. On peut simplement penser que si l'application détient le binder
du « service », elle peut communiquer avec le « service ». Le processus d'application recevra des classeurs de services système au démarrage.
Shizuku guide les utilisateurs pour exécuter d'abord un processus, le serveur Shizuku, avec root ou ADB. Lorsque l'application démarre, le binder
vers le serveur Shizuku sera également envoyé à l'application.
La fonctionnalité la plus importante fournie par Shizuku est quelque chose comme être un intermédiaire pour recevoir les demandes de l'application, les envoyer au serveur système et renvoyer les résultats. Vous pouvez voir la méthode transactRemote
dans la classe rikka.shizuku.server.ShizukuService
et la classe moe.shizuku.api.ShizukuBinderWrapper
pour les détails.
Nous avons donc atteint notre objectif : utiliser les API système avec des autorisations plus élevées. Et pour l’application, c’est presque identique à l’utilisation directe des API système.
https://github.com/RikkaApps/Shizuku-API
Les applications existantes fonctionnent toujours, bien sûr.
https://github.com/RikkaApps/Shizuku-API#migration-guide-for-existing-applications-use-shizuku-pre-v11
Les autorisations ADB sont limitées
ADB dispose d'autorisations limitées et différentes selon les versions du système. Vous pouvez voir les autorisations accordées à ADB ici.
Avant d'appeler l'API, vous pouvez utiliser ShizukuService#getUid
pour vérifier si Shizuku exécute l'utilisateur ADB, ou utiliser ShizukuService#checkPermission
pour vérifier si le serveur dispose des autorisations suffisantes.
Limitation cachée de l'API d'Android 9
Depuis Android 9, l'utilisation des API cachées est limitée pour les applications normales. Veuillez utiliser d'autres méthodes (telles que https://github.com/LSPosed/AndroidHiddenApiBypass).
Android 8.0 et BAD
À l'heure actuelle, la façon dont le service Shizuku obtient le processus d'application consiste à combiner IActivityManager#registerProcessObserver
et IActivityManager#registerUidObserver
(26+) pour garantir que le processus d'application sera envoyé au démarrage de l'application. Cependant, sur l'API 26, ADB ne dispose pas des autorisations nécessaires pour utiliser registerUidObserver
. Par conséquent, si vous devez utiliser Shizuku dans un processus qui pourrait ne pas être démarré par une activité, il est recommandé de déclencher le classeur d'envoi en démarrant une activité transparente.
L'utilisation directe de transactRemote
nécessite une attention particulière
L'API peut être différente selon les différentes versions d'Android, assurez-vous de la vérifier attentivement. De plus, android.app.IActivityManager
a le formulaire aidl dans l'API 26 et versions ultérieures, et android.app.IActivityManager$Stub
n'existe que sur l'API 26.
SystemServiceHelper.getTransactionCode
peut ne pas obtenir le code de transaction correct, tel que android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
n'existe pas sur l'API 25 et il existe android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47
(cette situation a été résolue avec, mais il n'est pas exclu qu'il puisse y avoir d'autres circonstances). Ce problème n'est pas rencontré avec la méthode ShizukuBinderWrapper
.
git clone --recurse-submodules
:manager:assembleDebug
ou :manager:assembleRelease
La tâche :manager:assembleDebug
génère un serveur déboguable. Vous pouvez attacher un débogueur à shizuku_server
pour déboguer le serveur. Sachez que, dans Android Studio, "Configurations Exécuter/Déboguer" - "Toujours installer avec le gestionnaire de packages" doit être coché, afin que le serveur utilise le dernier code.
Le code de ce projet est disponible sous la licence Apache-2.0.
Il vous est INTERDIT d'utiliser les fichiers image répertoriés ci-dessous de quelque manière que ce soit (sauf pour afficher Shizuku lui-même).
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
Pour le projet dans son ensemble, ce n’est pas gratuit. Il vous est INTERDIT de distribuer l'apk compilé par vous (y compris modifié, par exemple, renommer le nom de l'application "Shizuku" en autre chose) dans n'importe quel magasin (IBNLT Google Play Store, F-Droid, Amazon Appstore, etc.).