Saat mengembangkan aplikasi yang memerlukan root, metode paling umum adalah menjalankan beberapa perintah di su shell. Misalnya, ada aplikasi yang menggunakan perintah pm enable/disable
untuk mengaktifkan/menonaktifkan komponen.
Metode ini memiliki kelemahan yang sangat besar:
Shizuku menggunakan cara yang sangat berbeda. Lihat penjelasan rinci di bawah ini.
https://shizuku.rikka.app/
Pertama, kita perlu membahas tentang bagaimana aplikasi menggunakan API sistem. Misalnya, jika aplikasi ingin menginstal aplikasi, kita semua tahu bahwa kita harus menggunakan PackageManager#getInstalledPackages()
. Ini sebenarnya adalah proses komunikasi antarproses (IPC) dari proses aplikasi dan proses server sistem, hanya kerangka Android yang melakukan pekerjaannya untuk kami.
Android menggunakan binder
untuk melakukan IPC jenis ini. Binder
memungkinkan sisi server mempelajari uid dan pid sisi klien, sehingga server sistem dapat memeriksa apakah aplikasi memiliki izin untuk melakukan operasi.
Biasanya, jika ada "manajer" (misalnya, PackageManager
) untuk digunakan oleh aplikasi, harus ada "layanan" (misalnya, PackageManagerService
) dalam proses server sistem. Kita bisa berpikir jika aplikasi memegang binder
"layanan", maka aplikasi tersebut dapat berkomunikasi dengan "layanan". Proses aplikasi akan menerima pengikat layanan sistem saat dimulai.
Shizuku memandu pengguna untuk menjalankan suatu proses, server Shizuku, dengan root atau ADB terlebih dahulu. Saat aplikasi dimulai, binder
ke server Shizuku juga akan dikirim ke aplikasi.
Fitur terpenting yang Shizuku sediakan adalah menjadi perantara untuk menerima permintaan dari aplikasi, mengirimkannya ke server sistem, dan mengirimkan kembali hasilnya. Anda dapat melihat metode transactRemote
di kelas rikka.shizuku.server.ShizukuService
, dan kelas moe.shizuku.api.ShizukuBinderWrapper
untuk detailnya.
Jadi, kami mencapai tujuan kami, menggunakan API sistem dengan izin lebih tinggi. Dan untuk aplikasinya, hampir identik dengan penggunaan API sistem secara langsung.
https://github.com/RikkaApps/Shizuku-API
Tentu saja, aplikasi yang ada masih berfungsi.
https://github.com/RikkaApps/Shizuku-API#migration-guide-for-Existing-applications-use-shizuku-pre-v11
Izin ADB terbatas
ADB memiliki izin yang terbatas dan berbeda pada berbagai versi sistem. Anda dapat melihat izin yang diberikan kepada ADB di sini.
Sebelum memanggil API, Anda dapat menggunakan ShizukuService#getUid
untuk memeriksa apakah Shizuku menjalankan ADB pengguna, atau menggunakan ShizukuService#checkPermission
untuk memeriksa apakah server memiliki izin yang memadai.
Batasan API tersembunyi dari Android 9
Mulai Android 9, penggunaan API tersembunyi dibatasi untuk aplikasi normal. Silakan gunakan metode lain (seperti https://github.com/LSPosed/AndroidHiddenApiBypass).
Android 8.0 & ADB
Saat ini, cara layanan Shizuku mendapatkan proses aplikasi adalah dengan menggabungkan IActivityManager#registerProcessObserver
dan IActivityManager#registerUidObserver
(26+) untuk memastikan bahwa proses aplikasi akan dikirim saat aplikasi dimulai. Namun, pada API 26, ADB tidak memiliki izin untuk menggunakan registerUidObserver
, jadi jika Anda perlu menggunakan Shizuku dalam proses yang mungkin tidak dimulai oleh suatu Aktivitas, disarankan untuk memicu pengikat pengiriman dengan memulai aktivitas transparan.
Penggunaan langsung transactRemote
memerlukan perhatian
API mungkin berbeda pada versi Android yang berbeda, pastikan untuk memeriksanya dengan cermat. Selain itu, android.app.IActivityManager
memiliki formulir aidl di API 26 dan yang lebih baru, dan android.app.IActivityManager$Stub
hanya ada di API 26.
SystemServiceHelper.getTransactionCode
mungkin tidak mendapatkan kode transaksi yang benar, seperti android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
tidak ada di API 25 dan ada android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47
(situasi ini telah ditangani dengan, tetapi tidak menutup kemungkinan bahwa mungkin ada keadaan lain). Masalah ini tidak terjadi pada metode ShizukuBinderWrapper
.
git clone --recurse-submodules
:manager:assembleDebug
atau :manager:assembleRelease
Tugas :manager:assembleDebug
menghasilkan server yang dapat di-debug. Anda dapat memasang debugger ke shizuku_server
untuk men-debug server. Perlu diketahui bahwa, di Android Studio, "Konfigurasi Jalankan/Debug" - "Selalu instal dengan manajer paket" harus dicentang, sehingga server akan menggunakan kode terbaru.
Kode untuk proyek ini tersedia di bawah lisensi Apache-2.0.
Anda DILARANG menggunakan file gambar yang tercantum di bawah ini dengan cara apa pun (kecuali untuk menampilkan Shizuku sendiri).
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
Untuk proyek secara keseluruhan, ini tidak gratis. Anda DILARANG mendistribusikan apk yang Anda kompilasi (termasuk yang dimodifikasi, misalnya mengganti nama aplikasi "Shizuku" menjadi yang lain) ke toko mana pun (IBNLT Google Play Store, F-Droid, Amazon Appstore, dll.).