├── .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 | 3 | 4 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /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 | 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 | 27 | 28 | 12 | 13 |