เมื่อพัฒนาแอปที่ต้องใช้การรูท วิธีการที่พบบ่อยที่สุดคือการรันคำสั่งบางคำสั่งใน su shell ตัวอย่างเช่น มีแอปที่ใช้คำสั่ง 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 มีสิทธิ์ที่จำกัดและแตกต่างกันไปตามเวอร์ชันของระบบต่างๆ คุณสามารถดูสิทธิ์ที่มอบให้กับ ADB ได้ที่นี่
ก่อนที่จะเรียกใช้ API คุณสามารถใช้ ShizukuService#getUid
เพื่อตรวจสอบว่า Shizuku กำลังใช้งาน ADB ของผู้ใช้อยู่หรือไม่ หรือใช้ ShizukuService#checkPermission
เพื่อตรวจสอบว่าเซิร์ฟเวอร์มีสิทธิ์เพียงพอหรือไม่
ข้อ จำกัด API ที่ซ่อนอยู่จาก Android 9
ตั้งแต่ Android 9 การใช้งาน API ที่ซ่อนอยู่จะถูกจำกัดสำหรับแอปทั่วไป โปรดใช้วิธีการอื่น (เช่น https://github.com/LSPosed/AndroidHiddenApiBypass)
ระบบปฏิบัติการ Android 8.0 และ ADB
ในปัจจุบัน วิธีที่บริการ Shizuku ได้รับกระบวนการแอปคือการรวม IActivityManager#registerProcessObserver
และ IActivityManager#registerUidObserver
(26+) เพื่อให้แน่ใจว่ากระบวนการของแอปจะถูกส่งเมื่อแอปเริ่มทำงาน อย่างไรก็ตาม บน API 26 นั้น ADB ขาดสิทธิ์ในการใช้ registerUidObserver
ดังนั้น หากคุณต้องการใช้ Shizuku ในกระบวนการที่อาจไม่ได้เริ่มต้นโดยกิจกรรม ขอแนะนำให้ทริกเกอร์ send Binder โดยเริ่มกิจกรรมที่โปร่งใส
การใช้ transactRemote
โดยตรงต้องได้รับการดูแล
API อาจแตกต่างกันไปตามเวอร์ชัน Android ที่แตกต่างกัน โปรดตรวจสอบอย่างละเอียด นอกจากนี้ android.app.IActivityManager
ยังมีแบบฟอร์มช่วยเหลือใน 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 ควรตรวจสอบ "การกำหนดค่า Run/Debug" - "ติดตั้งด้วยตัวจัดการแพ็คเกจเสมอ" เพื่อให้เซิร์ฟเวอร์ใช้โค้ดล่าสุด
รหัสสำหรับโครงการนี้มีอยู่ภายใต้ใบอนุญาต 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 ฯลฯ)