在開發需要 root 的應用程式時,最常見的方法是在 su shell 中執行一些命令。例如,有一個應用程式使用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 伺服器。當應用程式啟動時,Shizuku 伺服器的binder
也會傳送到應用程式。
Shizuku 提供的最重要的功能是充當中間人,接收來自應用程式的請求,將其發送到系統伺服器,然後發回結果。詳細資訊可以查看rikka.shizuku.server.ShizukuService
類別和moe.shizuku.api.ShizukuBinderWrapper
類別中的transactRemote
方法。
這樣,我們就達到了我們的目標,使用更高權限的系統API。而對app來說,幾乎和直接使用系統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)。
安卓 8.0 和亞銀
目前Shizuku服務取得app進程的方式是結合IActivityManager#registerProcessObserver
和IActivityManager#registerUidObserver
(26+)來確保app啟動時傳送app進程。但是,在 API 26 上,ADB 缺乏使用registerUidObserver
的權限,因此如果您需要在可能不是由 Activity 啟動的進程中使用 Shizuku,建議透過啟動透明 Activity 來觸發傳送綁定器。
直接使用transactRemote
需要注意
不同Android版本下API可能會有所不同,請務必仔細查看。此外, android.app.IActivityManager
在 API 26 及更高版本中具有 aidl 形式,且android.app.IActivityManager$Stub
僅存在於 API 26 上。
SystemServiceHelper.getTransactionCode
可能無法取得到正確的交易碼,例如API 25上不存在android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
而存在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 授權下取得。
您禁止以任何方式使用下面列出的圖像檔案(除非用於顯示 Shizuku 本身)。
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 等)。