루트가 필요한 앱을 개발할 때 가장 일반적인 방법은 su 셸에서 일부 명령을 실행하는 것입니다. 예를 들어 pm enable/disable
명령을 사용하여 구성 요소를 활성화/비활성화하는 앱이 있습니다.
이 방법에는 매우 큰 단점이 있습니다.
Shizuku는 완전히 다른 방식을 사용합니다. 아래의 자세한 설명을 참조하세요.
https://shizuku.rikka.app/
먼저 앱이 시스템 API를 사용하는 방법에 대해 이야기해야 합니다. 예를 들어, 앱이 앱을 설치하려는 경우 PackageManager#getInstalledPackages()
사용해야 한다는 것을 우리 모두 알고 있습니다. 이는 실제로 앱 프로세스와 시스템 서버 프로세스의 프로세스 간 통신(IPC) 프로세스이며 Android 프레임워크가 우리를 위해 내부 작업을 수행했습니다.
Android는 이러한 유형의 IPC를 수행하기 위해 binder
사용합니다. Binder
사용하면 서버 측에서 클라이언트 측의 uid 및 pid를 학습할 수 있으므로 시스템 서버에서 앱에 작업을 수행할 권한이 있는지 확인할 수 있습니다.
일반적으로 앱이 사용할 "관리자"(예: PackageManager
)가 있는 경우 시스템 서버 프로세스에는 "서비스"(예: PackageManagerService
)가 있어야 합니다. 앱이 "서비스" binder
보유하고 있다면 "서비스"와 통신할 수 있다고 간단히 생각할 수 있습니다. 앱 프로세스는 시작 시 시스템 서비스 바인더를 받습니다.
Shizuku는 사용자에게 먼저 루트 또는 ADB를 사용하여 Shizuku 서버 프로세스를 실행하도록 안내합니다. 앱이 시작되면 Shizuku 서버의 binder
도 앱으로 전송됩니다.
Shizuku가 제공하는 가장 중요한 기능은 앱에서 요청을 받아 시스템 서버로 보내고 결과를 다시 보내는 중개자가 되는 것과 같은 것입니다. 자세한 내용은 rikka.shizuku.server.ShizukuService
클래스와 moe.shizuku.api.ShizukuBinderWrapper
클래스에서 transactRemote
메서드를 참조하세요.
그래서 우리는 더 높은 권한으로 시스템 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)을 사용하세요.
안드로이드 8.0 및 ADB
현재 Shizuku 서비스가 앱 프로세스를 가져오는 방법은 IActivityManager#registerProcessObserver
및 IActivityManager#registerUidObserver
(26+)를 결합하여 앱이 시작될 때 앱 프로세스가 전송되도록 하는 것입니다. 그러나 API 26에서는 ADB에 registerUidObserver
사용할 수 있는 권한이 없으므로 활동에 의해 시작되지 않을 수 있는 프로세스에서 Shizuku를 사용해야 하는 경우 투명 활동을 시작하여 전송 바인더를 트리거하는 것이 좋습니다.
transactRemote
를 직접 사용하려면 주의가 필요합니다.
API는 Android 버전에 따라 다를 수 있으므로 주의 깊게 확인하시기 바랍니다. 또한 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 Store, F-Droid, Amazon Appstore 등)에 배포하는 것이 금지되어 있습니다.