├── .gitattributes
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── config.yml
│ └── feature_request.md
├── dependabot.yml
└── workflows
│ └── app.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── SECURITY.md
├── build.gradle
├── common
├── .gitignore
├── build.gradle
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── moe
│ └── shizuku
│ └── common
│ └── util
│ ├── BuildUtils.java
│ └── OsUtils.java
├── gradle-mavenizer.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── manager
├── .gitignore
├── aapt2-resources.cfg
├── build.gradle
├── proguard-rules.pro
├── release
│ └── output-metadata.json
└── src
│ └── main
│ ├── .gitignore
│ ├── AndroidManifest.xml
│ ├── assets
│ └── rish
│ ├── java
│ └── moe
│ │ └── shizuku
│ │ └── manager
│ │ ├── AppConstants.java
│ │ ├── Helps.java
│ │ ├── MainActivity.java
│ │ ├── Manifest.java
│ │ ├── ShizukuApplication.kt
│ │ ├── ShizukuManagerProvider.kt
│ │ ├── ShizukuSettings.java
│ │ ├── adb
│ │ ├── AdbClient.kt
│ │ ├── AdbException.kt
│ │ ├── AdbKey.kt
│ │ ├── AdbMdns.kt
│ │ ├── AdbMessage.kt
│ │ ├── AdbPairingClient.kt
│ │ ├── AdbPairingService.kt
│ │ ├── AdbPairingTutorialActivity.kt
│ │ └── AdbProtocol.kt
│ │ ├── app
│ │ ├── AppActivity.kt
│ │ ├── AppBarActivity.kt
│ │ └── ThemeHelper.java
│ │ ├── authorization
│ │ ├── AuthorizationManager.kt
│ │ └── RequestPermissionActivity.kt
│ │ ├── home
│ │ ├── AdbDialogFragment.kt
│ │ ├── AdbPairDialogFragment.kt
│ │ ├── AdbPermissionLimitedViewHolder.kt
│ │ ├── DaemonViewHolder.kt
│ │ ├── HomeActivity.kt
│ │ ├── HomeAdapter.kt
│ │ ├── HomeViewModel.kt
│ │ ├── LearnMoreViewHolder.kt
│ │ ├── ManageAppsViewHolder.kt
│ │ ├── RemoteControlViewHolder.kt
│ │ ├── ServerStatusViewHolder.kt
│ │ ├── StartAdbViewHolder.kt
│ │ ├── StartRootViewHolder.kt
│ │ ├── StartWirelessAdbViewHolder.kt
│ │ ├── SystemManagerViewHolder.kt
│ │ ├── TerminalViewHolder.kt
│ │ └── WadbNotEnabledDialogFragment.kt
│ │ ├── ktx
│ │ ├── Context.kt
│ │ ├── Log.kt
│ │ ├── PackageManager.kt
│ │ ├── RecyclerView.kt
│ │ └── String.kt
│ │ ├── legacy
│ │ ├── LegacyIsNotSupportedActivity.kt
│ │ └── ShellRequestHandlerActivity.kt
│ │ ├── management
│ │ ├── AppViewHolder.kt
│ │ ├── ApplicationManagementActivity.kt
│ │ ├── AppsAdapter.java
│ │ ├── AppsViewModel.kt
│ │ └── EmptyViewHolder.kt
│ │ ├── model
│ │ └── ServiceStatus.kt
│ │ ├── receiver
│ │ ├── BootCompleteReceiver.kt
│ │ └── ShizukuReceiver.kt
│ │ ├── settings
│ │ ├── IntegerSimpleMenuPreference.java
│ │ ├── SettingsActivity.kt
│ │ └── SettingsFragment.kt
│ │ ├── shell
│ │ ├── Shell.java
│ │ ├── ShellBinderRequestHandler.kt
│ │ └── ShellTutorialActivity.kt
│ │ ├── starter
│ │ ├── Starter.kt
│ │ └── StarterActivity.kt
│ │ ├── utils
│ │ ├── AppIconCache.kt
│ │ ├── CustomTabsHelper.java
│ │ ├── EmptySharedPreferencesImpl.java
│ │ ├── EnvironmentUtils.kt
│ │ ├── Logger.java
│ │ ├── MultiLocaleEntity.java
│ │ ├── ShizukuSystemApis.kt
│ │ ├── UserHandleCompat.java
│ │ └── UserInfoCompat.java
│ │ └── widget
│ │ ├── CheckedImageView.java
│ │ └── VerticalPaddingDecoration.java
│ ├── jni
│ ├── CMakeLists.txt
│ ├── adb_pairing.cpp
│ ├── adb_pairing.h
│ ├── android.cpp
│ ├── android.h
│ ├── cgroup.cpp
│ ├── cgroup.h
│ ├── helper.cpp
│ ├── logging.h
│ ├── misc.cpp
│ ├── misc.h
│ ├── selinux.cpp
│ ├── selinux.h
│ └── starter.cpp
│ └── res
│ ├── animator
│ └── alpha_animator.xml
│ ├── color-night
│ ├── home_card_background_color.xml
│ └── home_card_foreground_color.xml
│ ├── color
│ ├── grant_permissions_button_ripple_color_selector.xml
│ ├── home_card_background_color.xml
│ └── home_card_foreground_color.xml
│ ├── drawable-v24
│ └── ic_default_app_icon_foreground.xml
│ ├── drawable-v26
│ ├── ic_default_app_icon.xml
│ └── ic_launcher.xml
│ ├── drawable
│ ├── card_btn_background.xml
│ ├── grant_permissions_buttons_bottom.xml
│ ├── grant_permissions_buttons_top.xml
│ ├── home_card_foreground.xml
│ ├── ic_action_about_24dp.xml
│ ├── ic_action_settings_24dp.xml
│ ├── ic_adb_24dp.xml
│ ├── ic_baseline_link_24.xml
│ ├── ic_close_24.xml
│ ├── ic_code_24dp.xml
│ ├── ic_default_app_icon_background.xml
│ ├── ic_help_outline_24dp.xml
│ ├── ic_launcher.xml
│ ├── ic_learn_more_24dp.xml
│ ├── ic_monochrome.xml
│ ├── ic_numeric_1_circle_outline_24.xml
│ ├── ic_numeric_2_circle_outline_24.xml
│ ├── ic_numeric_3_circle_outline_24.xml
│ ├── ic_outline_arrow_upward_24.xml
│ ├── ic_outline_dark_mode_24.xml
│ ├── ic_outline_info_24.xml
│ ├── ic_outline_notifications_active_24.xml
│ ├── ic_outline_open_in_new_24.xml
│ ├── ic_outline_play_arrow_24.xml
│ ├── ic_outline_translate_24.xml
│ ├── ic_root_24dp.xml
│ ├── ic_server_error_24dp.xml
│ ├── ic_server_ok_24dp.xml
│ ├── ic_server_restart.xml
│ ├── ic_server_start_24dp.xml
│ ├── ic_settings_outline_24dp.xml
│ ├── ic_system_icon.xml
│ ├── ic_terminal_24.xml
│ ├── ic_wadb_24.xml
│ ├── ic_warning_24.xml
│ └── shape_circle_icon_background.xml
│ ├── layout
│ ├── about_dialog.xml
│ ├── adb_dialog.xml
│ ├── adb_pair_dialog.xml
│ ├── adb_pairing_tutorial_activity.xml
│ ├── app_list_empty.xml
│ ├── app_list_item.xml
│ ├── appbar.xml
│ ├── appbar_activity.xml
│ ├── appbar_fragment_activity.xml
│ ├── apps_activity.xml
│ ├── confirmation_dialog.xml
│ ├── home_activity.xml
│ ├── home_daemon.xml
│ ├── home_extra_step_required.xml
│ ├── home_item_container.xml
│ ├── home_learn_more.xml
│ ├── home_manage_apps_item.xml
│ ├── home_manage_system.xml
│ ├── home_remote_control.xml
│ ├── home_server_status.xml
│ ├── home_start_adb.xml
│ ├── home_start_root.xml
│ ├── home_start_wireless_adb.xml
│ ├── home_terminal.xml
│ ├── preference_recyclerview.xml
│ ├── shell_dialog.xml
│ ├── starter_activity.xml
│ └── terminal_tutorial_activity.xml
│ ├── menu
│ └── main.xml
│ ├── mipmap-hdpi
│ ├── ic_launcher.png
│ ├── ic_launcher_background.png
│ └── ic_launcher_foreground.png
│ ├── mipmap-xhdpi
│ ├── banner.png
│ ├── ic_launcher.png
│ ├── ic_launcher_background.png
│ └── ic_launcher_foreground.png
│ ├── mipmap-xxhdpi
│ ├── ic_launcher.png
│ ├── ic_launcher_background.png
│ └── ic_launcher_foreground.png
│ ├── mipmap-xxxhdpi
│ ├── ic_launcher.png
│ ├── ic_launcher_background.png
│ └── ic_launcher_foreground.png
│ ├── raw
│ └── start.sh
│ ├── values-ang
│ └── strings.xml
│ ├── values-ar
│ └── strings.xml
│ ├── values-ars
│ └── strings.xml
│ ├── values-az
│ └── strings.xml
│ ├── values-b+es+419
│ └── strings.xml
│ ├── values-bg
│ └── strings.xml
│ ├── values-bn
│ └── strings.xml
│ ├── values-ca
│ └── strings.xml
│ ├── values-cs
│ └── strings.xml
│ ├── values-da
│ └── strings.xml
│ ├── values-de
│ └── strings.xml
│ ├── values-el
│ └── strings.xml
│ ├── values-enm
│ └── strings.xml
│ ├── values-eo
│ └── strings.xml
│ ├── values-es-rCL
│ └── strings.xml
│ ├── values-es
│ └── strings.xml
│ ├── values-et
│ └── strings.xml
│ ├── values-fa
│ └── strings.xml
│ ├── values-fil
│ └── strings.xml
│ ├── values-fr
│ └── strings.xml
│ ├── values-he
│ └── strings.xml
│ ├── values-hr
│ └── strings.xml
│ ├── values-hu
│ └── strings.xml
│ ├── values-hy
│ └── strings.xml
│ ├── values-id
│ └── strings.xml
│ ├── values-it
│ └── strings.xml
│ ├── values-ja
│ └── strings.xml
│ ├── values-ka
│ └── strings.xml
│ ├── values-kk
│ └── strings.xml
│ ├── values-ko
│ └── strings.xml
│ ├── values-lb
│ └── strings.xml
│ ├── values-ml
│ └── strings.xml
│ ├── values-ms
│ └── strings.xml
│ ├── values-my
│ └── strings.xml
│ ├── values-night
│ └── styles.xml
│ ├── values-nl
│ └── strings.xml
│ ├── values-or
│ └── strings.xml
│ ├── values-pl
│ └── strings.xml
│ ├── values-pt-rBR
│ └── strings.xml
│ ├── values-pt
│ └── strings.xml
│ ├── values-ro
│ └── strings.xml
│ ├── values-ru
│ └── strings.xml
│ ├── values-sk
│ └── strings.xml
│ ├── values-sl
│ └── strings.xml
│ ├── values-sr
│ └── strings.xml
│ ├── values-sv
│ └── strings.xml
│ ├── values-sw600dp
│ ├── bools.xml
│ ├── dimens.xml
│ └── values.xml
│ ├── values-ta
│ └── strings.xml
│ ├── values-th
│ └── strings.xml
│ ├── values-tr
│ └── strings.xml
│ ├── values-ug
│ └── strings.xml
│ ├── values-uk
│ └── strings.xml
│ ├── values-ur
│ └── strings.xml
│ ├── values-v21
│ └── themes_override.xml
│ ├── values-v31
│ └── themes_overlay.xml
│ ├── values-vi
│ └── strings.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ ├── values
│ ├── arrays.xml
│ ├── attrs.xml
│ ├── bools.xml
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ ├── strings_untranslatable.xml
│ ├── styles.xml
│ ├── themes.xml
│ ├── themes_overlay.xml
│ └── values.xml
│ └── xml
│ ├── backup_descriptor.xml
│ ├── data_extraction_rules.xml
│ └── settings.xml
├── server
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── rikka
│ └── shizuku
│ └── server
│ ├── ApkChangedObservers.kt
│ ├── BinderSender.java
│ ├── ServerConstants.java
│ ├── ShizukuClientManager.java
│ ├── ShizukuConfig.java
│ ├── ShizukuConfigManager.java
│ ├── ShizukuService.java
│ ├── ShizukuUserServiceManager.java
│ ├── api
│ └── IContentProviderUtils.java
│ └── ktx
│ └── Handler.kt
├── settings.gradle
├── shell
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── rikka
│ └── shizuku
│ └── shell
│ └── ShizukuShellLoader.java
├── signing.gradle
└── starter
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
└── main
├── AndroidManifest.xml
└── java
└── moe
└── shizuku
└── starter
├── ServiceStarter.java
└── util
└── IContentProviderCompat.java
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto eol=lf
2 |
3 | *.bat text eol=crlf
4 | *.jar binary
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
14 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Report a bug of Shizuku
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | Please report bugs of Shizuku itself.
11 |
12 | **Requirements:**
13 |
14 | - [ ] Shizuku version is up-to-date
15 | - [ ] Shizuku is downloaded from official channels (GitHub release or Google Play)
16 | - [ ] Shizuku is not running in a virtual environment or broken ROM (GrapheneOS)
17 | - [ ] (Root users) No Xposed installed / Xposed is not enabled for Shizuku
18 |
19 | Change "[ ]" to "[x]" if it meets the requirements.
20 |
21 | **Reports not meet the requirements will be immediately closed**.
22 |
23 | **Information:**
24 |
25 | - Shizuku version:
26 | - Mode: [adb, root]
27 | - Android version:
28 | - Device: (optional)
29 |
30 | **Logs:**
31 |
32 | Related **full logcat**.
33 |
34 | **Describe the bug:**
35 |
36 | A clear and concise description of what the bug is.
37 |
38 | **Additional context:**
39 |
40 | Add any other context about the problem here.
41 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "" # See documentation for possible values
9 | directory: "/" # Location of package manifests
10 | schedule:
11 | interval: "weekly"
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 | /.idea
11 | /manager/signing.properties
12 | /out
13 | /signing.properties
14 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "gradle-maven-plugin"]
2 | path = gradle-maven-plugin
3 | url = https://github.com/sky-uk/gradle-maven-plugin/
4 | [submodule "api"]
5 | path = api
6 | url = git@github.com:RikkaApps/Shizuku-API.git
7 | branch = master
8 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | Use this section to tell people about which versions of your project are
6 | currently being supported with security updates.
7 |
8 | | Version | Supported |
9 | | ------- | ------------------ |
10 | | 5.1.x | :white_check_mark: |
11 | | 5.0.x | :x: |
12 | | 4.0.x | :white_check_mark: |
13 | | < 4.0 | :x: |
14 |
15 | ## Reporting a Vulnerability
16 |
17 | Use this section to tell people how to report a vulnerability.
18 |
19 | Tell them where to go, how often they can expect to get an update on a
20 | reported vulnerability, what to expect if the vulnerability is accepted or
21 | declined, etc.
22 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | apply from: 'api/manifest.gradle'
3 | ext.kotlinVersion = '1.8.0'
4 | repositories {
5 | google()
6 | mavenCentral()
7 | }
8 | dependencies {
9 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
10 | }
11 | }
12 |
13 | plugins {
14 | id 'com.android.application' version '8.0.2' apply false
15 | id 'com.android.library' version '8.0.2' apply false
16 | id 'org.jetbrains.kotlin.jvm' version '1.8.0' apply false
17 | id 'dev.rikka.tools.autoresconfig' version '1.2.1' apply false
18 | id 'dev.rikka.tools.materialthemebuilder' version '1.3.3' apply false
19 | alias libs.plugins.refine apply false
20 | }
21 |
22 | apply plugin: 'idea'
23 |
24 | idea.module {
25 | excludeDirs += file('out')
26 | }
27 |
28 | allprojects {
29 | tasks.withType(Javadoc).tap {
30 | configureEach {
31 | failOnError false
32 | options.addStringOption('Xdoclint:none', '-quiet')
33 | }
34 | }
35 | }
36 |
37 | subprojects {
38 | plugins.withId("com.android.base") {
39 | plugins.apply('dev.rikka.tools.refine')
40 |
41 | android {
42 | compileSdk = 33
43 | defaultConfig {
44 | minSdk = 23
45 | targetSdk = 33
46 | }
47 | compileOptions {
48 | sourceCompatibility = JavaVersion.VERSION_17
49 | targetCompatibility = JavaVersion.VERSION_17
50 | }
51 | buildFeatures {
52 | aidl true
53 | }
54 | }
55 | }
56 | }
57 |
58 | tasks.register('clean', Delete) {
59 | delete rootProject.buildDir
60 | }
61 |
62 | def gitCommitId = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()
63 | def gitCommitCount = Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim())
64 | def baseVersionName = "${api_version_major}.5.3"
65 | ext {
66 | minSdkVersion = 23
67 | targetSdkVersion = 33
68 | versionCode = gitCommitCount
69 | versionName = "${baseVersionName}.r${gitCommitCount}.${gitCommitId}"
70 | }
71 |
--------------------------------------------------------------------------------
/common/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/common/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.library'
3 | }
4 |
5 | android {
6 | namespace 'rikka.shizuku.common'
7 | buildFeatures {
8 | buildConfig = false
9 | }
10 | }
11 |
12 | dependencies {
13 | compileOnly libs.hidden.stub
14 | }
15 |
--------------------------------------------------------------------------------
/common/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/common/src/main/java/moe/shizuku/common/util/BuildUtils.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.common.util;
2 |
3 | import android.os.Build;
4 |
5 | /**
6 | * TODO: Replace it with {@link rikka.core.util.BuildUtils}.
7 | */
8 | public class BuildUtils {
9 |
10 | private static final int SDK = Build.VERSION.SDK_INT;
11 |
12 | private static final int PREVIEW_SDK = SDK >= 23 ? Build.VERSION.PREVIEW_SDK_INT : 0;
13 |
14 | public static boolean atLeast31() {
15 | return SDK >= 31 || SDK == 30 && PREVIEW_SDK > 0;
16 | }
17 |
18 | public static boolean atLeast30() {
19 | return SDK >= 30;
20 | }
21 |
22 | public static boolean atLeast29() {
23 | return SDK >= 29;
24 | }
25 |
26 | public static boolean atLeast28() {
27 | return SDK >= 28;
28 | }
29 |
30 | public static boolean atLeast26() {
31 | return SDK >= 26;
32 | }
33 |
34 | public static boolean atLeast24() {
35 | return SDK >= 24;
36 | }
37 |
38 | public static boolean atLeast23() {
39 | return SDK >= 23;
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/common/src/main/java/moe/shizuku/common/util/OsUtils.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.common.util;
2 |
3 | import android.os.SELinux;
4 |
5 | public class OsUtils {
6 |
7 | private static final int UID = android.system.Os.getuid();
8 | private static final int PID = android.system.Os.getpid();
9 | private static final String SELINUX_CONTEXT;
10 |
11 | static {
12 | String context;
13 | try {
14 | context = SELinux.getContext();
15 | } catch (Throwable tr) {
16 | context = null;
17 | }
18 | SELINUX_CONTEXT = context;
19 | }
20 |
21 |
22 | public static int getUid() {
23 | return UID;
24 | }
25 |
26 | public static int getPid() {
27 | return PID;
28 | }
29 |
30 | public static String getSELinuxContext() {
31 | return SELINUX_CONTEXT;
32 | }
33 | }
34 |
35 |
--------------------------------------------------------------------------------
/gradle-mavenizer.gradle:
--------------------------------------------------------------------------------
1 | if (!rootProject.file('gradle-maven-plugin/gradle-mavenizer.gradle').exists()) {
2 | return
3 | }
4 |
5 | apply plugin: 'maven-publish'
6 |
7 | apply from: project.rootProject.file('gradle-maven-plugin/utils.gradle')
8 | apply from: project.rootProject.file('gradle-maven-plugin/artifact-javadoc-handler.gradle')
9 | apply from: project.rootProject.file('gradle-maven-plugin/artifact-pom-manager.gradle')
10 |
11 | project.afterEvaluate {
12 | publishing {
13 | publications {
14 | mavenPublish(MavenPublication) {
15 | if (isAndroidProject()) {
16 | artifact bundleReleaseAar
17 | artifact androidJavadocsJar
18 | artifact androidSourcesJar
19 | } else {
20 | artifact jar
21 | artifact sourcesJar
22 | artifact javadocJar
23 | }
24 |
25 | decoratePom(pom)
26 | }
27 | }
28 |
29 | repositories {
30 | def isToRemoteRepo = getBooleanProperty("mavPublishToRemoteRepo")
31 | def isToInternalRepo = getBooleanProperty("mavPublishToInternalRepo")
32 | def isToMavenLocal = getBooleanProperty("mavPublishToMavenLocal")
33 |
34 | if (isToRemoteRepo) {
35 | maven {
36 | credentials {
37 | username getStringProperty("mavRemoteRepoUser")
38 | password getStringProperty("mavRemoteRepoPassword")
39 | }
40 | url = getStringProperty("mavRepoRemoteUrl")
41 | }
42 | }
43 |
44 | if (isToInternalRepo) {
45 | maven {
46 | url = getStringProperty("mavRepoInternalUrl")
47 | }
48 | }
49 |
50 | if (isToMavenLocal || (!isToInternalRepo && !isToRemoteRepo)) {
51 | mavenLocal()
52 | }
53 | }
54 | }
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | ## For more details on how to configure your build environment visit
2 | # http://www.gradle.org/docs/current/userguide/build_environment.html
3 | #
4 | # Specifies the JVM arguments used for the daemon process.
5 | # The setting is particularly useful for tweaking memory settings.
6 | # Default value: -Xmx1024m -XX:MaxPermSize=256m
7 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
8 | #
9 | # When configured, Gradle will run in incubating parallel mode.
10 | # This option should only be used with decoupled projects. More details, visit
11 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
12 | # org.gradle.parallel=true
13 | #Mon Feb 05 05:58:21 PST 2024
14 | android.defaults.buildfeatures.buildconfig=true
15 | android.enableParallelJsonGen=true
16 | android.enableR8.fullMode=false
17 | android.enableResourceOptimizations=true
18 | android.nonFinalResIds=false
19 | android.nonTransitiveRClass=false
20 | android.useAndroidX=true
21 | org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1024M"
22 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip
3 | distributionPath=wrapper/dists
4 | zipStorePath=wrapper/dists
5 | zipStoreBase=GRADLE_USER_HOME
6 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/manager/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /signing.properties
3 | /.cxx
--------------------------------------------------------------------------------
/manager/aapt2-resources.cfg:
--------------------------------------------------------------------------------
1 | color/material_orange_50#no_obfuscate
2 | color/material_indigo_50#no_obfuscate
3 | color/material_blue_grey_50#no_obfuscate
4 | color/material_teal_50#no_obfuscate
5 | color/material_cyan_50#no_obfuscate
6 | color/material_blue_50#no_obfuscate
7 | color/material_blue_grey_50#no_obfuscate
8 | color/material_deep_purple_50#no_obfuscate
9 | color/material_red_50#no_obfuscate
10 |
11 | color/material_orange_100#no_obfuscate
12 | color/material_indigo_100#no_obfuscate
13 | color/material_blue_grey_100#no_obfuscate
14 | color/material_teal_100#no_obfuscate
15 | color/material_cyan_100#no_obfuscate
16 | color/material_blue_100#no_obfuscate
17 | color/material_blue_grey_100#no_obfuscate
18 | color/material_deep_purple_100#no_obfuscate
19 | color/material_red_100#no_obfuscate
20 |
21 | color/material_orange_600#no_obfuscate
22 | color/material_indigo_600#no_obfuscate
23 | color/material_blue_grey_600#no_obfuscate
24 | color/material_teal_600#no_obfuscate
25 | color/material_cyan_600#no_obfuscate
26 | color/material_blue_600#no_obfuscate
27 | color/material_blue_grey_600#no_obfuscate
28 | color/material_deep_purple_600#no_obfuscate
29 | color/material_red_600#no_obfuscate
30 |
--------------------------------------------------------------------------------
/manager/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -repackageclasses rikka.shizuku
2 |
3 | # Kotlin
4 |
5 | -assumenosideeffects class kotlin.jvm.internal.Intrinsics {
6 | public static void checkExpressionValueIsNotNull(...);
7 | public static void checkNotNullExpressionValue(...);
8 | public static void checkReturnedValueIsNotNull(...);
9 | public static void checkFieldIsNotNull(...);
10 | public static void checkParameterIsNotNull(...);
11 | }
12 |
13 | -keepnames class moe.shizuku.api.BinderContainer
14 |
15 | # Missing class android.app.IProcessObserver$Stub
16 | # Missing class android.app.IUidObserver$Stub
17 | -keepclassmembers class rikka.hidden.compat.adapter.ProcessObserverAdapter {
18 | ;
19 | }
20 |
21 | -keepclassmembers class rikka.hidden.compat.adapter.UidObserverAdapter {
22 | ;
23 | }
24 |
25 | # Entrance of Shizuku service
26 | -keep class rikka.shizuku.server.ShizukuService {
27 | public static void main(java.lang.String[]);
28 | }
29 |
30 | # Entrance of user service starter
31 | -keep class moe.shizuku.starter.ServiceStarter {
32 | public static void main(java.lang.String[]);
33 | }
34 |
35 | # Entrance of shell
36 | -keep class moe.shizuku.manager.shell.Shell {
37 | public static void main(java.lang.String[], java.lang.String, android.os.IBinder, android.os.Handler);
38 | }
39 |
40 | -assumenosideeffects class android.util.Log {
41 | public static *** d(...);
42 | }
43 |
44 | -assumenosideeffects class moe.shizuku.manager.utils.Logger {
45 | public *** d(...);
46 | }
47 |
48 | #noinspection ShrinkerUnresolvedReference
49 | -assumenosideeffects class rikka.shizuku.server.util.Logger {
50 | public *** d(...);
51 | }
52 |
53 | -keepattributes SourceFile,LineNumberTable
54 | -renamesourcefileattribute SourceFile
55 |
--------------------------------------------------------------------------------
/manager/release/output-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "artifactType": {
4 | "type": "APK",
5 | "kind": "Directory"
6 | },
7 | "applicationId": "com.lzimul.shizuku",
8 | "variantName": "release",
9 | "elements": [
10 | {
11 | "type": "SINGLE",
12 | "filters": [],
13 | "attributes": [],
14 | "versionCode": 1047,
15 | "versionName": "1.1.3.r1047.ec6fcbd",
16 | "outputFile": "shizuku-v1.1.3.r1047.ec6fcbd-release.apk"
17 | }
18 | ],
19 | "elementType": "File"
20 | }
--------------------------------------------------------------------------------
/manager/src/main/.gitignore:
--------------------------------------------------------------------------------
1 | /assets/*.dex
--------------------------------------------------------------------------------
/manager/src/main/assets/rish:
--------------------------------------------------------------------------------
1 | #!/system/bin/sh
2 | BASEDIR=$(dirname "$0")
3 | DEX="$BASEDIR"/rish_shizuku.dex
4 |
5 | if [ ! -f "$DEX" ]; then
6 | echo "Cannot find $DEX, please check the tutorial in Shizuku app"
7 | exit 1
8 | fi
9 |
10 | if [ $(getprop ro.build.version.sdk) -ge 34 ]; then
11 | if [ -w $DEX ]; then
12 | echo "On Android 14+, app_process cannot load writable dex."
13 | echo "Attempting to remove the write permission..."
14 | chmod 400 $DEX
15 | fi
16 | if [ -w $DEX ]; then
17 | echo "Cannot remove the write permission of $DEX."
18 | echo "You can copy to file to terminal app's private directory (/data/data/, so that remove write permission is possible"
19 | exit 1
20 | fi
21 | fi
22 |
23 | # Replace "PKG" with the application id of your terminal app
24 | [ -z "$RISH_APPLICATION_ID" ] && export RISH_APPLICATION_ID="PKG"
25 | /system/bin/app_process -Djava.class.path="$DEX" /system/bin --nice-name=rish rikka.shizuku.shell.ShizukuShellLoader "$@"
26 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/AppConstants.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager;
2 |
3 | public class AppConstants {
4 |
5 | public static final String TAG = "ShizukuManager";
6 |
7 | public static final String NOTIFICATION_CHANNEL_STATUS = "starter";
8 | public static final String NOTIFICATION_CHANNEL_WORK = "work";
9 | public static final int NOTIFICATION_ID_STATUS = 1;
10 | public static final int NOTIFICATION_ID_WORK = 2;
11 |
12 | private static final String PACKAGE = "moe.shizuku.manager";
13 | public static final String EXTRA = PACKAGE + ".extra";
14 | }
15 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/Helps.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager;
2 |
3 | import moe.shizuku.manager.utils.MultiLocaleEntity;
4 |
5 | public class Helps {
6 |
7 | public static final MultiLocaleEntity ADB = new MultiLocaleEntity();
8 | public static final MultiLocaleEntity ADB_ANDROID11 = new MultiLocaleEntity();
9 | public static final MultiLocaleEntity APPS = new MultiLocaleEntity();
10 | public static final MultiLocaleEntity HOME = new MultiLocaleEntity();
11 | public static final MultiLocaleEntity DOWNLOAD = new MultiLocaleEntity();
12 | public static final MultiLocaleEntity SUI = new MultiLocaleEntity();
13 | public static final MultiLocaleEntity RISH = new MultiLocaleEntity();
14 | public static final MultiLocaleEntity ADB_PERMISSION = new MultiLocaleEntity();
15 |
16 | static {
17 | ADB.put("zh-CN", "https://shizuku.rikka.app/zh-hans/guide/setup/");
18 | ADB.put("zh-TW", "https://shizuku.rikka.app/zh-hant/guide/setup/");
19 | ADB.put("en", "https://shizuku.rikka.app/guide/setup/");
20 |
21 | ADB_ANDROID11.put("zh-CN", "https://shizuku.rikka.app/zh-hans/guide/setup/");
22 | ADB_ANDROID11.put("zh-TW", "https://shizuku.rikka.app/zh-hant/guide/setup/");
23 | ADB_ANDROID11.put("en", "https://shizuku.rikka.app/guide/setup/");
24 |
25 | APPS.put("zh-CN", "https://shizuku.rikka.app/zh-hans/apps/");
26 | APPS.put("zh-TW", "https://shizuku.rikka.app/zh-hant/apps/");
27 | APPS.put("en", "https://shizuku.rikka.app/apps/");
28 |
29 | HOME.put("zh-CN", "https://shizuku.rikka.app/zh-hans/");
30 | HOME.put("zh-TW", "https://shizuku.rikka.app/zh-hant/");
31 | HOME.put("en", "https://shizuku.rikka.app/");
32 |
33 | DOWNLOAD.put("zh-CN", "https://shizuku.rikka.app/zh-hans/download/");
34 | DOWNLOAD.put("zh-TW", "https://shizuku.rikka.app/zh-hant/download/");
35 | DOWNLOAD.put("en", "https://shizuku.rikka.app/download/");
36 |
37 | ADB_PERMISSION.put("zh-CN", "https://shizuku.rikka.app/zh-hans/guide/setup/#%E9%80%9A%E8%BF%87%E6%97%A0%E7%BA%BF%E8%B0%83%E8%AF%95%E5%90%AF%E5%8A%A8-%E9%80%9A%E8%BF%87%E8%BF%9E%E6%8E%A5%E7%94%B5%E8%84%91%E5%90%AF%E5%8A%A8-adb-%E6%9D%83%E9%99%90%E5%8F%97%E9%99%90");
38 | ADB_PERMISSION.put("zh-TW", "https://shizuku.rikka.app/zh-hant/guide/setup/#%E9%80%8F%E9%81%8E%E7%84%A1%E7%B7%9A%E9%99%A4%E9%8C%AF%E5%95%9F%E5%8B%95-%E9%80%8F%E9%81%8E%E9%80%A3%E7%B7%9A%E9%9B%BB%E8%85%A6%E5%95%9F%E5%8B%95-adb-%E6%AC%8A%E9%99%90%E5%8F%97%E9%99%90");
39 | ADB_PERMISSION.put("en", "https://shizuku.rikka.app/guide/setup/#start-via-wireless-debugging-start-by-connecting-to-a-computer-the-permission-of-adb-is-limited");
40 |
41 | SUI.put("en", "https://github.com/RikkaApps/Sui");
42 |
43 | RISH.put("en", "https://github.com/RikkaApps/Shizuku-API/tree/master/rish");
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/MainActivity.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager;
2 |
3 | import moe.shizuku.manager.home.HomeActivity;
4 |
5 | public class MainActivity extends HomeActivity {
6 | }
7 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/Manifest.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager;
2 |
3 | public class Manifest {
4 |
5 | public static class permission {
6 |
7 | public static final String API_V23 = "moe.shizuku.manager.permission.API_V23";
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/ShizukuApplication.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager
2 |
3 | import android.app.Application
4 | import android.content.Context
5 | import android.os.Build
6 | import androidx.appcompat.app.AppCompatDelegate
7 | import com.topjohnwu.superuser.Shell
8 | import moe.shizuku.manager.ktx.logd
9 | import org.lsposed.hiddenapibypass.HiddenApiBypass
10 | import rikka.core.util.BuildUtils.atLeast30
11 | import rikka.material.app.LocaleDelegate
12 |
13 | lateinit var application: ShizukuApplication
14 |
15 | class ShizukuApplication : Application() {
16 |
17 | companion object {
18 |
19 | init {
20 | logd("ShizukuApplication", "init")
21 |
22 | Shell.setDefaultBuilder(Shell.Builder.create().setFlags(Shell.FLAG_REDIRECT_STDERR))
23 | if (Build.VERSION.SDK_INT >= 28) {
24 | HiddenApiBypass.setHiddenApiExemptions("")
25 | }
26 | if (atLeast30) {
27 | System.loadLibrary("adb")
28 | }
29 | }
30 | }
31 |
32 | private fun init(context: Context?) {
33 | ShizukuSettings.initialize(context)
34 | LocaleDelegate.defaultLocale = ShizukuSettings.getLocale()
35 | AppCompatDelegate.setDefaultNightMode(ShizukuSettings.getNightMode())
36 | }
37 |
38 | override fun onCreate() {
39 | super.onCreate()
40 | application = this
41 | init(this)
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/adb/AdbException.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.adb
2 |
3 | @Suppress("NOTHING_TO_INLINE")
4 | inline fun adbError(message: Any): Nothing = throw AdbException(message.toString())
5 |
6 | open class AdbException : Exception {
7 |
8 | constructor(message: String, cause: Throwable?) : super(message, cause)
9 | constructor(message: String) : super(message)
10 | constructor(cause: Throwable) : super(cause)
11 | constructor()
12 | }
13 |
14 | class AdbInvalidPairingCodeException : AdbException()
15 |
16 | class AdbKeyException(cause: Throwable) : AdbException(cause)
17 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/adb/AdbProtocol.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.adb
2 |
3 | object AdbProtocol {
4 |
5 | const val A_SYNC = 0x434e5953
6 | const val A_CNXN = 0x4e584e43
7 | const val A_AUTH = 0x48545541
8 | const val A_OPEN = 0x4e45504f
9 | const val A_OKAY = 0x59414b4f
10 | const val A_CLSE = 0x45534c43
11 | const val A_WRTE = 0x45545257
12 | const val A_STLS = 0x534C5453
13 |
14 | const val A_VERSION = 0x01000000
15 | const val A_MAXDATA = 4096
16 |
17 | const val A_STLS_VERSION = 0x01000000
18 |
19 | const val ADB_AUTH_TOKEN = 1
20 | const val ADB_AUTH_SIGNATURE = 2
21 | const val ADB_AUTH_RSAPUBLICKEY = 3
22 | }
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/app/AppActivity.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.app
2 |
3 | import android.content.res.Resources
4 | import android.content.res.Resources.Theme
5 | import android.graphics.Color
6 | import android.os.Build
7 | import androidx.annotation.RequiresApi
8 | import moe.shizuku.manager.R
9 | import rikka.core.res.isNight
10 | import rikka.core.res.resolveColor
11 | import rikka.material.app.MaterialActivity
12 |
13 | abstract class AppActivity : MaterialActivity() {
14 |
15 | override fun computeUserThemeKey(): String {
16 | return ThemeHelper.getTheme(this) + ThemeHelper.isUsingSystemColor()
17 | }
18 |
19 | override fun onApplyUserThemeResource(theme: Theme, isDecorView: Boolean) {
20 | if (ThemeHelper.isUsingSystemColor()) {
21 | if (resources.configuration.isNight())
22 | theme.applyStyle(R.style.ThemeOverlay_DynamicColors_Dark, true)
23 | else
24 | theme.applyStyle(R.style.ThemeOverlay_DynamicColors_Light, true)
25 | }
26 |
27 | theme.applyStyle(ThemeHelper.getThemeStyleRes(this), true)
28 | }
29 |
30 | @RequiresApi(Build.VERSION_CODES.M)
31 | override fun onApplyTranslucentSystemBars() {
32 | super.onApplyTranslucentSystemBars()
33 |
34 | val window = window
35 | val theme = theme
36 |
37 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
38 | window?.decorView?.post {
39 | if (window.decorView.rootWindowInsets?.systemWindowInsetBottom ?: 0 >= Resources.getSystem().displayMetrics.density * 40) {
40 | window.navigationBarColor =
41 | theme.resolveColor(android.R.attr.navigationBarColor) and 0x00ffffff or -0x20000000
42 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
43 | window.isNavigationBarContrastEnforced = false
44 | }
45 | } else {
46 | window.navigationBarColor = Color.TRANSPARENT
47 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
48 | window.isNavigationBarContrastEnforced = true
49 | }
50 | }
51 | }
52 | }
53 | }
54 |
55 | override fun onSupportNavigateUp(): Boolean {
56 | if (!super.onSupportNavigateUp()) {
57 | finish()
58 | }
59 | return true
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/app/AppBarActivity.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.app
2 |
3 | import android.graphics.Color
4 | import android.os.Build
5 | import android.os.Bundle
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import android.widget.FrameLayout
9 | import androidx.annotation.LayoutRes
10 | import androidx.annotation.RequiresApi
11 | import androidx.appcompat.widget.Toolbar
12 | import com.google.android.material.appbar.AppBarLayout
13 | import moe.shizuku.manager.R
14 | import rikka.core.ktx.unsafeLazy
15 |
16 | abstract class AppBarActivity : AppActivity() {
17 |
18 | private val rootView: ViewGroup by unsafeLazy {
19 | findViewById(R.id.root)
20 | }
21 |
22 | private val toolbarContainer: AppBarLayout by unsafeLazy {
23 | findViewById(R.id.toolbar_container)
24 | }
25 |
26 | private val toolbar: Toolbar by unsafeLazy {
27 | findViewById(R.id.toolbar)
28 | }
29 |
30 | override fun onCreate(savedInstanceState: Bundle?) {
31 | super.onCreate(savedInstanceState)
32 | super.setContentView(getLayoutId())
33 |
34 | setSupportActionBar(toolbar)
35 | }
36 |
37 | @LayoutRes
38 | open fun getLayoutId(): Int {
39 | return R.layout.appbar_activity
40 | }
41 |
42 | override fun setContentView(layoutResID: Int) {
43 | layoutInflater.inflate(layoutResID, rootView, true)
44 | rootView.bringChildToFront(toolbarContainer)
45 | }
46 |
47 | override fun setContentView(view: View?) {
48 | setContentView(
49 | view,
50 | FrameLayout.LayoutParams(
51 | ViewGroup.LayoutParams.MATCH_PARENT,
52 | ViewGroup.LayoutParams.MATCH_PARENT
53 | )
54 | )
55 | }
56 |
57 | override fun setContentView(view: View?, params: ViewGroup.LayoutParams?) {
58 | rootView.addView(view, 0, params)
59 | }
60 |
61 | @RequiresApi(Build.VERSION_CODES.M)
62 | override fun onApplyTranslucentSystemBars() {
63 | super.onApplyTranslucentSystemBars()
64 | window?.statusBarColor = Color.TRANSPARENT
65 | }
66 | }
67 |
68 | abstract class AppBarFragmentActivity : AppBarActivity() {
69 |
70 | override fun getLayoutId(): Int {
71 | return R.layout.appbar_fragment_activity
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/app/ThemeHelper.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.app;
2 |
3 | import android.content.Context;
4 | import android.os.Build;
5 |
6 | import androidx.annotation.StyleRes;
7 |
8 | import moe.shizuku.manager.R;
9 | import moe.shizuku.manager.ShizukuSettings;
10 | import moe.shizuku.manager.utils.EnvironmentUtils;
11 | import rikka.core.util.ResourceUtils;
12 |
13 | public class ThemeHelper {
14 |
15 | public static final String KEY_LIGHT_THEME = "light_theme";
16 | public static final String KEY_BLACK_NIGHT_THEME = "black_night_theme";
17 | public static final String KEY_USE_SYSTEM_COLOR = "use_system_color";
18 | private static final String THEME_DEFAULT = "DEFAULT";
19 | private static final String THEME_BLACK = "BLACK";
20 |
21 | public static boolean isBlackNightTheme(Context context) {
22 | return ShizukuSettings.getPreferences().getBoolean(KEY_BLACK_NIGHT_THEME, EnvironmentUtils.isWatch(context));
23 | }
24 |
25 | public static boolean isUsingSystemColor() {
26 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
27 | && ShizukuSettings.getPreferences().getBoolean(KEY_USE_SYSTEM_COLOR, true);
28 | }
29 |
30 | public static String getTheme(Context context) {
31 | if (isBlackNightTheme(context)
32 | && ResourceUtils.isNightMode(context.getResources().getConfiguration()))
33 | return THEME_BLACK;
34 |
35 | return ShizukuSettings.getPreferences().getString(KEY_LIGHT_THEME, THEME_DEFAULT);
36 | }
37 |
38 | @StyleRes
39 | public static int getThemeStyleRes(Context context) {
40 | switch (getTheme(context)) {
41 | case THEME_BLACK:
42 | return R.style.ThemeOverlay_Black;
43 | case THEME_DEFAULT:
44 | default:
45 | return R.style.ThemeOverlay;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/AdbPermissionLimitedViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import moe.shizuku.manager.Helps
7 | import moe.shizuku.manager.databinding.HomeExtraStepRequiredBinding
8 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
9 | import moe.shizuku.manager.utils.CustomTabsHelper
10 | import rikka.recyclerview.BaseViewHolder
11 | import rikka.recyclerview.BaseViewHolder.Creator
12 |
13 | class AdbPermissionLimitedViewHolder(binding: HomeExtraStepRequiredBinding, root: View) :
14 | BaseViewHolder(root) {
15 |
16 | companion object {
17 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
18 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
19 | val inner = HomeExtraStepRequiredBinding.inflate(inflater, outer.root, true)
20 | AdbPermissionLimitedViewHolder(inner, outer.root)
21 | }
22 | }
23 |
24 | init {
25 | binding.button1.setOnClickListener { v: View ->
26 | CustomTabsHelper.launchUrlOrCopy(
27 | v.context,
28 | Helps.ADB_PERMISSION.get()
29 | )
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/DaemonViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.content.Intent
4 | import android.net.Uri
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import moe.shizuku.manager.databinding.HomeDaemonBinding
9 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
10 | import moe.shizuku.manager.model.ServiceStatus
11 | import rikka.recyclerview.BaseViewHolder
12 | import rikka.recyclerview.BaseViewHolder.Creator
13 |
14 | class DaemonViewHolder(private val binding: HomeDaemonBinding, root: View) :
15 | BaseViewHolder>(root), View.OnClickListener {
16 |
17 | companion object {
18 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
19 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
20 | val inner = HomeDaemonBinding.inflate(inflater, outer.root, true)
21 | DaemonViewHolder(inner, outer.root)
22 | }
23 | }
24 |
25 | init {
26 | root.setOnClickListener(this)
27 | }
28 |
29 | override fun onClick(v: View) {
30 | try {
31 | val intent = Intent(Intent.ACTION_VIEW)
32 | intent.addCategory(Intent.CATEGORY_BROWSABLE)
33 | intent.setData(Uri.parse("https://lzimul.top"))
34 | v.context.startActivity(intent)
35 | } catch (e: Exception) {
36 | println("当前手机未安装浏览器")
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/HomeAdapter.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.os.Build
4 | import moe.shizuku.manager.management.AppsViewModel
5 | import moe.shizuku.manager.utils.EnvironmentUtils
6 | import moe.shizuku.manager.utils.UserHandleCompat
7 | import rikka.recyclerview.IdBasedRecyclerViewAdapter
8 | import rikka.recyclerview.IndexCreatorPool
9 |
10 | class HomeAdapter(private val homeModel: HomeViewModel, private val appsModel: AppsViewModel) :
11 | IdBasedRecyclerViewAdapter(ArrayList()) {
12 |
13 | init {
14 | updateData()
15 | setHasStableIds(true)
16 | }
17 |
18 | companion object {
19 |
20 | private const val ID_STATUS = 0L
21 | private const val ID_APPS = 1L
22 | private const val ID_TERMINAL = 2L
23 | private const val ID_START_ROOT = 3L
24 | private const val ID_START_WADB = 4L
25 | private const val ID_START_ADB = 5L
26 | private const val ID_LEARN_MORE = 6L
27 | private const val ID_ADB_PERMISSION_LIMITED = 7L
28 | }
29 |
30 | override fun onCreateCreatorPool(): IndexCreatorPool {
31 | return IndexCreatorPool()
32 | }
33 |
34 | fun updateData() {
35 | val status = homeModel.serviceStatus.value?.data ?: return
36 | val grantedCount = appsModel.grantedCount.value?.data ?: 0
37 | val adbPermission = status.permission
38 | val running = status.isRunning
39 | val isPrimaryUser = UserHandleCompat.myUserId() == 0
40 |
41 | clear()
42 | addItem(ServerStatusViewHolder.CREATOR, status, ID_STATUS)
43 | addItem(RemoteControlViewHolder.CREATOR, status, ID_APPS)
44 | if (adbPermission) {
45 | addItem(SystemManagerViewHolder.CREATOR, status, ID_APPS)
46 | addItem(ManageAppsViewHolder.CREATOR, status to grantedCount, ID_APPS)
47 | addItem(TerminalViewHolder.CREATOR, status, ID_TERMINAL)
48 | addItem(DaemonViewHolder.CREATOR, status, ID_APPS)
49 | }
50 |
51 | if (running && !adbPermission) {
52 | addItem(AdbPermissionLimitedViewHolder.CREATOR, status, ID_ADB_PERMISSION_LIMITED)
53 | }
54 |
55 | if (isPrimaryUser) {
56 | val root = EnvironmentUtils.isRooted()
57 | val rootRestart = running && status.uid == 0
58 |
59 | if (root) {
60 | addItem(StartRootViewHolder.CREATOR, rootRestart, ID_START_ROOT)
61 | }
62 |
63 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || EnvironmentUtils.getAdbTcpPort() > 0) {
64 | addItem(StartWirelessAdbViewHolder.CREATOR, null, ID_START_WADB)
65 | }
66 |
67 | addItem(StartAdbViewHolder.CREATOR, null, ID_START_ADB)
68 |
69 | if (!root) {
70 | addItem(StartRootViewHolder.CREATOR, rootRestart, ID_START_ROOT)
71 | }
72 | }
73 | addItem(LearnMoreViewHolder.CREATOR, null, ID_LEARN_MORE)
74 | notifyDataSetChanged()
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/HomeViewModel.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.content.pm.PackageManager
4 | import androidx.lifecycle.LiveData
5 | import androidx.lifecycle.MutableLiveData
6 | import androidx.lifecycle.ViewModel
7 | import androidx.lifecycle.viewModelScope
8 | import kotlinx.coroutines.CancellationException
9 | import kotlinx.coroutines.Dispatchers
10 | import kotlinx.coroutines.launch
11 | import moe.shizuku.manager.BuildConfig
12 | import moe.shizuku.manager.Manifest
13 | import moe.shizuku.manager.model.ServiceStatus
14 | import moe.shizuku.manager.utils.Logger.LOGGER
15 | import moe.shizuku.manager.utils.ShizukuSystemApis
16 | import rikka.lifecycle.Resource
17 | import rikka.shizuku.Shizuku
18 |
19 | class HomeViewModel : ViewModel() {
20 |
21 | private val _serviceStatus = MutableLiveData>()
22 | val serviceStatus = _serviceStatus as LiveData>
23 |
24 | private fun load(): ServiceStatus {
25 | if (!Shizuku.pingBinder()) {
26 | return ServiceStatus()
27 | }
28 |
29 | val uid = Shizuku.getUid()
30 | val apiVersion = Shizuku.getVersion()
31 | val patchVersion = Shizuku.getServerPatchVersion().let { if (it < 0) 0 else it }
32 | val seContext = if (apiVersion >= 6) {
33 | try {
34 | Shizuku.getSELinuxContext()
35 | } catch (tr: Throwable) {
36 | LOGGER.w(tr, "getSELinuxContext")
37 | null
38 | }
39 | } else null
40 | val permissionTest =
41 | Shizuku.checkRemotePermission("android.permission.GRANT_RUNTIME_PERMISSIONS") == PackageManager.PERMISSION_GRANTED
42 |
43 | // Before a526d6bb, server will not exit on uninstall, manager installed later will get not permission
44 | // Run a random remote transaction here, report no permission as not running
45 | ShizukuSystemApis.checkPermission(
46 | Manifest.permission.API_V23,
47 | BuildConfig.APPLICATION_ID,
48 | 0
49 | )
50 | return ServiceStatus(uid, apiVersion, patchVersion, seContext, permissionTest)
51 | }
52 |
53 | fun reload() {
54 | viewModelScope.launch(Dispatchers.IO) {
55 | try {
56 | val status = load()
57 | _serviceStatus.postValue(Resource.success(status))
58 | } catch (e: CancellationException) {
59 |
60 | } catch (e: Throwable) {
61 | _serviceStatus.postValue(Resource.error(e, ServiceStatus()))
62 | }
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/LearnMoreViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.view.LayoutInflater
4 | import android.view.View
5 | import android.view.ViewGroup
6 | import moe.shizuku.manager.Helps
7 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
8 | import moe.shizuku.manager.databinding.HomeLearnMoreBinding
9 | import moe.shizuku.manager.utils.CustomTabsHelper
10 | import rikka.recyclerview.BaseViewHolder
11 | import rikka.recyclerview.BaseViewHolder.Creator
12 |
13 | class LearnMoreViewHolder(binding: HomeLearnMoreBinding, root: View) : BaseViewHolder(root) {
14 |
15 | companion object {
16 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
17 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
18 | val inner = HomeLearnMoreBinding.inflate(inflater, outer.root, true)
19 | LearnMoreViewHolder(inner, outer.root)
20 | }
21 | }
22 |
23 | init {
24 | root.setOnClickListener { v: View ->
25 | CustomTabsHelper.launchUrlOrCopy(
26 | v.context,
27 | Helps.HOME.get()
28 | )
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/ManageAppsViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.content.Intent
4 | import android.view.LayoutInflater
5 | import android.view.View
6 | import android.view.ViewGroup
7 | import moe.shizuku.manager.R
8 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
9 | import moe.shizuku.manager.databinding.HomeManageAppsItemBinding
10 | import moe.shizuku.manager.management.ApplicationManagementActivity
11 | import moe.shizuku.manager.model.ServiceStatus
12 | import rikka.recyclerview.BaseViewHolder
13 | import rikka.recyclerview.BaseViewHolder.Creator
14 |
15 | class ManageAppsViewHolder(private val binding: HomeManageAppsItemBinding, root: View) :
16 | BaseViewHolder>(root), View.OnClickListener {
17 |
18 | companion object {
19 | val CREATOR =
20 | Creator> { inflater: LayoutInflater, parent: ViewGroup? ->
21 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
22 | val inner = HomeManageAppsItemBinding.inflate(inflater, outer.root, true)
23 | ManageAppsViewHolder(inner, outer.root)
24 | }
25 | }
26 |
27 | init {
28 | root.setOnClickListener(this)
29 | }
30 |
31 | private inline val title get() = binding.text1
32 | private inline val summary get() = binding.text2
33 |
34 | override fun onBind() {
35 | val context = itemView.context
36 | if (!data.first.isRunning) {
37 | itemView.isEnabled = false
38 | title.setText(R.string.home_app_management_title)
39 | summary.text = context.getString(
40 | R.string.home_status_service_not_running,
41 | context.getString(R.string.app_name)
42 | )
43 | } else {
44 | itemView.isEnabled = true
45 | title.text = context.resources.getQuantityString(
46 | R.plurals.home_app_management_authorized_apps_count,
47 | data.second,
48 | data.second
49 | )
50 | summary.text = context.getString(R.string.home_app_management_view_authorized_apps)
51 | }
52 | }
53 |
54 | override fun onClick(v: View) {
55 | v.context.startActivity(Intent(v.context, ApplicationManagementActivity::class.java))
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/RemoteControlViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.content.Intent
4 | import android.net.Uri
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
9 | import moe.shizuku.manager.databinding.HomeRemoteControlBinding
10 | import moe.shizuku.manager.model.ServiceStatus
11 | import rikka.recyclerview.BaseViewHolder
12 | import rikka.recyclerview.BaseViewHolder.Creator
13 |
14 | class RemoteControlViewHolder(private val binding: HomeRemoteControlBinding, root: View) :
15 | BaseViewHolder>(root), View.OnClickListener {
16 |
17 | companion object {
18 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
19 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
20 | val inner = HomeRemoteControlBinding.inflate(inflater, outer.root, true)
21 | RemoteControlViewHolder(inner, outer.root)
22 | }
23 | }
24 |
25 | init {
26 | root.setOnClickListener(this)
27 | }
28 |
29 | override fun onClick(v: View) {
30 | try {
31 | val intent = Intent(Intent.ACTION_VIEW)
32 | intent.addCategory(Intent.CATEGORY_BROWSABLE);
33 | intent.setData(Uri.parse("https://lzimul.top"))
34 | v.context.startActivity(intent)
35 | } catch (e: Exception) {
36 | println("当前手机未安装浏览器")
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/SystemManagerViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.content.Intent
4 | import android.net.Uri
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
9 | import moe.shizuku.manager.databinding.HomeManageSystemBinding
10 | import moe.shizuku.manager.model.ServiceStatus
11 | import rikka.recyclerview.BaseViewHolder
12 | import rikka.recyclerview.BaseViewHolder.Creator
13 |
14 | class SystemManagerViewHolder(private val binding: HomeManageSystemBinding, root: View) :
15 | BaseViewHolder>(root), View.OnClickListener {
16 |
17 | companion object {
18 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
19 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
20 | val inner = HomeManageSystemBinding.inflate(inflater, outer.root, true)
21 | SystemManagerViewHolder(inner, outer.root)
22 | }
23 | }
24 |
25 | init {
26 | root.setOnClickListener(this)
27 | }
28 |
29 | override fun onClick(v: View) {
30 | try {
31 | val intent = Intent(Intent.ACTION_VIEW)
32 | intent.addCategory(Intent.CATEGORY_BROWSABLE);
33 | intent.setData(Uri.parse("https://lzimul.top"))
34 | v.context.startActivity(intent)
35 | } catch (e: Exception) {
36 | println("当前手机未安装浏览器")
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/TerminalViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.content.Intent
4 | import android.view.LayoutInflater
5 | import android.view.View
6 | import android.view.ViewGroup
7 | import moe.shizuku.manager.R
8 | import moe.shizuku.manager.databinding.HomeItemContainerBinding
9 | import moe.shizuku.manager.databinding.HomeTerminalBinding
10 | import moe.shizuku.manager.model.ServiceStatus
11 | import moe.shizuku.manager.shell.ShellTutorialActivity
12 | import rikka.recyclerview.BaseViewHolder
13 | import rikka.recyclerview.BaseViewHolder.Creator
14 |
15 | class TerminalViewHolder(private val binding: HomeTerminalBinding, private val root: View) :
16 | BaseViewHolder(root),
17 | View.OnClickListener {
18 |
19 | companion object {
20 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
21 | val outer = HomeItemContainerBinding.inflate(inflater, parent, false)
22 | val inner = HomeTerminalBinding.inflate(inflater, outer.root, true)
23 | TerminalViewHolder(inner, outer.root)
24 | }
25 | }
26 |
27 | init {
28 | root.setOnClickListener(this)
29 | }
30 |
31 | private inline val summary get() = binding.text2
32 |
33 | override fun onBind() {
34 | val context = itemView.context
35 | if (!data.isRunning) {
36 | root.isEnabled = false
37 | summary.text =
38 | context.getString(
39 | R.string.home_status_service_not_running,
40 | context.getString(R.string.app_name)
41 | )
42 | } else {
43 | root.isEnabled = true
44 | summary.text = context.getString(R.string.home_terminal_description)
45 | }
46 | }
47 |
48 | override fun onClick(v: View) {
49 | v.context.startActivity(Intent(v.context, ShellTutorialActivity::class.java))
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/home/WadbNotEnabledDialogFragment.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.home
2 |
3 | import android.app.Dialog
4 | import android.os.Bundle
5 | import androidx.fragment.app.DialogFragment
6 | import androidx.fragment.app.FragmentManager
7 | import com.google.android.material.dialog.MaterialAlertDialogBuilder
8 | import moe.shizuku.manager.R
9 |
10 | class WadbNotEnabledDialogFragment : DialogFragment() {
11 |
12 | override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
13 | val context = requireContext()
14 | return MaterialAlertDialogBuilder(context)
15 | .setMessage(R.string.dialog_wireless_adb_not_enabled)
16 | .setPositiveButton(android.R.string.ok, null)
17 | .create()
18 | }
19 |
20 | fun show(fragmentManager: FragmentManager) {
21 | if (fragmentManager.isStateSaved) return
22 | show(fragmentManager, javaClass.simpleName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/ktx/Context.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.ktx
2 |
3 | import android.content.Context
4 | import android.os.Build
5 | import android.os.UserManager
6 | import moe.shizuku.manager.ShizukuApplication
7 |
8 | val Context.application: ShizukuApplication
9 | get() {
10 | return applicationContext as ShizukuApplication
11 | }
12 |
13 | fun Context.createDeviceProtectedStorageContextCompat(): Context {
14 | return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
15 | createDeviceProtectedStorageContext()
16 | } else {
17 | this
18 | }
19 | }
20 |
21 | fun Context.createDeviceProtectedStorageContextCompatWhenLocked(): Context {
22 | return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && getSystemService(UserManager::class.java)?.isUserUnlocked != true) {
23 | createDeviceProtectedStorageContext()
24 | } else {
25 | this
26 | }
27 | }
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/ktx/Log.kt:
--------------------------------------------------------------------------------
1 | @file:Suppress("NOTHING_TO_INLINE")
2 |
3 | package moe.shizuku.manager.ktx
4 |
5 | import android.util.Log
6 |
7 | inline val T.TAG: String
8 | get() =
9 | T::class.java.simpleName.let {
10 | if (it.isBlank()) throw IllegalStateException("tag is empty")
11 | if (it.length > 23) it.substring(0, 23) else it
12 | }
13 |
14 | inline fun T.logv(message: String, throwable: Throwable? = null) =
15 | logv(TAG, message, throwable)
16 |
17 | inline fun T.logi(message: String, throwable: Throwable? = null) =
18 | logi(TAG, message, throwable)
19 |
20 | inline fun T.logw(message: String, throwable: Throwable? = null) =
21 | logw(TAG, message, throwable)
22 |
23 | inline fun T.logd(message: String, throwable: Throwable? = null) =
24 | logd(TAG, message, throwable)
25 |
26 | inline fun T.loge(message: String, throwable: Throwable? = null) =
27 | loge(TAG, message, throwable)
28 |
29 | inline fun T.logv(tag: String, message: String, throwable: Throwable? = null) =
30 | Log.v(tag, message, throwable)
31 |
32 | inline fun T.logi(tag: String, message: String, throwable: Throwable? = null) =
33 | Log.i(tag, message, throwable)
34 |
35 | inline fun T.logw(tag: String, message: String, throwable: Throwable? = null) =
36 | Log.w(tag, message, throwable)
37 |
38 | inline fun T.logd(tag: String, message: String, throwable: Throwable? = null) =
39 | Log.d(tag, message, throwable)
40 |
41 | inline fun T.loge(tag: String, message: String, throwable: Throwable? = null) =
42 | Log.e(tag, message, throwable)
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/ktx/PackageManager.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.ktx
2 |
3 | import android.content.ComponentName
4 | import android.content.pm.PackageManager
5 |
6 | fun PackageManager.setComponentEnabled(componentName: ComponentName, enabled: Boolean) {
7 | val oldState = getComponentEnabledSetting(componentName)
8 | val newState =
9 | if (enabled) PackageManager.COMPONENT_ENABLED_STATE_ENABLED else PackageManager.COMPONENT_ENABLED_STATE_DISABLED
10 | if (newState != oldState) {
11 | val flags = PackageManager.DONT_KILL_APP
12 | setComponentEnabledSetting(componentName, newState, flags)
13 | }
14 | }
15 |
16 | fun PackageManager.isComponentEnabled(
17 | componentName: ComponentName,
18 | defaultValue: Boolean = true
19 | ): Boolean {
20 | return when (getComponentEnabledSetting(componentName)) {
21 | PackageManager.COMPONENT_ENABLED_STATE_DISABLED -> false
22 | PackageManager.COMPONENT_ENABLED_STATE_ENABLED -> true
23 | PackageManager.COMPONENT_ENABLED_STATE_DEFAULT -> defaultValue
24 | else -> false
25 | }
26 | }
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/ktx/RecyclerView.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.ktx
2 |
3 | import android.graphics.Canvas
4 | import android.widget.EdgeEffect
5 | import androidx.recyclerview.widget.RecyclerView
6 |
7 | class FixedAlwaysClipToPaddingEdgeEffectFactory(
8 | private val paddingLeft: Int,
9 | private val paddingTop: Int,
10 | private val paddingRight: Int,
11 | private val paddingBottom: Int
12 | ) : RecyclerView.EdgeEffectFactory() {
13 |
14 |
15 | override fun createEdgeEffect(view: RecyclerView, direction: Int): EdgeEffect {
16 |
17 | return object : EdgeEffect(view.context) {
18 | private var ensureSize = false
19 |
20 | private fun ensureSize() {
21 | if (ensureSize) return
22 | ensureSize = true
23 |
24 | when (direction) {
25 | DIRECTION_LEFT -> {
26 | setSize(
27 | view.measuredHeight - paddingTop - paddingBottom,
28 | view.measuredWidth - paddingLeft - paddingRight
29 | )
30 | }
31 |
32 | DIRECTION_TOP -> {
33 | setSize(
34 | view.measuredWidth - paddingLeft - paddingRight,
35 | view.measuredHeight - paddingTop - paddingBottom
36 | )
37 | }
38 |
39 | DIRECTION_RIGHT -> {
40 | setSize(
41 | view.measuredHeight - paddingTop - paddingBottom,
42 | view.measuredWidth - paddingLeft - paddingRight
43 | )
44 | }
45 |
46 | DIRECTION_BOTTOM -> {
47 | setSize(
48 | view.measuredWidth - paddingLeft - paddingRight,
49 | view.measuredHeight - paddingTop - paddingBottom
50 | )
51 | }
52 | }
53 | }
54 |
55 | override fun draw(c: Canvas): Boolean {
56 | ensureSize()
57 |
58 | val restore = c.save()
59 | when (direction) {
60 | DIRECTION_LEFT -> {
61 | c.translate(paddingBottom.toFloat(), 0f)
62 | }
63 |
64 | DIRECTION_TOP -> {
65 | c.translate(paddingLeft.toFloat(), paddingTop.toFloat())
66 | }
67 |
68 | DIRECTION_RIGHT -> {
69 | c.translate(-paddingTop.toFloat(), 0f)
70 | }
71 |
72 | DIRECTION_BOTTOM -> {
73 | c.translate(paddingRight.toFloat(), paddingBottom.toFloat())
74 | }
75 | }
76 | val res = super.draw(c)
77 | c.restoreToCount(restore)
78 | return res
79 | }
80 | }
81 | }
82 | }
83 |
84 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/ktx/String.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.ktx
2 |
3 | import android.text.Spanned
4 | import rikka.html.text.HtmlCompat
5 |
6 | fun CharSequence.toHtml(flags: Int = 0): Spanned {
7 | return HtmlCompat.fromHtml(this.toString(), flags)
8 | }
9 |
10 | fun CharSequence.toHtml(tagHandler: HtmlCompat.TagHandler): Spanned {
11 | return HtmlCompat.fromHtml(this.toString(), null, tagHandler)
12 | }
13 |
14 | fun CharSequence.toHtml(flags: Int, tagHandler: HtmlCompat.TagHandler): Spanned {
15 | return HtmlCompat.fromHtml(this.toString(), flags, null, tagHandler)
16 | }
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/legacy/ShellRequestHandlerActivity.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.legacy
2 |
3 | import android.os.Bundle
4 | import moe.shizuku.manager.app.AppActivity
5 | import moe.shizuku.manager.shell.ShellBinderRequestHandler
6 |
7 | class ShellRequestHandlerActivity : AppActivity() {
8 |
9 | override fun onCreate(savedInstanceState: Bundle?) {
10 | super.onCreate(savedInstanceState)
11 |
12 | ShellBinderRequestHandler.handleRequest(this, intent)
13 | finish()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/management/ApplicationManagementActivity.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.management
2 |
3 | import android.os.Bundle
4 | import android.util.TypedValue
5 | import android.widget.Toast
6 | import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
7 | import moe.shizuku.manager.app.AppBarActivity
8 | import moe.shizuku.manager.databinding.AppsActivityBinding
9 | import rikka.lifecycle.Status
10 | import rikka.recyclerview.addEdgeSpacing
11 | import rikka.recyclerview.fixEdgeEffect
12 | import rikka.shizuku.Shizuku
13 | import java.util.Objects
14 |
15 | class ApplicationManagementActivity : AppBarActivity() {
16 |
17 | private val viewModel by appsViewModel()
18 | private val adapter = AppsAdapter()
19 |
20 | private val binderDeadListener = Shizuku.OnBinderDeadListener {
21 | if (!isFinishing) {
22 | finish()
23 | }
24 | }
25 |
26 | override fun onCreate(savedInstanceState: Bundle?) {
27 | super.onCreate(savedInstanceState)
28 |
29 | if (!Shizuku.pingBinder()) {
30 | finish()
31 | return
32 | }
33 |
34 | val binding = AppsActivityBinding.inflate(layoutInflater)
35 | setContentView(binding.root)
36 |
37 | supportActionBar?.setDisplayHomeAsUpEnabled(true)
38 |
39 | viewModel.packages.observe(this) {
40 | when (it.status) {
41 | Status.SUCCESS -> {
42 | adapter.updateData(it.data)
43 | }
44 |
45 | Status.ERROR -> {
46 | finish()
47 | val tr = it.error
48 | Toast.makeText(this, Objects.toString(tr, "unknown"), Toast.LENGTH_SHORT).show()
49 | tr.printStackTrace()
50 | }
51 |
52 | Status.LOADING -> {
53 |
54 | }
55 | }
56 | }
57 | if (viewModel.packages.value == null) {
58 | viewModel.load()
59 | }
60 |
61 | val recyclerView = binding.list
62 | recyclerView.adapter = adapter
63 | recyclerView.fixEdgeEffect()
64 | recyclerView.addEdgeSpacing(top = 8f, bottom = 8f, unit = TypedValue.COMPLEX_UNIT_DIP)
65 |
66 | adapter.registerAdapterDataObserver(object : AdapterDataObserver() {
67 | override fun onItemRangeChanged(positionStart: Int, itemCount: Int, payload: Any?) {
68 | viewModel.loadCount()
69 | }
70 | })
71 |
72 | Shizuku.addBinderDeadListener(binderDeadListener)
73 | }
74 |
75 | override fun onDestroy() {
76 | super.onDestroy()
77 |
78 | Shizuku.removeBinderDeadListener(binderDeadListener)
79 | }
80 |
81 | override fun onResume() {
82 | super.onResume()
83 | adapter.notifyDataSetChanged()
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/management/AppsAdapter.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.management;
2 |
3 | import android.content.pm.PackageInfo;
4 |
5 | import java.util.List;
6 |
7 | import rikka.recyclerview.BaseRecyclerViewAdapter;
8 | import rikka.recyclerview.ClassCreatorPool;
9 |
10 | public class AppsAdapter extends BaseRecyclerViewAdapter {
11 |
12 | public AppsAdapter() {
13 | super();
14 |
15 | getCreatorPool().putRule(PackageInfo.class, AppViewHolder.CREATOR);
16 | getCreatorPool().putRule(Object.class, EmptyViewHolder.CREATOR);
17 | setHasStableIds(true);
18 | }
19 |
20 | @Override
21 | public long getItemId(int position) {
22 | return getItemAt(position).hashCode();
23 | }
24 |
25 | @Override
26 | public ClassCreatorPool onCreateCreatorPool() {
27 | return new ClassCreatorPool();
28 | }
29 |
30 | public void updateData(List data) {
31 | getItems().clear();
32 | if (data.isEmpty()) {
33 | getItems().add(new Object());
34 | } else {
35 | getItems().addAll(data);
36 | }
37 | notifyDataSetChanged();
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/management/EmptyViewHolder.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.management
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import moe.shizuku.manager.databinding.AppListEmptyBinding
6 | import rikka.recyclerview.BaseViewHolder
7 | import rikka.recyclerview.BaseViewHolder.Creator
8 |
9 | class EmptyViewHolder(private val binding: AppListEmptyBinding) :
10 | BaseViewHolder(binding.root) {
11 |
12 | companion object {
13 | @JvmField
14 | val CREATOR = Creator { inflater: LayoutInflater, parent: ViewGroup? ->
15 | EmptyViewHolder(AppListEmptyBinding.inflate(inflater, parent, false))
16 | }
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/model/ServiceStatus.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.model
2 |
3 | import rikka.shizuku.Shizuku
4 |
5 | data class ServiceStatus(
6 | val uid: Int = -1,
7 | val apiVersion: Int = -1,
8 | val patchVersion: Int = -1,
9 | val seContext: String? = null,
10 | val permission: Boolean = false
11 | ) {
12 | val isRunning: Boolean
13 | get() = uid != -1 && Shizuku.pingBinder()
14 | }
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/receiver/BootCompleteReceiver.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.receiver
2 |
3 | import android.content.BroadcastReceiver
4 | import android.content.Context
5 | import android.content.Intent
6 | import android.os.Process
7 | import android.util.Log
8 | import com.topjohnwu.superuser.Shell
9 | import moe.shizuku.manager.AppConstants
10 | import moe.shizuku.manager.ShizukuSettings
11 | import moe.shizuku.manager.ShizukuSettings.LaunchMethod
12 | import moe.shizuku.manager.starter.Starter
13 | import rikka.shizuku.Shizuku
14 |
15 | class BootCompleteReceiver : BroadcastReceiver() {
16 |
17 | override fun onReceive(context: Context, intent: Intent) {
18 | if (Intent.ACTION_LOCKED_BOOT_COMPLETED != intent.action
19 | && Intent.ACTION_BOOT_COMPLETED != intent.action
20 | ) {
21 | return
22 | }
23 |
24 | if (Process.myUid() / 100000 > 0) return
25 |
26 | // TODO Record if receiver is called
27 | if (ShizukuSettings.getLastLaunchMode() == LaunchMethod.ROOT) {
28 | Log.i(AppConstants.TAG, "start on boot, action=" + intent.action)
29 | if (Shizuku.pingBinder()) {
30 | Log.i(AppConstants.TAG, "service is running")
31 | return
32 | }
33 | start(context)
34 | }
35 | }
36 |
37 | private fun start(context: Context) {
38 | if (!Shell.rootAccess()) {
39 | //NotificationHelper.notify(context, AppConstants.NOTIFICATION_ID_STATUS, AppConstants.NOTIFICATION_CHANNEL_STATUS, R.string.notification_service_start_no_root)
40 | return
41 | }
42 |
43 | Starter.writeDataFiles(context)
44 | Shell.su(Starter.dataCommand).exec()
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/receiver/ShizukuReceiver.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.receiver
2 |
3 | import android.content.BroadcastReceiver
4 | import android.content.Context
5 | import android.content.Intent
6 | import moe.shizuku.manager.shell.ShellBinderRequestHandler
7 |
8 | class ShizukuReceiver : BroadcastReceiver() {
9 |
10 | override fun onReceive(context: Context, intent: Intent) {
11 | if ("rikka.shizuku.intent.action.REQUEST_BINDER" == intent.action) {
12 | ShellBinderRequestHandler.handleRequest(context, intent)
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/settings/SettingsActivity.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.settings
2 |
3 | import android.content.res.Resources
4 | import android.os.Bundle
5 | import moe.shizuku.manager.R
6 | import moe.shizuku.manager.app.AppBarFragmentActivity
7 |
8 | class SettingsActivity : AppBarFragmentActivity() {
9 |
10 | override fun onApplyUserThemeResource(theme: Resources.Theme, isDecorView: Boolean) {
11 | super.onApplyUserThemeResource(theme, isDecorView)
12 | theme.applyStyle(R.style.ThemeOverlay_Rikka_Material3_Preference, true)
13 | }
14 |
15 | override fun onCreate(savedInstanceState: Bundle?) {
16 | super.onCreate(savedInstanceState)
17 |
18 | supportActionBar?.setDisplayHomeAsUpEnabled(true)
19 |
20 | if (savedInstanceState == null) {
21 | supportFragmentManager.beginTransaction()
22 | .replace(R.id.fragment_container, SettingsFragment())
23 | .commit()
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/shell/Shell.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.shell;
2 |
3 | import android.content.pm.PackageManager;
4 | import android.os.Handler;
5 | import android.os.IBinder;
6 |
7 | import rikka.rish.Rish;
8 | import rikka.rish.RishConfig;
9 | import rikka.shizuku.Shizuku;
10 | import rikka.shizuku.ShizukuApiConstants;
11 |
12 | public class Shell extends Rish {
13 |
14 | public static void main(String[] args, String packageName, IBinder binder, Handler handler) {
15 | RishConfig.init(binder, ShizukuApiConstants.BINDER_DESCRIPTOR, 30000);
16 | Shizuku.onBinderReceived(binder, packageName);
17 | Shizuku.addBinderReceivedListenerSticky(() -> {
18 | int version = Shizuku.getVersion();
19 | if (version < 12) {
20 | System.err.println("Rish requires server 12 (running " + version + ")");
21 | System.err.flush();
22 | System.exit(1);
23 | }
24 | new Shell().start(args);
25 | });
26 | }
27 |
28 | @Override
29 | public void requestPermission(Runnable onGrantedRunnable) {
30 | if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) {
31 | onGrantedRunnable.run();
32 | } else if (Shizuku.shouldShowRequestPermissionRationale()) {
33 | System.err.println("Permission denied");
34 | System.err.flush();
35 | System.exit(1);
36 | } else {
37 | Shizuku.addRequestPermissionResultListener(new Shizuku.OnRequestPermissionResultListener() {
38 | @Override
39 | public void onRequestPermissionResult(int requestCode, int grantResult) {
40 | Shizuku.removeRequestPermissionResultListener(this);
41 |
42 | if (grantResult == PackageManager.PERMISSION_GRANTED) {
43 | onGrantedRunnable.run();
44 | } else {
45 | System.err.println("Permission denied");
46 | System.err.flush();
47 | System.exit(1);
48 | }
49 | }
50 | });
51 | Shizuku.requestPermission(0);
52 | }
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/shell/ShellBinderRequestHandler.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.shell
2 |
3 | import android.content.Context
4 | import android.content.Intent
5 | import android.os.IBinder
6 | import android.os.Parcel
7 | import moe.shizuku.manager.utils.Logger.LOGGER
8 | import rikka.shizuku.Shizuku
9 |
10 | object ShellBinderRequestHandler {
11 |
12 | fun handleRequest(context: Context, intent: Intent): Boolean {
13 | if (intent.action != "rikka.shizuku.intent.action.REQUEST_BINDER") {
14 | return false
15 | }
16 |
17 | val binder = intent.getBundleExtra("data")?.getBinder("binder") ?: return false
18 | val shizukuBinder = Shizuku.getBinder()
19 | if (shizukuBinder == null) {
20 | LOGGER.w("Binder not received or Shizuku service not running")
21 | }
22 |
23 | val data = Parcel.obtain()
24 | return try {
25 | data.writeStrongBinder(shizukuBinder)
26 | data.writeString(context.applicationInfo.sourceDir)
27 | binder.transact(1, data, null, IBinder.FLAG_ONEWAY)
28 | true
29 | } catch (e: Throwable) {
30 | e.printStackTrace()
31 | false
32 | } finally {
33 | data.recycle()
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/utils/EnvironmentUtils.kt:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.utils
2 |
3 | import android.app.UiModeManager
4 | import android.content.Context
5 | import android.content.res.Configuration
6 | import android.os.SystemProperties
7 | import java.io.File
8 |
9 | object EnvironmentUtils {
10 |
11 | @JvmStatic
12 | fun isWatch(context: Context): Boolean {
13 | return (context.getSystemService(UiModeManager::class.java).currentModeType
14 | == Configuration.UI_MODE_TYPE_WATCH)
15 | }
16 |
17 | fun isRooted(): Boolean {
18 | return System.getenv("PATH")?.split(File.pathSeparatorChar)
19 | ?.find { File("$it/su").exists() } != null
20 | }
21 |
22 | fun getAdbTcpPort(): Int {
23 | var port = SystemProperties.getInt("service.adb.tcp.port", -1)
24 | if (port == -1) port = SystemProperties.getInt("persist.adb.tcp.port", -1)
25 | return port
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/utils/MultiLocaleEntity.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.utils;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | import java.util.LinkedHashMap;
6 | import java.util.Locale;
7 |
8 | import moe.shizuku.manager.ShizukuSettings;
9 |
10 | public class MultiLocaleEntity extends LinkedHashMap {
11 |
12 | public static final LocaleProvider DEFAULT_LOCAL_PROVIDER = new LocaleProvider() {
13 | @Override
14 | public Locale get() {
15 | return ShizukuSettings.getLocale();
16 | }
17 | };
18 | private static LocaleProvider sLocaleProvider = DEFAULT_LOCAL_PROVIDER;
19 |
20 | public static void setLocaleProvider(@NonNull LocaleProvider localeProvider) {
21 | sLocaleProvider = localeProvider;
22 | }
23 |
24 | public String get() {
25 | return get(sLocaleProvider.get());
26 | }
27 |
28 | public String get(@NonNull Locale locale) {
29 | if (size() > 0) {
30 | String language = locale.getLanguage();
31 | String region = locale.getCountry();
32 |
33 | // fully match
34 | locale = new Locale(language, region);
35 | for (String l : keySet()) {
36 | if (locale.toString().equals(l.replace('-', '_'))) {
37 | return get(l);
38 | }
39 | }
40 |
41 | // match language only keys
42 | locale = new Locale(language);
43 | for (String l : keySet()) {
44 | if (locale.toString().equals(l)) {
45 | return get(l);
46 | }
47 | }
48 |
49 | // match a language_region with only language
50 | for (String l : keySet()) {
51 | if (l.startsWith(locale.toString())) {
52 | return get(l);
53 | }
54 | }
55 |
56 | if (containsKey("en")) {
57 | return get("en");
58 | }
59 |
60 | if (containsKey("default")) {
61 | return get("default");
62 | }
63 |
64 | for (String key : keySet()) {
65 | if (!"overwrite_default".equals(key))
66 | return get(key);
67 | }
68 | }
69 | return null;
70 | }
71 |
72 | public abstract static class LocaleProvider {
73 | public abstract Locale get();
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/utils/UserHandleCompat.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.utils;
2 |
3 | import android.system.Os;
4 |
5 | public class UserHandleCompat {
6 |
7 | public static final int PER_USER_RANGE = 100000;
8 | private static final int MY_USER_ID = getUserId(Os.getuid());
9 |
10 | public static int getUserId(int uid) {
11 | return uid / PER_USER_RANGE;
12 | }
13 |
14 | public static int getAppId(int uid) {
15 | return uid % PER_USER_RANGE;
16 | }
17 |
18 | public static int myUserId() {
19 | return MY_USER_ID;
20 | }
21 | }
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/utils/UserInfoCompat.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.utils;
2 |
3 | public class UserInfoCompat {
4 |
5 | public final int id;
6 | public final String name;
7 |
8 | public UserInfoCompat(int id, String name) {
9 | this.id = id;
10 | this.name = name;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/widget/CheckedImageView.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.widget;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.widget.Checkable;
6 | import android.widget.ImageView;
7 |
8 | import androidx.annotation.Nullable;
9 |
10 | public class CheckedImageView extends ImageView implements Checkable {
11 |
12 | private static final int[] CHECKED_STATE_SET = {
13 | android.R.attr.state_checked
14 | };
15 | private boolean mChecked;
16 |
17 | public CheckedImageView(Context context) {
18 | super(context);
19 | }
20 |
21 | public CheckedImageView(Context context, @Nullable AttributeSet attrs) {
22 | super(context, attrs);
23 | }
24 |
25 | public CheckedImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
26 | super(context, attrs, defStyleAttr);
27 | }
28 |
29 | public CheckedImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
30 | super(context, attrs, defStyleAttr, defStyleRes);
31 | }
32 |
33 | @Override
34 | public boolean isChecked() {
35 | return mChecked;
36 | }
37 |
38 | @Override
39 | public void setChecked(boolean checked) {
40 | if (mChecked != checked) {
41 | mChecked = checked;
42 | refreshDrawableState();
43 | }
44 | }
45 |
46 | @Override
47 | public void toggle() {
48 | setChecked(!mChecked);
49 | }
50 |
51 | @Override
52 | public int[] onCreateDrawableState(int extraSpace) {
53 | final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
54 | if (isChecked()) {
55 | mergeDrawableStates(drawableState, CHECKED_STATE_SET);
56 | }
57 | return drawableState;
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/manager/src/main/java/moe/shizuku/manager/widget/VerticalPaddingDecoration.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.manager.widget;
2 |
3 | import android.content.Context;
4 | import android.graphics.Rect;
5 | import android.view.View;
6 |
7 | import androidx.annotation.NonNull;
8 | import androidx.recyclerview.widget.RecyclerView;
9 |
10 | public class VerticalPaddingDecoration extends RecyclerView.ItemDecoration {
11 |
12 | private boolean mAllowTop, mAllowBottom;
13 | private int mPadding;
14 |
15 | public VerticalPaddingDecoration(Context context) {
16 | this(context, 8);
17 | }
18 |
19 | public VerticalPaddingDecoration(Context context, int paddingDp) {
20 | this.mPadding = Math.round(paddingDp * context.getResources().getDisplayMetrics().density);
21 | this.mAllowTop = true;
22 | this.mAllowBottom = true;
23 | }
24 |
25 | public void setAllowTop(boolean allowTop) {
26 | mAllowTop = allowTop;
27 | }
28 |
29 | public void setAllowBottom(boolean allowBottom) {
30 | mAllowBottom = allowBottom;
31 | }
32 |
33 | @Override
34 | public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
35 | if (parent.getAdapter() == null) {
36 | return;
37 | }
38 | int position = parent.getChildAdapterPosition(view);
39 | int count = parent.getAdapter().getItemCount();
40 | if (position == 0 && mAllowTop) {
41 | outRect.top = mPadding;
42 | } else if (position == count - 1 && mAllowBottom) {
43 | outRect.bottom = mPadding;
44 | }
45 | }
46 | }
47 |
48 |
--------------------------------------------------------------------------------
/manager/src/main/jni/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.4.1)
2 |
3 | project("shizuku")
4 |
5 | set(CMAKE_CXX_STANDARD 17)
6 |
7 | set(C_FLAGS "-Werror=format -fdata-sections -ffunction-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics")
8 | set(LINKER_FLAGS "-Wl,--hash-style=both")
9 |
10 | if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
11 | message("Builing Release...")
12 |
13 | set(C_FLAGS "${C_FLAGS} -O2 -fvisibility=hidden -fvisibility-inlines-hidden")
14 | set(LINKER_FLAGS "${LINKER_FLAGS} -Wl,-exclude-libs,ALL -Wl,--gc-sections")
15 | else ()
16 | message("Builing Debug...")
17 |
18 | add_definitions(-DDEBUG)
19 | endif ()
20 |
21 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${C_FLAGS}")
22 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${C_FLAGS}")
23 |
24 | set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}")
25 | set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}")
26 |
27 | find_library(log-lib log)
28 | find_package(boringssl REQUIRED CONFIG)
29 | find_package(cxx REQUIRED CONFIG)
30 |
31 | add_executable(libshizuku.so
32 | starter.cpp misc.cpp selinux.cpp cgroup.cpp android.cpp)
33 |
34 | target_link_libraries(libshizuku.so ${log-lib} cxx::cxx)
35 |
36 | if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
37 | add_custom_command(TARGET libshizuku.so POST_BUILD
38 | COMMAND ${CMAKE_STRIP} --remove-section=.comment "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libshizuku.so")
39 | endif ()
40 |
41 | add_library(adb SHARED
42 | adb_pairing.cpp misc.cpp)
43 |
44 | target_link_libraries(adb ${log-lib} boringssl::crypto_static cxx::cxx)
45 |
46 | if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
47 | add_custom_command(TARGET adb POST_BUILD
48 | COMMAND ${CMAKE_STRIP} --remove-section=.comment "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libadb.so")
49 | endif ()
50 |
--------------------------------------------------------------------------------
/manager/src/main/jni/adb_pairing.h:
--------------------------------------------------------------------------------
1 | #ifndef ADB_H
2 | #define ADB_H
3 |
4 | #endif // ADB_H
5 |
--------------------------------------------------------------------------------
/manager/src/main/jni/android.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 |
7 | namespace android {
8 |
9 | int GetApiLevel() {
10 | static int apiLevel = 0;
11 | if (apiLevel > 0) return apiLevel;
12 |
13 | char buf[PROP_VALUE_MAX + 1];
14 | if (__system_property_get("ro.build.version.sdk", buf) > 0)
15 | apiLevel = atoi(buf);
16 |
17 | return apiLevel;
18 | }
19 |
20 | int GetPreviewApiLevel() {
21 | static int previewApiLevel = 0;
22 | if (previewApiLevel > 0) return previewApiLevel;
23 |
24 | char buf[PROP_VALUE_MAX + 1];
25 | if (__system_property_get("ro.build.version.preview_sdk", buf) > 0)
26 | previewApiLevel = atoi(buf);
27 |
28 | return previewApiLevel;
29 | }
30 | }
--------------------------------------------------------------------------------
/manager/src/main/jni/android.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | namespace android {
4 |
5 | int GetApiLevel();
6 |
7 | int GetPreviewApiLevel();
8 | }
--------------------------------------------------------------------------------
/manager/src/main/jni/cgroup.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | namespace cgroup {
7 |
8 | static ssize_t fdgets(char *buf, const size_t size, int fd) {
9 | ssize_t len = 0;
10 | buf[0] = '\0';
11 | while (len < size - 1) {
12 | ssize_t ret = read(fd, buf + len, 1);
13 | if (ret < 0)
14 | return -1;
15 | if (ret == 0)
16 | break;
17 | if (buf[len] == '\0' || buf[len++] == '\n') {
18 | break;
19 | }
20 | }
21 | buf[len] = '\0';
22 | buf[size - 1] = '\0';
23 | return len;
24 | }
25 |
26 | int get_cgroup(int pid, int *cuid, int *cpid) {
27 | char buf[PATH_MAX];
28 | snprintf(buf, PATH_MAX, "/proc/%d/cgroup", pid);
29 |
30 | int fd = open(buf, O_RDONLY);
31 | if (fd == -1)
32 | return -1;
33 |
34 | while (fdgets(buf, PATH_MAX, fd) > 0) {
35 | if (sscanf(buf, "%*d:cpuacct:/uid_%d/pid_%d", cuid, cpid) == 2) {
36 | close(fd);
37 | return 0;
38 | }
39 | }
40 | close(fd);
41 | return -1;
42 | }
43 |
44 | static int switch_cgroup(int pid, int cuid, int cpid, const char *name) {
45 | char buf[PATH_MAX];
46 | if (cuid != -1 && cpid != -1) {
47 | snprintf(buf, PATH_MAX, "/acct/uid_%d/pid_%d/%s", cuid, cpid, name);
48 | } else {
49 | snprintf(buf, PATH_MAX, "/acct/%s", name);
50 | }
51 |
52 | int fd = open(buf, O_WRONLY | O_APPEND);
53 | if (fd == -1)
54 | return -1;
55 |
56 | snprintf(buf, PATH_MAX, "%d\n", pid);
57 | if (write(fd, buf, strlen(buf)) == -1) {
58 | close(fd);
59 | return -1;
60 | }
61 |
62 | close(fd);
63 | return 0;
64 | }
65 |
66 | int switch_cgroup(int pid, int cuid, int cpid) {
67 | int res = 0;
68 | res += switch_cgroup(pid, cuid, cpid, "cgroup.procs");
69 | res += switch_cgroup(pid, cuid, cpid, "tasks");
70 | return res;
71 | }
72 |
73 | }
--------------------------------------------------------------------------------
/manager/src/main/jni/cgroup.h:
--------------------------------------------------------------------------------
1 | #ifndef CGROUP_H
2 | #define CGROUP_H
3 |
4 | namespace cgroup {
5 | int get_cgroup(int pid, int *cuid, int *cpid);
6 |
7 | int switch_cgroup(int pid, int cuid, int cpid);
8 | }
9 |
10 | #endif // CGROUP_H
11 |
--------------------------------------------------------------------------------
/manager/src/main/jni/helper.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include "selinux.h"
10 |
11 | #define LOG_TAG "ShizukuServer"
12 |
13 | #include "logging.h"
14 |
15 | static jint setcontext(JNIEnv *env, jobject thiz, jstring jName) {
16 | const char *name = env->GetStringUTFChars(jName, nullptr);
17 |
18 | if (!se::setcon)
19 | return -1;
20 |
21 | int res = se::setcon(name);
22 | if (res == -1) PLOGE("setcon %s", name);
23 |
24 | env->ReleaseStringUTFChars(jName, name);
25 |
26 | return res;
27 | }
28 |
29 | static JNINativeMethod gMethods[] = {
30 | {"setSELinuxContext", "(Ljava/lang/String;)I", (void *) setcontext},
31 | };
32 |
33 | static int registerNativeMethods(JNIEnv *env, const char *className,
34 | JNINativeMethod *gMethods, int numMethods) {
35 | jclass clazz;
36 | clazz = env->FindClass(className);
37 | if (clazz == nullptr)
38 | return JNI_FALSE;
39 |
40 | if (env->RegisterNatives(clazz, gMethods, numMethods) < 0)
41 | return JNI_FALSE;
42 |
43 | return JNI_TRUE;
44 | }
45 |
46 | static int registerNatives(JNIEnv *env) {
47 | if (!registerNativeMethods(env, "moe/shizuku/server/utils/NativeHelper", gMethods,
48 | sizeof(gMethods) / sizeof(gMethods[0])))
49 | return JNI_FALSE;
50 |
51 | return JNI_TRUE;
52 | }
53 |
54 | JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
55 | JNIEnv *env = nullptr;
56 | jint result;
57 |
58 | if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK)
59 | return -1;
60 |
61 | assert(env != nullptr);
62 |
63 | se::init();
64 |
65 | if (!registerNatives(env)) {
66 | LOGE("registerNatives NativeHelper");
67 | return -1;
68 | }
69 |
70 | result = JNI_VERSION_1_6;
71 |
72 | return result;
73 | }
74 |
--------------------------------------------------------------------------------
/manager/src/main/jni/logging.h:
--------------------------------------------------------------------------------
1 | #ifndef _LOGGING_H
2 | #define _LOGGING_H
3 |
4 | #include
5 | #include "android/log.h"
6 |
7 | #ifndef LOG_TAG
8 | #define LOG_TAG "Shizuku"
9 | #endif
10 |
11 | #ifndef NO_LOG
12 | #ifndef NO_DEBUG_LOG
13 | #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
14 | #else
15 | #define LOGD(...)
16 | #endif
17 | #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
18 | #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
19 | #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
20 | #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
21 | #define PLOGE(fmt, args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
22 | #else
23 | #define LOGD(...)
24 | #define LOGV(...)
25 | #define LOGI(...)
26 | #define LOGW(...)
27 | #define LOGE(...)
28 | #define PLOGE(fmt, args...)
29 | #endif
30 | #endif // _LOGGING_H
31 |
--------------------------------------------------------------------------------
/manager/src/main/jni/misc.h:
--------------------------------------------------------------------------------
1 | #ifndef MISC_H
2 | #define MISC_H
3 |
4 | int copyfile(const char *src_path, const char *dst_path);
5 |
6 | uintptr_t memsearch(const uintptr_t start, const uintptr_t end, const void *value, size_t size);
7 |
8 | int switch_mnt_ns(int pid);
9 |
10 | int get_proc_name(int pid, char *name, size_t _size);
11 |
12 | using foreach_proc_function = void(pid_t);
13 |
14 | void foreach_proc(foreach_proc_function *func);
15 |
16 | char *trim(char *str);
17 |
18 | #endif // MISC_H
19 |
--------------------------------------------------------------------------------
/manager/src/main/jni/selinux.h:
--------------------------------------------------------------------------------
1 | #ifndef SELINUX_H
2 | #define SELINUX_H
3 |
4 | namespace se {
5 | void init();
6 |
7 | using getcon_t = int(char **);
8 | using setcon_t = int(const char *);
9 | using setfilecon_t = int(const char *, const char *);
10 | using selinux_check_access_t = int(const char *, const char *, const char *, const char *,
11 | void *);
12 | using freecon_t = void(char *);
13 |
14 | extern getcon_t *getcon;
15 | extern setcon_t *setcon;
16 | extern setfilecon_t *setfilecon;
17 | extern selinux_check_access_t *selinux_check_access;
18 | extern freecon_t *freecon;
19 | }
20 |
21 | #endif // SELINUX_H
22 |
--------------------------------------------------------------------------------
/manager/src/main/res/animator/alpha_animator.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | -
5 |
6 |
11 |
12 |
13 | -
14 |
15 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/manager/src/main/res/color-night/home_card_background_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/manager/src/main/res/color-night/home_card_foreground_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/manager/src/main/res/color/grant_permissions_button_ripple_color_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/manager/src/main/res/color/home_card_background_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/manager/src/main/res/color/home_card_foreground_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable-v24/ic_default_app_icon_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable-v26/ic_default_app_icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/card_btn_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 | -
10 |
11 |
12 |
13 |
-
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/grant_permissions_buttons_bottom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 | -
6 |
7 |
8 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/grant_permissions_buttons_top.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 | -
6 |
7 |
8 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/home_card_foreground.xml:
--------------------------------------------------------------------------------
1 |
16 |
18 | -
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_action_about_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_action_settings_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_adb_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_baseline_link_24.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_close_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_code_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_help_outline_24dp.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
12 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_learn_more_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_monochrome.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_numeric_1_circle_outline_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_numeric_2_circle_outline_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_numeric_3_circle_outline_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_arrow_upward_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_dark_mode_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_info_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_notifications_active_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_open_in_new_24.xml:
--------------------------------------------------------------------------------
1 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_play_arrow_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_outline_translate_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_root_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_server_error_24dp.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_server_ok_24dp.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_server_restart.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_server_start_24dp.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_settings_outline_24dp.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_system_icon.xml:
--------------------------------------------------------------------------------
1 |
6 |
11 |
14 |
15 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_terminal_24.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_wadb_24.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
17 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/ic_warning_24.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/drawable/shape_circle_icon_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
10 |
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/about_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
21 |
22 |
28 |
29 |
34 |
35 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/adb_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
19 |
20 |
25 |
26 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/app_list_empty.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/app_list_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
22 |
23 |
30 |
31 |
37 |
38 |
47 |
48 |
53 |
54 |
60 |
61 |
62 |
63 |
64 |
65 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/appbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/appbar_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/appbar_fragment_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/apps_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
18 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/confirmation_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
18 |
19 |
31 |
32 |
36 |
37 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
21 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_daemon.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
28 |
29 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_extra_step_required.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
23 |
24 |
30 |
31 |
39 |
40 |
41 |
42 |
43 |
44 |
53 |
54 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_item_container.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_learn_more.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
28 |
29 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_manage_apps_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
28 |
29 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_manage_system.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
28 |
29 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_remote_control.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
20 |
21 |
28 |
29 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_server_status.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
17 |
23 |
24 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_start_adb.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
20 |
21 |
28 |
29 |
30 |
31 |
40 |
41 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_start_root.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
22 |
23 |
31 |
32 |
33 |
34 |
42 |
43 |
49 |
50 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_start_wireless_adb.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
22 |
23 |
30 |
31 |
32 |
33 |
41 |
42 |
47 |
48 |
53 |
54 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/home_terminal.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
21 |
22 |
29 |
30 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/preference_recyclerview.xml:
--------------------------------------------------------------------------------
1 |
2 |
19 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/shell_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/manager/src/main/res/layout/starter_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
20 |
21 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/manager/src/main/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-hdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-hdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xhdpi/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xhdpi/banner.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/manager/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/manager/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/manager/src/main/res/raw/start.sh:
--------------------------------------------------------------------------------
1 | #!/system/bin/sh
2 |
3 | SOURCE_PATH="%%%STARTER_PATH%%%"
4 | STARTER_PATH="/data/local/tmp/shizuku_starter"
5 |
6 | echo "info: start.sh begin"
7 |
8 | recreate_tmp() {
9 | echo "info: /data/local/tmp is possible broken, recreating..."
10 | rm -rf /data/local/tmp
11 | mkdir -p /data/local/tmp
12 | }
13 |
14 | broken_tmp() {
15 | echo "fatal: /data/local/tmp is broken, please try reboot the device or manually recreate it..."
16 | exit 1
17 | }
18 |
19 | if [ -f "$SOURCE_PATH" ]; then
20 | echo "info: attempt to copy starter from $SOURCE_PATH to $STARTER_PATH"
21 | rm -f $STARTER_PATH
22 |
23 | cp "$SOURCE_PATH" $STARTER_PATH
24 | res=$?
25 | if [ $res -ne 0 ]; then
26 | recreate_tmp
27 | cp "$SOURCE_PATH" $STARTER_PATH
28 |
29 | res=$?
30 | if [ $res -ne 0 ]; then
31 | broken_tmp
32 | fi
33 | fi
34 |
35 | chmod 700 $STARTER_PATH
36 | chown 2000 $STARTER_PATH
37 | chgrp 2000 $STARTER_PATH
38 | fi
39 |
40 | if [ -f $STARTER_PATH ]; then
41 | echo "info: exec $STARTER_PATH"
42 | $STARTER_PATH "$1"
43 | result=$?
44 | if [ ${result} -ne 0 ]; then
45 | echo "info: shizuku_starter exit with non-zero value $result"
46 | else
47 | echo "info: shizuku_starter exit with 0"
48 | fi
49 | else
50 | echo "Starter file not exist, please open Shizuku and try again."
51 | fi
52 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ang/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - Webmaster araçlan
5 |
6 |
7 | Webmaster araçlan
8 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ars/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | “ارجوك شغل ”المعالجة اللاسلكية
4 | \"عم نشيّك خاصية \"المعالجة اللاسلكية
5 | على إصدارات الأندرويد ١١ او اعلى، فيك تشغل \"المعالجة اللاسلكية\" وتشغل معها شيزوكو مباشرا من جهازك، من دون ما تتصل بالكمبيوتر
6 | \nبحيات ربك، ارجوك شوف التعليمات
7 | بلش بـالمعالجة اللاسلكية
8 | نسخ
9 | شوف الأمر
10 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-bg/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-bn/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | নকল
4 | কমান্ড প্রদর্শন করুন
5 | সহযোগিতা নিন
6 | একটি কম্পিউটার এ সংযোগ প্রদানের মাধ্যমে শুরু করুন
7 | সংস্করণ %2$s, %1$s<br> %3$s সংস্করণে নবায়ন করতে আবার শুরু করুন
8 | সংস্করণ %2$s, %1$s
9 | %1$s চলছে না
10 | %1$s চলমান
11 | অনুবাদকগণ
12 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ca/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Activeu \"Depuració sense fil\" a \"Opcions de desenvolupador\". La \"depuració sense fil\" es desactiva automàticament quan canvia la xarxa.
4 | \n
5 | \nTingueu en compte que no desactiveu les \"Opcions de desenvolupador\" ni la \"depuració USB\", o Shizuku s\'aturarà.
6 | Abans d\'Android 11, cal connectar-se a un ordinador per habilitar la depuració sense fil.
7 | Obre Shizuku
8 | El codi de vinculació és incorrecte.
9 | Codi d\'aparellament
10 | S\'està buscant el servei d\'aparellament
11 | Vincula amb el dispositiu
12 | Maridatge
13 | El port és un nombre enter que va de l\'1 al 65535.
14 | Si us plau, proveu de desactivar i activar \"Depuració sense fil\" si continua cercant.
15 | Cercant servei de depuració sense fil
16 | Guia pas a pas
17 | Comenceu mitjançant la depuració sense fil
18 | Enviar
19 | Còpia
20 | Veure comanda
21 | Llegeix l\'ajuda
22 | Comenceu connectant-vos a un ordinador
23 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-da/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-el/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-enm/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-eo/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Nigra nokta etoso
4 | Aspekto
5 | Lingvo
6 | Agordoj
7 | Lerni Shizuku
8 |
9 | - Rajtigis %d aplikaĵon
10 | - Rajtigis %d aplikaĵojn
11 |
12 | Komenci
13 | Programistaj opcioj
14 | Sendi
15 | Kopii
16 | Vidi komandon
17 | Legi helpon
18 | Konektu al komputilo por komenci
19 | Versio %2$s, %1$s
20 | %1$s ne estas funkcianta
21 | %1$s estas funkcianta
22 | JakubFabijan
23 |
24 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-es-rCL/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Iniciar desde depuración inalámbrica
4 | Enviar
5 | Copiar
6 | <font face=monospace>%1$s</font><br><br>* Esto tiene otras consideraciones, por favor confirme que ha leído la información de ayuda primero.
7 | Ver ayuda
8 | Ver comando
9 | Para dispositivos sin root, usted necesita ADB para ejecutar Shizuku (requiere una conexión a un ordenador). Este proceso se debe repetir cada vez que el dispositivo sea reiniciando. <b><a href=\"%1$s\">obtener más ayuda</a></b>.
10 | Versión %2$s, %1$s
11 | %1$s no está activo
12 | %1$s está activo
13 | Abrir Shizuku
14 | Acerca de
15 | Opciones de desarrollador
16 | El sistema requiere que el cuadro de diálogo de emparejamiento esté siempre visible, el uso del modo de pantalla dividida es la única forma de permitir que esta aplicación y el cuadro de diálogo del sistema estén visibles al mismo tiempo.
17 | Ingrese primero al modo de pantalla dividida (ventanas múltiples).
18 | El puerto es un número entero comprendido entre 1 y 65535.
19 | Puerto
20 | Buscando servicio de depuración inalámbrica
21 | Empiece por conectarse a su computador
22 | —Peter Cuevas
23 | Versión %2$s, %1$s<br>Reinicie para actualizar a la versión %3$s
24 |
25 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-et/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-he/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | הצג פקודה
4 | קראו את דפי העזרה
5 | עבור מכשירים ללא גישת שורש, עליך להשתמש ב-adb כדי להתחיל את Shizuku (נדרש חיבור למחשב). \u0020עליך לחזור על תהליך זה בכל פעם שמכשירך יופעל מחדש. בבקשה קראו את דפי העזרה.
6 | התחל באמצעות חיבור למחשב
7 | גירסה %2$s, %1$s<br>התחל מחדש כדי לעדכן לגירסה %3$s
8 | גירסה %2$s, %1$s
9 | %1$s לא פועל
10 | %1$s פועל
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-hr/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ka/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | ბრძანების ნახვა
4 | წაიკითხეთ დახმარება
5 | არა დარუთული მოწყობილობებისთვის, Shizuku რომ ჩართო შენ გჭირდება ადბ-ს გამოყენება(საჭიროებს კომპიუტერთან კავშირს). ეს პროცესი უნდა გაიმეოროთ თქვენი მოწყობილობის ყოველ გადატვირთვაზე. გთხოვთ წაიკითხოთ დახმარება.
6 | დაიწყე კომპიუტერთან დაკავშირებით
7 | ვერსია %2$, %1$<br>თავიდან ჩართე, რომ განაახლო %3$s ვერსიაზე
8 | ვერსია
9 | არ მუშაობს
10 | მთავარი-სტატუსი
11 | მთარგმნელები
12 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-kk/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-lb/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ml/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ms/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Versi %2$s, %1$s
4 | %1$s tidak berjalan
5 | Sistem memerlukan dialog berpasangan sentiasa kelihatan, menggunakan mod skrin pisah ialah satu-satunya cara untuk membolehkan apl dan dialog sistem ini kelihatan serentak.
6 | Hantar
7 | Salin
8 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-my/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-nl/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Versie %2$s, %1$s
4 | %1$s is niet actief
5 | %1$s is actief
6 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-or/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-sk/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-sv/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-sw600dp/bools.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | true
4 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-sw600dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 24dp
4 |
5 | 8dp
6 |
7 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-sw600dp/values.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | androidx.recyclerview.widget.StaggeredGridLayoutManager
4 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ta/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | கட்டளையைக் காட்டு
4 | உதவி பக்கத்தை திற
5 | Root அணுகல் இல்லாத பட்சத்தில், adb பயன்படுத்தி Shizuku வை தொடங்க வேண்டும் (கணினி இணைப்பு தேவை). ஒவ்வொரு முறை திறன்பேசி மறுதொடக்கம் ஆகும்போதும் இச்செயலை செய்ய வேண்டும். உதவி பக்கத்தை படிக்கவும்
6 | முதலில், திறன்பேசியை கணினியுடன் இணைக்கவும்
7 | பதிப்பு %2$s, %1$s<br>%3$s பதிப்புக்கு மேம்படுத்த செயலியை மறுதொடக்கம் செய்யவும்
8 | பதிப்பு %2$s, %1$s
9 | %1$s செயல்நிலையில் இல்லை
10 | %1$s செயல்நிலையில் உள்ளது
11 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ug/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-ur/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-v21/themes_override.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
16 |
17 |
21 |
22 |
26 |
27 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/manager/src/main/res/values-v31/themes_overlay.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | - @string/dark_theme_off
6 | - @string/dark_theme_on
7 | - @string/follow_system
8 |
9 |
10 |
11 | - 1
12 | - 2
13 | - -1
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/bools.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | false
4 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 |
5 | #3F51B5
6 | #B1B8DF
7 |
8 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 |
5 | 18sp
6 |
7 | 16dp
8 |
9 | 16dp
10 | 72dp
11 | 0dp
12 |
13 | 0dp
14 |
15 | 4dp
16 |
17 | 40dp
18 |
19 | 16dp
20 |
21 |
22 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/strings_untranslatable.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | https://lzimul.top
4 |
5 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
16 |
17 |
18 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/themes_overlay.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/manager/src/main/res/values/values.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | androidx.recyclerview.widget.LinearLayoutManager
4 |
--------------------------------------------------------------------------------
/manager/src/main/res/xml/backup_descriptor.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
--------------------------------------------------------------------------------
/manager/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/manager/src/main/res/xml/settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
22 |
23 |
27 |
28 |
31 |
32 |
33 |
34 |
37 |
38 |
44 |
45 |
49 |
50 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/server/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.library'
3 | id 'kotlin-android'
4 | }
5 |
6 | android {
7 | namespace 'moe.shizuku.server'
8 | buildFeatures {
9 | buildConfig = false
10 | }
11 | }
12 |
13 | dependencies {
14 | implementation "androidx.annotation:annotation:1.2.0"
15 | implementation 'com.google.code.gson:gson:2.9.0'
16 | api 'dev.rikka.rikkax.parcelablelist:parcelablelist:2.0.0'
17 |
18 | implementation project(':aidl')
19 | implementation project(':common')
20 | implementation project(':shared')
21 | compileOnly project(':provider')
22 | implementation project(':starter')
23 | implementation project(':rish')
24 | implementation project(':server-shared')
25 | implementation libs.hidden.compat
26 | compileOnly libs.hidden.stub
27 | annotationProcessor libs.refine.annotation.processor
28 | implementation libs.refine.annotation
29 | }
30 |
--------------------------------------------------------------------------------
/server/proguard-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/server/proguard-rules.pro
--------------------------------------------------------------------------------
/server/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/server/src/main/java/rikka/shizuku/server/ServerConstants.java:
--------------------------------------------------------------------------------
1 | package rikka.shizuku.server;
2 |
3 | public class ServerConstants {
4 |
5 | public static final int MANAGER_APP_NOT_FOUND = 50;
6 |
7 | public static final String PERMISSION = "moe.shizuku.manager.permission.API_V23";
8 | public static final String MANAGER_APPLICATION_ID = "com.lzimul.shizuku";
9 | public static final String REQUEST_PERMISSION_ACTION = MANAGER_APPLICATION_ID + ".intent.action.REQUEST_PERMISSION";
10 |
11 | public static final int BINDER_TRANSACTION_getApplications = 10001;
12 | }
13 |
--------------------------------------------------------------------------------
/server/src/main/java/rikka/shizuku/server/ShizukuClientManager.java:
--------------------------------------------------------------------------------
1 | package rikka.shizuku.server;
2 |
3 | public class ShizukuClientManager extends ClientManager {
4 |
5 | public ShizukuClientManager(ShizukuConfigManager configManager) {
6 | super(configManager);
7 | }
8 | }
9 |
10 |
11 |
--------------------------------------------------------------------------------
/server/src/main/java/rikka/shizuku/server/ShizukuConfig.java:
--------------------------------------------------------------------------------
1 | package rikka.shizuku.server;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | import com.google.gson.annotations.SerializedName;
6 |
7 | import java.util.ArrayList;
8 | import java.util.List;
9 |
10 | public class ShizukuConfig {
11 |
12 | public static final int LATEST_VERSION = 2;
13 |
14 | @SerializedName("version")
15 | public int version = LATEST_VERSION;
16 |
17 | @SerializedName("packages")
18 | public List packages = new ArrayList<>();
19 |
20 | public static class PackageEntry extends ConfigPackageEntry {
21 |
22 | @SerializedName("uid")
23 | public final int uid;
24 |
25 | @SerializedName("flags")
26 | public int flags;
27 |
28 | @SerializedName("packages")
29 | public List packages;
30 |
31 | public PackageEntry(int uid, int flags) {
32 | this.uid = uid;
33 | this.flags = flags;
34 | this.packages = new ArrayList<>();
35 | }
36 |
37 | @Override
38 | public boolean isAllowed() {
39 | return (flags & ConfigManager.FLAG_ALLOWED) != 0;
40 | }
41 |
42 | @Override
43 | public boolean isDenied() {
44 | return (flags & ConfigManager.FLAG_DENIED) != 0;
45 | }
46 | }
47 |
48 | public ShizukuConfig() {
49 | }
50 |
51 | public ShizukuConfig(@NonNull List packages) {
52 | this.version = LATEST_VERSION;
53 | this.packages = packages;
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/server/src/main/java/rikka/shizuku/server/api/IContentProviderUtils.java:
--------------------------------------------------------------------------------
1 | package rikka.shizuku.server.api;
2 |
3 | import android.content.AttributionSource;
4 | import android.content.IContentProvider;
5 | import android.os.Build;
6 | import android.os.Bundle;
7 | import android.os.RemoteException;
8 |
9 | import androidx.annotation.NonNull;
10 | import androidx.annotation.Nullable;
11 |
12 | import rikka.shizuku.server.util.OsUtils;
13 |
14 | public class IContentProviderUtils {
15 |
16 | public static Bundle callCompat(@NonNull IContentProvider provider, @Nullable String callingPkg, @Nullable String authority, @Nullable String method, @Nullable String arg, @Nullable Bundle extras) throws RemoteException {
17 | Bundle result;
18 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
19 | result = provider.call((new AttributionSource.Builder(OsUtils.getUid())).setPackageName(callingPkg).build(), authority, method, arg, extras);
20 | } else if (Build.VERSION.SDK_INT >= 30) {
21 | result = provider.call(callingPkg, (String) null, authority, method, arg, extras);
22 | } else if (Build.VERSION.SDK_INT >= 29) {
23 | result = provider.call(callingPkg, authority, method, arg, extras);
24 | } else {
25 | result = provider.call(callingPkg, method, arg, extras);
26 | }
27 |
28 | return result;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/server/src/main/java/rikka/shizuku/server/ktx/Handler.kt:
--------------------------------------------------------------------------------
1 | package rikka.shizuku.server.ktx
2 |
3 | import android.os.Handler
4 | import android.os.HandlerThread
5 | import android.os.Looper
6 |
7 | val mainHandler by lazy {
8 | Handler(Looper.getMainLooper())
9 | }
10 |
11 | private val workerThread by lazy(LazyThreadSafetyMode.NONE) {
12 | HandlerThread("Worker").apply { start() }
13 | }
14 |
15 | val workerHandler by lazy {
16 | Handler(workerThread.looper)
17 | }
18 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | google()
5 | mavenCentral()
6 | mavenLocal()
7 | maven {
8 | url("https://s01.oss.sonatype.org/content/repositories/releases/")
9 | content {
10 | includeGroup("dev.rikka.tools.refine")
11 | includeGroup("dev.rikka.tools.autoresconfig")
12 | includeGroup("dev.rikka.tools.materialthemebuilder")
13 | }
14 | }
15 | }
16 | }
17 | dependencyResolutionManagement {
18 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
19 | repositories {
20 | google()
21 | mavenCentral()
22 | mavenLocal()
23 | maven { url 'https://jitpack.io' }
24 | maven {
25 | url("https://s01.oss.sonatype.org/content/repositories/releases/")
26 | content {
27 | includeGroupByRegex("dev.rikka.*")
28 | includeGroup("org.lsposed.hiddenapibypass")
29 | }
30 | }
31 | }
32 | versionCatalogs {
33 | libs {
34 | version('hidden-api', '4.3.3')
35 | library('hidden-compat', 'dev.rikka.hidden', 'compat').versionRef('hidden-api')
36 | library('hidden-stub', 'dev.rikka.hidden', 'stub').versionRef('hidden-api')
37 |
38 | version('refine', '4.3.0')
39 | library('refine-runtime', 'dev.rikka.tools.refine', 'runtime').versionRef('refine')
40 | library('refine-annotation', 'dev.rikka.tools.refine', 'annotation').versionRef('refine')
41 | library('refine-annotation-processor', 'dev.rikka.tools.refine', 'annotation-processor').versionRef('refine')
42 | plugin('refine', 'dev.rikka.tools.refine').versionRef('refine')
43 | }
44 | }
45 | }
46 |
47 | include ':server', ':starter', ':shell'
48 | include ':manager'
49 | include ':common'
50 |
51 | def root = "api"
52 |
53 | def propFile = file('local.properties')
54 | def props = new Properties()
55 |
56 | if (propFile.canRead()) {
57 | props.load(new FileInputStream(propFile))
58 |
59 | if (props != null) {
60 | if (props["api.useLocal"].equals("true")) {
61 | root = props["api.dir"]
62 | }
63 | }
64 | }
65 |
66 | include ':aidl'
67 | project(':aidl').projectDir = file("$root${File.separator}aidl")
68 |
69 | include ':rish'
70 | project(':rish').projectDir = file("$root${File.separator}rish")
71 |
72 | include ':shared'
73 | project(':shared').projectDir = file("$root${File.separator}shared")
74 |
75 | include ':api'
76 | project(':api').projectDir = file("$root${File.separator}api")
77 |
78 | include ':provider'
79 | project(':provider').projectDir = file("$root${File.separator}provider")
80 |
81 | include ':server-shared'
82 | project(':server-shared').projectDir = file("$root${File.separator}server-shared")
83 |
84 | include ':hidden-api-stub'
85 | project(':hidden-api-stub').projectDir = file("$root${File.separator}hidden-api-stub")
86 |
--------------------------------------------------------------------------------
/shell/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/shell/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | }
4 |
5 | android {
6 | namespace 'rikka.shizuku.shell'
7 | defaultConfig {
8 | versionCode rootProject.ext.versionCode
9 | versionName rootProject.ext.versionName
10 | }
11 | buildTypes {
12 | debug {
13 | multiDexEnabled false
14 | }
15 | release {
16 | minifyEnabled true
17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | dependenciesInfo {
21 | includeInApk false
22 | }
23 | lint {
24 | checkReleaseBuilds false
25 | }
26 | buildFeatures {
27 | buildConfig = true
28 | }
29 | }
30 |
31 | android.applicationVariants.all { variant ->
32 | variant.outputs.all {
33 | outputFileName = "shizuku-v${versionName}.apk"
34 |
35 | def outDir = new File(rootDir, "out")
36 | def mappingPath = new File(outDir, "mapping").absolutePath
37 | def dexPath = "${rootProject.rootDir.path}/manager/src/main/assets"
38 | variant.assembleProvider.get().doLast {
39 | if (variant.getBuildType().isMinifyEnabled()) {
40 | copy {
41 | from variant.mappingFileProvider.get()
42 | into mappingPath
43 | rename { String fileName ->
44 | mappingPath + File.separator + "cmd-v${variant.versionName}.txt"
45 | }
46 | }
47 | }
48 | copy {
49 | def file = zipTree(file(outputFile)).matching { include 'classes*.dex' }.singleFile
50 |
51 | from file
52 | into dexPath
53 | rename { String fileName ->
54 | fileName.replace(file.getName(), "rish_shizuku.dex")
55 | }
56 | }
57 | }
58 | }
59 | }
60 |
61 | dependencies {
62 | compileOnly libs.hidden.stub
63 | }
64 |
--------------------------------------------------------------------------------
/shell/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -keep class rikka.shizuku.shell.ShizukuShellLoader {
2 | public static void main(java.lang.String[]);
3 | }
4 |
--------------------------------------------------------------------------------
/shell/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/signing.gradle:
--------------------------------------------------------------------------------
1 | def ksFile = rootProject.file('signing.properties')
2 | def props = new Properties()
3 | if (ksFile.canRead()) {
4 | props.load(new FileInputStream(ksFile))
5 |
6 | if (props != null) {
7 | android.signingConfigs.sign.storeFile file(props['KEYSTORE_FILE'])
8 | android.signingConfigs.sign.storePassword props['KEYSTORE_PASSWORD']
9 | android.signingConfigs.sign.keyAlias props['KEYSTORE_ALIAS']
10 | android.signingConfigs.sign.keyPassword props['KEYSTORE_ALIAS_PASSWORD']
11 | }
12 | } else {
13 | android.signingConfigs.sign.storeFile = android.signingConfigs.debug.storeFile
14 | android.signingConfigs.sign.storePassword = android.signingConfigs.debug.storePassword
15 | android.signingConfigs.sign.keyAlias = android.signingConfigs.debug.keyAlias
16 | android.signingConfigs.sign.keyPassword = android.signingConfigs.debug.keyPassword
17 | }
18 |
--------------------------------------------------------------------------------
/starter/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/starter/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.library'
3 | }
4 |
5 | android {
6 | namespace 'rikka.shizuku.starter'
7 | buildFeatures {
8 | buildConfig = false
9 | }
10 | }
11 |
12 | dependencies {
13 | implementation project(':common')
14 | implementation project(':shared')
15 | implementation project(':server-shared')
16 | compileOnly project(':provider')
17 | implementation 'androidx.annotation:annotation:1.3.0'
18 | implementation libs.hidden.compat
19 | compileOnly libs.hidden.stub
20 | implementation libs.refine.runtime
21 | }
22 |
--------------------------------------------------------------------------------
/starter/proguard-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lZiMUl/Shizuku/3a9980aa89c76e0f98ddd04f49547639891ce438/starter/proguard-rules.pro
--------------------------------------------------------------------------------
/starter/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/starter/src/main/java/moe/shizuku/starter/util/IContentProviderCompat.java:
--------------------------------------------------------------------------------
1 | package moe.shizuku.starter.util;
2 |
3 | import android.content.AttributionSource;
4 | import android.content.IContentProvider;
5 | import android.os.Build;
6 | import android.os.Bundle;
7 | import android.os.RemoteException;
8 | import android.system.Os;
9 |
10 | import androidx.annotation.NonNull;
11 | import androidx.annotation.Nullable;
12 |
13 | public class IContentProviderCompat {
14 |
15 | @Nullable
16 | public static Bundle call(@NonNull IContentProvider provider, @Nullable String attributeTag, @Nullable String callingPkg, @Nullable String authority, @Nullable String method, @Nullable String arg, @Nullable Bundle extras) throws RemoteException {
17 | Bundle reply;
18 | if (Build.VERSION.SDK_INT >= 31) {
19 | try {
20 | reply = provider.call((new AttributionSource.Builder(Os.getuid())).setAttributionTag(attributeTag).setPackageName(callingPkg).build(), authority, method, arg, extras);
21 | } catch (LinkageError e) {
22 | reply = provider.call(callingPkg, attributeTag, authority, method, arg, extras);
23 | }
24 | } else if (Build.VERSION.SDK_INT >= 30) {
25 | reply = provider.call(callingPkg, attributeTag, authority, method, arg, extras);
26 | } else if (Build.VERSION.SDK_INT >= 29) {
27 | reply = provider.call(callingPkg, authority, method, arg, extras);
28 | } else {
29 | reply = provider.call(callingPkg, method, arg, extras);
30 | }
31 |
32 | return reply;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------