├── app ├── shared │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ └── main │ │ └── java │ │ └── com │ │ └── topjohnwu │ │ └── magisk │ │ ├── ProviderInstaller.java │ │ └── utils │ │ └── CompoundEnumeration.java ├── src │ └── main │ │ ├── res │ │ ├── font │ │ │ └── googlesans.ttf │ │ ├── values │ │ │ ├── ids.xml │ │ │ ├── theme_overlay.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── resources.xml │ │ │ ├── attrs.xml │ │ │ └── styles_md2.xml │ │ ├── values-night │ │ │ ├── styles_md2.xml │ │ │ ├── colors.xml │ │ │ └── themes.xml │ │ ├── drawable │ │ │ ├── shape_divider.xml │ │ │ ├── ic_logo.xml │ │ │ ├── ic_splash_activity.xml │ │ │ ├── ic_superuser_filled_md2.xml │ │ │ ├── bg_line_top_rounded.xml │ │ │ ├── bg_line_bottom_rounded.xml │ │ │ ├── ic_divider.xml │ │ │ ├── ic_add.xml │ │ │ ├── ic_paint.xml │ │ │ ├── sc_extension.xml │ │ │ ├── sc_superuser.xml │ │ │ ├── ic_update.xml │ │ │ ├── ic_superuser_outlined_md2.xml │ │ │ ├── ic_favorite.xml │ │ │ ├── ic_home_filled_md2.xml │ │ │ ├── ic_patreon.xml │ │ │ ├── ic_update_md2.xml │ │ │ ├── ic_device.xml │ │ │ ├── ic_folder_list.xml │ │ │ ├── ic_notifications_filled_md2.xml │ │ │ ├── ic_check_md2.xml │ │ │ ├── ic_more.xml │ │ │ ├── ic_download_md2.xml │ │ │ ├── ic_superuser.xml │ │ │ ├── ic_home_outlined_md2.xml │ │ │ ├── ic_install.xml │ │ │ ├── ic_loop.xml │ │ │ ├── ic_save_md2.xml │ │ │ ├── ic_check_circle_unchecked_md2.xml │ │ │ ├── ic_check_circle_checked_md2.xml │ │ │ ├── ic_download.xml │ │ │ ├── ic_close_md2.xml │ │ │ ├── ic_back_md2.xml │ │ │ ├── ic_notifications_md2.xml │ │ │ ├── ic_dns.xml │ │ │ ├── ic_translate.xml │ │ │ ├── ic_delete_md2.xml │ │ │ ├── ic_order_name.xml │ │ │ ├── ic_extension.xml │ │ │ ├── ic_search_md2.xml │ │ │ ├── ic_module_filled_md2.xml │ │ │ ├── ic_restart.xml │ │ │ ├── ic_day.xml │ │ │ ├── ic_multiuser.xml │ │ │ ├── ic_forth_md2.xml │ │ │ ├── ic_magisk_delete.xml │ │ │ ├── ic_bug_md2.xml │ │ │ ├── ic_home_md2.xml │ │ │ ├── ic_module_md2.xml │ │ │ ├── ic_bug_filled_md2.xml │ │ │ ├── ic_settings_md2.xml │ │ │ ├── ic_superuser_md2.xml │ │ │ ├── ic_bug_outlined_md2.xml │ │ │ ├── ic_module_outlined_md2.xml │ │ │ ├── ic_restore.xml │ │ │ ├── ic_shortcut.xml │ │ │ ├── ic_check_circle_md2.xml │ │ │ ├── ic_hide.xml │ │ │ ├── ic_night.xml │ │ │ ├── ic_refresh_data_md2.xml │ │ │ ├── ic_day_night.xml │ │ │ ├── ic_twitter.xml │ │ │ ├── ic_github.xml │ │ │ ├── ic_settings_filled_md2.xml │ │ │ └── ic_manager.xml │ │ ├── color │ │ │ ├── color_error_transient.xml │ │ │ ├── color_primary_transient.xml │ │ │ ├── color_text_transient.xml │ │ │ ├── color_on_primary_transient.xml │ │ │ ├── color_card_background_color_selector.xml │ │ │ ├── color_primary_error_transient.xml │ │ │ ├── color_menu_tint.xml │ │ │ └── color_state_primary_transient.xml │ │ ├── drawable-v26 │ │ │ ├── ic_launcher.xml │ │ │ ├── sc_extension.xml │ │ │ └── sc_superuser.xml │ │ ├── menu │ │ │ ├── menu_flash.xml │ │ │ ├── menu_theme.xml │ │ │ ├── menu_log_md2.xml │ │ │ ├── menu_home_md2.xml │ │ │ ├── menu_deny_md2.xml │ │ │ ├── menu_reboot.xml │ │ │ └── menu_bottom_nav.xml │ │ ├── values-v28 │ │ │ └── styles_md2_impl.xml │ │ ├── values-v27 │ │ │ └── themes.xml │ │ ├── anim │ │ │ ├── fragment_enter.xml │ │ │ ├── fragment_exit.xml │ │ │ ├── fragment_enter_pop.xml │ │ │ └── fragment_exit_pop.xml │ │ ├── layout │ │ │ ├── item_spinner.xml │ │ │ ├── item_console_md2.xml │ │ │ ├── item_log_textview.xml │ │ │ ├── item_text.xml │ │ │ ├── markdown_window_md2.xml │ │ │ ├── item_module_download.xml │ │ │ ├── item_list_single_line.xml │ │ │ ├── fragment_theme_md2.xml │ │ │ └── item_icon_link.xml │ │ └── values-v31 │ │ │ └── themes.xml │ │ ├── aidl │ │ └── com │ │ │ └── topjohnwu │ │ │ └── magisk │ │ │ └── core │ │ │ └── utils │ │ │ └── IRootUtils.aidl │ │ └── java │ │ ├── com │ │ └── topjohnwu │ │ │ └── magisk │ │ │ ├── view │ │ │ ├── TextItem.kt │ │ │ └── TappableHeadlineItem.kt │ │ │ ├── core │ │ │ ├── base │ │ │ │ ├── BaseJobService.kt │ │ │ │ ├── BaseReceiver.kt │ │ │ │ ├── BaseService.kt │ │ │ │ └── BaseProvider.kt │ │ │ ├── model │ │ │ │ ├── module │ │ │ │ │ ├── Module.kt │ │ │ │ │ └── OnlineModule.kt │ │ │ │ ├── su │ │ │ │ │ └── SuPolicy.kt │ │ │ │ └── UpdateInfo.kt │ │ │ ├── data │ │ │ │ ├── magiskdb │ │ │ │ │ ├── StringDao.kt │ │ │ │ │ └── SettingsDao.kt │ │ │ │ ├── NetworkServices.kt │ │ │ │ └── SuLogDao.kt │ │ │ ├── Provider.kt │ │ │ └── utils │ │ │ │ ├── DispatcherExecutor.kt │ │ │ │ ├── ProgressInputStream.kt │ │ │ │ └── RequestInstall.kt │ │ │ ├── events │ │ │ └── dialog │ │ │ │ ├── DialogEvent.kt │ │ │ │ ├── SecondSlotWarningDialog.kt │ │ │ │ ├── BiometricEvent.kt │ │ │ │ ├── SuperuserRevokeDialog.kt │ │ │ │ ├── UninstallDialog.kt │ │ │ │ └── MarkDownDialog.kt │ │ │ ├── ui │ │ │ ├── install │ │ │ │ └── InstallFragment.kt │ │ │ ├── theme │ │ │ │ └── ThemeViewModel.kt │ │ │ ├── log │ │ │ │ ├── SuLogRvItem.kt │ │ │ │ └── LogRvItem.kt │ │ │ ├── superuser │ │ │ │ └── SuperuserFragment.kt │ │ │ ├── flash │ │ │ │ └── ConsoleItem.kt │ │ │ └── settings │ │ │ │ └── SettingsFragment.kt │ │ │ ├── arch │ │ │ ├── AsyncLoadViewModel.kt │ │ │ ├── ViewEvent.kt │ │ │ └── NavigationActivity.kt │ │ │ ├── signing │ │ │ └── ByteArrayStream.java │ │ │ ├── ktx │ │ │ └── XSU.kt │ │ │ └── databinding │ │ │ └── FilterableDiffObservableList.kt │ │ └── androidx │ │ └── lifecycle │ │ └── ProcessLifecycleAccessor.java └── .gitignore ├── docs ├── releases │ ├── 19200.md │ ├── 19300.md │ ├── 20300.md │ ├── 24300.md │ ├── 21100.md │ ├── 25200.md │ ├── 19100.md │ ├── index.md │ ├── 21200.md │ ├── 21400.md │ ├── 24200.md │ ├── 23000.md │ └── 22100.md ├── images │ ├── logo.png │ ├── ota_done.png │ ├── device_info.png │ ├── restore_img.png │ ├── manager_reboot.png │ ├── disable_auto_ota.png │ └── install_inactive_slot.png └── README.md ├── native ├── src │ ├── boot │ │ ├── lib.rs │ │ ├── Cargo.toml │ │ ├── compress.hpp │ │ ├── magiskboot.hpp │ │ └── hexpatch.cpp │ ├── .gitignore │ ├── sepolicy │ │ ├── lib.rs │ │ └── Cargo.toml │ ├── exported_sym.txt │ ├── AndroidManifest.xml │ ├── external │ │ ├── systemproperties │ │ │ ├── include │ │ │ │ ├── async_safe │ │ │ │ │ └── log.h │ │ │ │ └── private │ │ │ │ │ └── ErrnoRestorer.h │ │ │ └── Android.mk │ │ └── pcre2_workaround.c │ ├── .cargo │ │ └── config.toml │ ├── init │ │ ├── lib.rs │ │ ├── Cargo.toml │ │ ├── preload.c │ │ └── logging.rs │ ├── base │ │ ├── include │ │ │ ├── base.hpp │ │ │ └── embed.hpp │ │ ├── Cargo.toml │ │ ├── logging.hpp │ │ ├── new.cpp │ │ ├── missing.hpp │ │ ├── lib.rs │ │ └── Android.mk │ ├── core │ │ ├── Cargo.toml │ │ ├── lib.rs │ │ ├── applet_stub.cpp │ │ └── core.hpp │ ├── lto_fix.lds │ ├── Cargo.toml │ ├── include │ │ ├── resetprop.hpp │ │ └── socket.hpp │ ├── Application.mk │ ├── zygisk │ │ ├── loader.c │ │ ├── deny │ │ │ ├── deny.hpp │ │ │ └── revert.cpp │ │ ├── memory.cpp │ │ ├── ptrace.hpp │ │ └── memory.hpp │ ├── resetprop │ │ └── prop.hpp │ └── Android-rs.mk ├── .gitignore └── build.gradle.kts ├── stub ├── src │ └── main │ │ ├── res │ │ ├── values-cs │ │ │ └── strings.xml │ │ ├── values-el │ │ │ └── strings.xml │ │ ├── values-sr │ │ │ └── strings.xml │ │ ├── values-sv │ │ │ └── strings.xml │ │ ├── values-vi │ │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ │ └── strings.xml │ │ ├── values-pt-rPT │ │ │ └── strings.xml │ │ ├── values-th │ │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ │ └── strings.xml │ │ ├── values-az │ │ │ └── strings.xml │ │ ├── values-ja │ │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ │ └── strings.xml │ │ ├── values-ar │ │ │ └── strings.xml │ │ ├── values-lt │ │ │ └── strings.xml │ │ ├── values-de │ │ │ └── strings.xml │ │ ├── values-ko │ │ │ └── strings.xml │ │ ├── values-mk │ │ │ └── strings.xml │ │ ├── values-it │ │ │ └── strings.xml │ │ ├── values-iw │ │ │ └── strings.xml │ │ ├── values-bg │ │ │ └── strings.xml │ │ ├── values-uk │ │ │ └── strings.xml │ │ ├── values-ru │ │ │ └── strings.xml │ │ ├── values-nb │ │ │ └── strings.xml │ │ ├── values-ka │ │ │ └── strings.xml │ │ ├── values-nl │ │ │ └── strings.xml │ │ ├── values │ │ │ └── strings.xml │ │ ├── values-ta │ │ │ └── strings.xml │ │ ├── values-ro │ │ │ └── strings.xml │ │ ├── values-hu │ │ │ └── strings.xml │ │ ├── values-sk │ │ │ └── strings.xml │ │ ├── values-pa │ │ │ └── strings.xml │ │ ├── values-ast │ │ │ └── strings.xml │ │ ├── values-be │ │ │ └── strings.xml │ │ ├── values-et │ │ │ └── strings.xml │ │ ├── values-hr │ │ │ └── strings.xml │ │ ├── values-sw │ │ │ └── strings.xml │ │ ├── values-hi │ │ │ └── strings.xml │ │ ├── values-pl │ │ │ └── strings.xml │ │ ├── values-es │ │ │ └── strings.xml │ │ ├── values-in │ │ │ └── strings.xml │ │ ├── values-tr │ │ │ └── strings.xml │ │ ├── values-fa │ │ │ └── strings.xml │ │ ├── values-ml │ │ │ └── strings.xml │ │ ├── values-sq │ │ │ └── strings.xml │ │ ├── values-ca │ │ │ └── strings.xml │ │ └── values-fr │ │ │ └── strings.xml │ │ ├── java │ │ └── com │ │ │ └── topjohnwu │ │ │ └── magisk │ │ │ ├── net │ │ │ ├── ResponseListener.java │ │ │ └── ErrorHandler.java │ │ │ ├── dummy │ │ │ ├── DummyService.java │ │ │ ├── DummyReceiver.java │ │ │ └── DummyProvider.java │ │ │ └── DelegateApplication.java │ │ └── AndroidManifest.xml ├── .gitignore ├── build.gradle.kts └── proguard-rules.pro ├── tools ├── bootctl ├── futility ├── elf-cleaner.exe ├── keys │ ├── verity.pk8 │ ├── kernel.keyblock │ └── kernel_data_key.vbprivk ├── ndk-bins │ ├── 21 │ │ ├── arm │ │ │ ├── libc.a │ │ │ ├── libm.a │ │ │ ├── libz.a │ │ │ ├── crtend_so.o │ │ │ ├── libstdc++.a │ │ │ ├── crtbegin_so.o │ │ │ ├── crtend_android.o │ │ │ ├── crtbegin_dynamic.o │ │ │ └── crtbegin_static.o │ │ ├── i686 │ │ │ ├── libc.a │ │ │ ├── libm.a │ │ │ ├── libz.a │ │ │ ├── crtend_so.o │ │ │ ├── libstdc++.a │ │ │ ├── crtbegin_so.o │ │ │ ├── crtbegin_static.o │ │ │ ├── crtend_android.o │ │ │ └── crtbegin_dynamic.o │ │ ├── aarch64 │ │ │ ├── libc.a │ │ │ ├── libm.a │ │ │ ├── libz.a │ │ │ ├── crtend_so.o │ │ │ ├── libstdc++.a │ │ │ ├── crtbegin_so.o │ │ │ ├── crtbegin_static.o │ │ │ ├── crtend_android.o │ │ │ └── crtbegin_dynamic.o │ │ └── x86_64 │ │ │ ├── libc.a │ │ │ ├── libm.a │ │ │ ├── libz.a │ │ │ ├── crtbegin_so.o │ │ │ ├── crtend_so.o │ │ │ ├── libstdc++.a │ │ │ ├── crtbegin_dynamic.o │ │ │ ├── crtbegin_static.o │ │ │ └── crtend_android.o │ └── README.md └── bootctl.patch ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .github └── ISSUE_TEMPLATE │ └── config.yml ├── .gitignore ├── settings.gradle.kts ├── .gitattributes ├── scripts ├── module_installer.sh └── update_binary.sh ├── config.prop.sample └── gradle.properties /app/shared/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /docs/releases/19200.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | -------------------------------------------------------------------------------- /docs/releases/19300.md: -------------------------------------------------------------------------------- 1 | # TODO 2 | -------------------------------------------------------------------------------- /native/src/boot/lib.rs: -------------------------------------------------------------------------------- 1 | pub use base; 2 | -------------------------------------------------------------------------------- /native/src/.gitignore: -------------------------------------------------------------------------------- 1 | test.cpp 2 | target/ 3 | -------------------------------------------------------------------------------- /native/src/sepolicy/lib.rs: -------------------------------------------------------------------------------- 1 | pub use base; 2 | -------------------------------------------------------------------------------- /stub/src/main/res/values-cs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /stub/src/main/res/values-el/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /stub/src/main/res/values-sr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /stub/src/main/res/values-sv/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /stub/src/main/res/values-vi/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /native/src/exported_sym.txt: -------------------------------------------------------------------------------- 1 | { 2 | zygisk_inject_entry; 3 | }; 4 | -------------------------------------------------------------------------------- /stub/src/main/res/values-pt-rBR/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /stub/src/main/res/values-pt-rPT/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /native/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | obj 3 | libs 4 | /.externalNativeBuild 5 | /.cxx 6 | -------------------------------------------------------------------------------- /tools/bootctl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/bootctl -------------------------------------------------------------------------------- /tools/futility: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/futility -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/logo.png -------------------------------------------------------------------------------- /stub/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /src/release/AndroidManifest.xml 3 | /src/debug/AndroidManifest.xml 4 | -------------------------------------------------------------------------------- /tools/elf-cleaner.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/elf-cleaner.exe -------------------------------------------------------------------------------- /tools/keys/verity.pk8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/keys/verity.pk8 -------------------------------------------------------------------------------- /docs/images/ota_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/ota_done.png -------------------------------------------------------------------------------- /docs/images/device_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/device_info.png -------------------------------------------------------------------------------- /docs/images/restore_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/restore_img.png -------------------------------------------------------------------------------- /native/src/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /stub/src/main/res/values-th/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /tools/keys/kernel.keyblock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/keys/kernel.keyblock -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/libc.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/libc.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/libm.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/libm.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/libz.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/libz.a -------------------------------------------------------------------------------- /docs/images/manager_reboot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/manager_reboot.png -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/libc.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/libc.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/libm.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/libm.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/libz.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/libz.a -------------------------------------------------------------------------------- /docs/images/disable_auto_ota.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/disable_auto_ota.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/libc.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/libc.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/libm.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/libm.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/libz.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/libz.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/crtend_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/crtend_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/libstdc++.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/libstdc++.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/libc.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/libc.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/libm.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/libm.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/libz.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/libz.a -------------------------------------------------------------------------------- /tools/keys/kernel_data_key.vbprivk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/keys/kernel_data_key.vbprivk -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/crtbegin_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/crtbegin_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/crtend_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/crtend_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/libstdc++.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/libstdc++.a -------------------------------------------------------------------------------- /app/src/main/res/font/googlesans.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/app/src/main/res/font/googlesans.ttf -------------------------------------------------------------------------------- /docs/images/install_inactive_slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/docs/images/install_inactive_slot.png -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/crtend_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/crtend_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/libstdc++.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/libstdc++.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/crtend_android.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/crtend_android.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/crtbegin_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/crtbegin_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/crtbegin_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/crtbegin_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/crtend_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/crtend_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/libstdc++.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/libstdc++.a -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/crtbegin_so.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/crtbegin_so.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/crtbegin_dynamic.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/crtbegin_dynamic.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/arm/crtbegin_static.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/arm/crtbegin_static.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/crtbegin_static.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/crtbegin_static.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/crtend_android.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/crtend_android.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/crtbegin_static.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/crtbegin_static.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/crtend_android.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/crtend_android.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/i686/crtbegin_dynamic.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/i686/crtbegin_dynamic.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/crtbegin_dynamic.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/crtbegin_dynamic.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/crtbegin_static.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/crtbegin_static.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/x86_64/crtend_android.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/x86_64/crtend_android.o -------------------------------------------------------------------------------- /tools/ndk-bins/21/aarch64/crtbegin_dynamic.o: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranshoe/Magisk-Monet/HEAD/tools/ndk-bins/21/aarch64/crtbegin_dynamic.o -------------------------------------------------------------------------------- /app/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/shared/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | } 4 | 5 | setupCommon() 6 | 7 | android { 8 | namespace = "com.topjohnwu.shared" 9 | } 10 | -------------------------------------------------------------------------------- /native/src/external/systemproperties/include/async_safe/log.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define async_safe_format_buffer snprintf 4 | #define async_safe_format_log(...) /* NOP */ 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/styles_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | *.zip 3 | *.jks 4 | *.apk 5 | /config.prop 6 | /update.sh 7 | /dict.txt 8 | 9 | # Built binaries 10 | native/out 11 | 12 | # Android Studio / Gradle 13 | *.iml 14 | .gradle 15 | /local.properties 16 | /.idea 17 | /build 18 | /captures 19 | -------------------------------------------------------------------------------- /stub/src/main/res/values-zh-rTW/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 需要升級到完整版 Magisk Manager。是否下載並安裝? 3 | 請連上網路!升級到完整版 Magisk Manager 是必須的。 4 | 正在下載 5 | 6 | -------------------------------------------------------------------------------- /native/src/core/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "magisk" 3 | version = "0.0.0" 4 | edition = "2021" 5 | 6 | [lib] 7 | crate-type = ["staticlib"] 8 | path = "lib.rs" 9 | 10 | [dependencies] 11 | base = { path = "../base" } 12 | cxx = { path = "../external/cxx-rs" } 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shape_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-bin.zip 4 | networkTimeout=10000 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /native/src/external/pcre2_workaround.c: -------------------------------------------------------------------------------- 1 | // Workaround pcre2_chartables.c symlink to pcre2_chartables.c.dist failing on Windows NDK if Cygwin git used, 2 | // and NDK not directly accepting a .c.dist file in LOCAL_SRC_FILES list. 3 | 4 | #include "pcre/src/pcre2_chartables.c.dist" 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_error_transient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_primary_transient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_text_transient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_on_primary_transient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /docs/releases/20300.md: -------------------------------------------------------------------------------- 1 | # 2020.1.10 Magisk v20.3 2 | 3 | ### Magisk 4 | - Fix `magiskboot` crashing when dealing with `lz4_legacy` format 5 | 6 | ### Magisk Manager 7 | - Fix MagiskHide app component toggles 8 | 9 | ### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html) 10 | -------------------------------------------------------------------------------- /app/shared/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /stub/src/main/res/values-az/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Qurmanı sonlandırmaq üçün full Magisk Manager`ə yüksəldin. Yüklənib qurulsun? 3 | Lütfən internetə qoşulun! Full Magisk Manager\'ə yüksəltmə lazımidir. 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Magisk Manager のフルバージョンにアップグレードしてセットアップを完了します。ダウンロードしてインストールしますか? 3 | ダウンロード中 4 | インターネットに接続してください!フルバージョンの Magisk Manager が必要です。 5 | 6 | -------------------------------------------------------------------------------- /native/src/base/include/embed.hpp: -------------------------------------------------------------------------------- 1 | #if defined(__arm__) 2 | #include 3 | #elif defined(__aarch64__) 4 | #include 5 | #elif defined(__i386__) 6 | #include 7 | #elif defined(__x86_64__) 8 | #include 9 | #else 10 | #error Unsupported ABI 11 | #endif 12 | -------------------------------------------------------------------------------- /native/src/core/lib.rs: -------------------------------------------------------------------------------- 1 | pub use base; 2 | use logging::*; 3 | 4 | mod logging; 5 | 6 | #[cxx::bridge] 7 | pub mod ffi { 8 | extern "Rust" { 9 | fn rust_test_entry(); 10 | fn android_logging(); 11 | fn magisk_logging(); 12 | fn zygisk_logging(); 13 | } 14 | } 15 | 16 | fn rust_test_entry() {} 17 | -------------------------------------------------------------------------------- /stub/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 需要下载完整版 Magisk 才能正常运行。开始下载? 4 | 下载需要网络,请检查网络连接。 5 | 正在下载 6 | 请重新打开本应用 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_card_background_color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/aidl/com/topjohnwu/magisk/core/utils/IRootUtils.aidl: -------------------------------------------------------------------------------- 1 | // IRootUtils.aidl 2 | package com.topjohnwu.magisk.core.utils; 3 | 4 | // Declare any non-default types here with import statements 5 | 6 | interface IRootUtils { 7 | android.app.ActivityManager.RunningAppProcessInfo getAppProcess(int pid); 8 | IBinder getFileSystem(); 9 | } 10 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ar/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | عليك الترقية ماجـيسك Manager لإكمال تهيئة التطبيق.هل اكمل؟ 4 | يرجى الاتصال بالانترنيت! ترقية ماجـيسك مطلوب... 5 | جارٍ التنزيل 6 | 7 | -------------------------------------------------------------------------------- /stub/src/main/res/values-lt/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Atsinaujinkite į pilną Magisk Manager versiją, kad baigtumėte pasiruošimą. Atsisiųsti ir instaliuoti? 3 | Prašome prisijungti prie interneto! Atsinaujinimas į pilną Magisk Manager versiją yra privalomas. 4 | 5 | -------------------------------------------------------------------------------- /stub/src/main/java/com/topjohnwu/magisk/dummy/DummyService.java: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.dummy; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.os.IBinder; 6 | 7 | public class DummyService extends Service { 8 | @Override 9 | public IBinder onBind(Intent intent) { 10 | return null; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /stub/src/main/res/values-de/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Upgrade zum vollständigen Magisk Manager, um das Setup abzuschließen. Herunterladen und installieren? 3 | Bitte eine Verbindung mit dem Internet herstellen! Upgrade zum vollständigen Magisk Manager ist erforderlich. 4 | 5 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ko/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 완전한 Magisk Manager로 업데이트하여 설치를 마치십시오. 다운로드하고 설치하시겠습니까? 3 | 인터넷에 연결해 주시기 바랍니다! 완전한 Magisk Manager로 업데이트 해야 합니다. 4 | 다운로드중 5 | 앱을 수동으로 재시작 하세요 6 | 7 | -------------------------------------------------------------------------------- /stub/src/main/res/values-mk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Надградете до целосната верзија на Magisk Manager за да го завршите поставувањето. Преземете и инсталирајте? 3 | Ве молиме поврзете се на интернет бидејќи е потребна надградба на целосната верзија на Magisk Manager. 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_primary_error_transient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_logo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | @Suppress("UnstableApiUsage") 2 | dependencyResolutionManagement { 3 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 4 | repositories { 5 | google() 6 | mavenCentral() 7 | maven("https://jitpack.io") 8 | } 9 | } 10 | rootProject.name = "Magisk" 11 | include(":app", ":app:shared", ":native", ":stub") 12 | -------------------------------------------------------------------------------- /stub/src/main/res/values-it/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Aggiorna alla versione completa di Magisk Manager per completare l\'installazione. Vuoi procedere al download e all\'installazione? 3 | Controlla la connessione a Internet! È necessaria per l\'aggiornamento di Magisk Manager. 4 | 5 | -------------------------------------------------------------------------------- /stub/src/main/res/values-iw/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | יש לעדכן לגירסה מלאה של מנהל Magisk בכדי לסיים את העדכון. להוריד ולהתקין? 4 | נא להתחבר לאינטרנט! עדכון לגירסה מלאה של מנהל Magisk נדרש. 5 | מוריד 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_menu_tint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /stub/src/main/java/com/topjohnwu/magisk/dummy/DummyReceiver.java: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.dummy; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | 7 | public class DummyReceiver extends BroadcastReceiver { 8 | @Override 9 | public void onReceive(Context context, Intent intent) {} 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/sc_extension.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/sc_superuser.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /native/src/core/applet_stub.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | int main(int argc, char *argv[]) { 8 | if (argc < 1) 9 | return 1; 10 | enable_selinux(); 11 | cmdline_logging(); 12 | init_argv0(argc, argv); 13 | umask(0); 14 | return APPLET_STUB_MAIN(argc, argv); 15 | } 16 | -------------------------------------------------------------------------------- /native/src/lto_fix.lds: -------------------------------------------------------------------------------- 1 | SECTIONS { 2 | .init_array : { 3 | *(SORT_BY_INIT_PRIORITY(.init_array.*)) 4 | *(EXCLUDE_FILE(*crtend_android.o) .init_array) 5 | } 6 | } INSERT AFTER .fini_array; 7 | SECTIONS { 8 | .fini_array : { 9 | *(SORT_BY_INIT_PRIORITY(.fini_array.*)) 10 | *(EXCLUDE_FILE(*crtend_android.o) .fini_array) 11 | } 12 | } INSERT BEFORE .init_array; 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/view/TextItem.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.view 2 | 3 | import com.topjohnwu.magisk.R 4 | import com.topjohnwu.magisk.databinding.DiffRvItem 5 | 6 | class TextItem(val text: Int) : DiffRvItem() { 7 | override val layoutRes = R.layout.item_text 8 | 9 | override fun contentSameAs(other: TextItem) = text == other.text 10 | } 11 | -------------------------------------------------------------------------------- /stub/src/main/res/values-bg/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Надградете до пълната версия на Magisk Manager, за да довършите първоначалната настройка. Изтегляне и инсталиране сега? 3 | Моля да се свържете към работеща интернет мрежа, защото надграждането до пълната версия на Magisk Manager е задължително. 4 | 5 | -------------------------------------------------------------------------------- /stub/src/main/res/values-uk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Оновіть додаток Magisk для завершення встановлення. Завантажити і встановити? 4 | Будь ласка, підключіться до Інтернету! Потрібно оновити додаток Magisk. 5 | Завантаження 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_flash.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | -------------------------------------------------------------------------------- /native/src/boot/compress.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include "format.hpp" 6 | 7 | filter_strm_ptr get_encoder(format_t type, stream_ptr &&base); 8 | 9 | filter_strm_ptr get_decoder(format_t type, stream_ptr &&base); 10 | 11 | void compress(const char *method, const char *infile, const char *outfile); 12 | 13 | void decompress(char *infile, const char *outfile); 14 | -------------------------------------------------------------------------------- /app/src/main/java/androidx/lifecycle/ProcessLifecycleAccessor.java: -------------------------------------------------------------------------------- 1 | package androidx.lifecycle; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | public class ProcessLifecycleAccessor { 8 | public static void init(@NonNull Context context) { 9 | LifecycleDispatcher.init(context); 10 | ProcessLifecycleOwner.init(context); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ru/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Обновите Magisk для завершения установки. Продолжить? 3 | Пожалуйста, подключитесь к Интернету! Требуется обновление Magisk. 4 | Загрузка 5 | Пожалуйста, перезапустите приложение 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/core/base/BaseJobService.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.core.base 2 | 3 | import android.app.job.JobService 4 | import android.content.Context 5 | import com.topjohnwu.magisk.core.patch 6 | 7 | abstract class BaseJobService : JobService() { 8 | override fun attachBaseContext(base: Context) { 9 | super.attachBaseContext(base.patch()) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /docs/releases/24300.md: -------------------------------------------------------------------------------- 1 | ## 2022.3.10 Magisk v24.3 2 | 3 | For those coming from v24.1, check the full changelog for changes introduced in v24.2. 4 | 5 | - [General] Stop using `getrandom` syscall 6 | - [Zygisk] Update API to v3, adding new fields to `AppSpecializeArgs` 7 | - [App] Improve app repackaging installation workflow 8 | 9 | ### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html) 10 | -------------------------------------------------------------------------------- /stub/src/main/res/values-nb/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Oppgrader til den komplette versjonen av Magisk Manager for å fullføre oppsettet. Vil du laste ned og installere? 4 | Vennligst koble deg på internettet! Å oppgradere til den komplette versjonen av Magisk Manager er påkrevd. 5 | 6 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Magisk Documentation 2 | 3 | - [Installation Instructions](install.md) 4 | - [Frequently Asked Questions](faq.md) 5 | - [Release Notes](releases/index.md) 6 | - [Magisk Changelog](changes.md) 7 | 8 | The following sections are for developers 9 | 10 | - [Developer Guides](guides.md) 11 | - [Magisk Tools](tools.md) 12 | - [Internal Details](details.md) 13 | - [Android Booting Shenanigans](boot.md) 14 | -------------------------------------------------------------------------------- /docs/releases/21100.md: -------------------------------------------------------------------------------- 1 | ## 2020.11.13 Magisk v21.1 2 | 3 | v21.1 is a maintenance update from v21.0, mostly addressing bugs, refining some details, and adding new boot image format support (for Pixel 5 and 4a 5G). Checkout the full [v21.0 release notes](https://topjohnwu.github.io/Magisk/releases/21000.html) if coming from older releases. 4 | 5 | ### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html) 6 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_theme.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_splash_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_superuser_filled_md2.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /native/src/Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | exclude = ["external"] 3 | members = ["base", "boot", "core", "init", "sepolicy"] 4 | 5 | [profile.dev] 6 | opt-level = "z" 7 | lto = true 8 | codegen-units = 1 9 | panic = "abort" 10 | strip = true 11 | 12 | [profile.release] 13 | opt-level = "z" 14 | lto = true 15 | codegen-units = 1 16 | panic = "abort" 17 | strip = true 18 | 19 | [patch.crates-io] 20 | cxx = { path = "external/cxx-rs" } 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_line_top_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ka/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | განაახლეთ სრულ Magisk მენჯერის ვერსიამდე ინსტალაციის დასასრულებლად. გსურთ გადმოწერა და ინსტალირება? 4 | გთხოვთ დაუკავშირდით ინტერნეტს! საჭიროა Magisk მენეჯერის სრულ ვერსიამდე განახლება. 5 | მიმდინარეობს გადმოწერა 6 | 7 | -------------------------------------------------------------------------------- /stub/src/main/res/values-nl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Installeer de volledige Magisk Manager om de installatie af te ronden. Wil je dit nu doen? 4 | Maak verbinding met het internet! Het installeren van de volledige Magisk Manager is vereist. 5 | Bezig met downloaden... 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_line_bottom_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/color/color_state_primary_transient.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /stub/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Upgrade to full Magisk to finish the setup. Download and install? 4 | Please connect to the Internet! Upgrading to full Magisk is required. 5 | Downloading 6 | Please manually re-launch the app 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ta/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | அமைப்பை முடிக்க முழு மேகிஸ்க்கு மேம்படுத்தவும். பதிவிறக்கி நிறுவவா? 4 | இணையத்துடன் இணைக்கவும்! முழு மேகிஸ்க்கு மேம்படுத்தல் தேவை. 5 | பதிவிறக்குகிறது 6 | பயன்பாட்டை கைமுறையாக மீண்டும் தொடங்கவும் 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ro/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Treci la versiunea completă Magisk pentru a finaliza configurarea. Descarci și instalezi? 3 | Te rugăm să te conectezi la internet! Este necesară actualizarea la versiunea completă Magisk. 4 | Se descarcă 5 | Te rugăm să relansezi manual aplicația 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_divider.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /stub/src/main/res/values-hu/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | A telepítés befejezéséhez frissíts a teljes Magiskre. Letöltés és telepítés? 4 | Csatlakozz az internethez! Frissíteni kell a teljes Magiskre. 5 | Letöltés 6 | Kérjük manuálisan indítsd újra az alkalmazást 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-sk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pre dokončenie inštalácie sa vyžaduje upgrade Magisk Managera. Stiahnuť a nainštalovať? 4 | Pripojte sa na internet! Upgrade Magisk Managera je potrebný. 5 | Sťahuje sa 6 | Zavrite a spustite apku manuálne 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-pa/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ਸੈਟਅਪ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ ਪੂਰੇ ਮੈਜਿਕਸ ਮੈਨੇਜਰ ਵਿਚ ਅਪਗ੍ਰੇਡ ਕਰੋ. ਡਾਉਨਲੋਡ ਅਤੇ ਇੰਸਟੌਲ ਕਰੋ? 4 | ਕਿਰਪਾ ਕਰਕੇ ਇੰਟਰਨੈਟ ਨਾਲ ਜੁੜੋ! ਪੂਰਾ ਮੈਜਿਕਸ ਮੈਨੇਜਰ ਅਪਗ੍ਰੇਡ ਕਰਨ ਦੀ ਲੋੜ ਹੈ। 5 | ਡਾਊਨਲੋਡ ਹੋ ਰਿਹਾ ਹੈ 6 | ਕਿਰਪਾ ਕਰਕੇ ਐਪ ਨੂੰ ਮੁੜ ਚਾਲੂ ਕਰੋ 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_paint.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sc_extension.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/sc_superuser.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #00AF9C 4 | #00796B 5 | #e0e0e0 6 | #e0e0e0 7 | @color/ic_launcher_background 8 | #ffdad7 9 | #410102 10 | 11 | -------------------------------------------------------------------------------- /stub/src/main/res/values-ast/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Instala la versión completa de Magisk pa finar la configuración. ¿Quies facelo agora? 4 | ¡Conéctate a internet! Tienes d\'instalar la versión completa de Magisk. 5 | Baxando 6 | Volvi llanzar l\'aplicación manualmente 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-be/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Абнавіце Magisk Manager для завяршэння ўсталёўкі. Спампаваць і ўсталяваць? 4 | Калі ласка, падлучыцеся да інтэрнэту! Патрабуецца абнаўленне Magisk Manager. 5 | Спампоўванне 6 | Калі ласка, уласнаручна перазапусціце праграму 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-et/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Täienda seadistuse lõpetamiseks Magiski täisversioonile. Kas laadid alla ja installid? 4 | Palun ühendu Internetti! Nõutud on Magiski täisversioonile täiendamine. 5 | Allalaadimine 6 | Palun käivita rakendus käsitsi uuesti 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-hr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Nadogradite na full Magisk Manager da biste dovršili postavljanje. Preuzeti i instalirati? 4 | Povežite se na Internet! Potrebna je nadogradnja na full Magisk Manager. 5 | Preuzimanje 6 | Ručno ponovno pokrenite aplikaciju 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-sw/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Pata toleo jipya la Magisk kamili ili kumaliza usanidi. Pakua na usakinishe? 4 | Tafadhali unganisha kwenye Mtandao! Kusasisha hadi Magisk kamili inahitajika. 5 | Inapakua 6 | Tafadhali zindua upya programu wewe mwenyewe 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-hi/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | सेटअप को पूरा करने के लिए पूर्ण मैजिस्क मैनेजर में अपग्रेड करें. डाउनलोड करके इंस्टॉल करें? 4 | कृपया इन्टरनेट से जुड़िये! पूर्ण मैजिस्क मैनेजर में अपग्रेड की आवश्यकता है। 5 | डाउनलोड हो रहा है 6 | कृपया ऐप को फिर से शुरू करें 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-pl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Zaktualizuj Magisk do pełnej wersji aby ukończyć instalację. Pobrać i zainstalować? 4 | Połącz się z Internetem! Wymagane jest uaktualnienie Magisk do pełnej wersji. 5 | Pobieranie 6 | Proszę ręcznie uruchomić aplikację ponownie. 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_update.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/releases/25200.md: -------------------------------------------------------------------------------- 1 | ## 2022.7.20 Magisk v25.2 2 | 3 | Maintenance release fixing various issues. 4 | 5 | - [MagiskInit] Fix a potential issue when stub cpio is used 6 | - [MagiskInit] Fix reboot to recovery when stub cpio is used 7 | - [MagiskInit] Fix sepolicy.rules symlink for rootfs devices 8 | - [General] Better data encryption detection 9 | - [General] Move the whole logging infrastructure into Rust 10 | 11 | ### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html) 12 | -------------------------------------------------------------------------------- /stub/src/main/res/values-es/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Debe actualizar a la versión completa de Magisk Manager para finalizar la instalación. ¿Descargar e instalar? 3 | ¡Por favor conéctese a internet! Se requiere actualizar a la versión completa de Magisk Manager 4 | Descargando 5 | Vuelva a iniciar manualmente la aplicación 6 | 7 | -------------------------------------------------------------------------------- /stub/src/main/res/values-in/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Tingkatkan Magisk Manager ke versi utuh untuk menyelesaikan penyiapan. Download dan instal? 4 | Harap sambungkan ke Internet! Peningkatan Magisk Manager versi utuh diperlukan. 5 | Mendownload 6 | Buka kembali aplikasi secara manual 7 | 8 | -------------------------------------------------------------------------------- /stub/src/main/res/values-tr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Kurulumu tamamlamak için tam Magisk Manager\'a yükseltin. İndirip yüklensin mi? 4 | Lütfen internete bağlanın! Tam sürüm Magisk Manager\'a yükseltmek gerekiyor. 5 | İndiriliyor 6 | Lütfen uygulamayı manuel olarak kapatıp açın 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/core/base/BaseReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.core.base 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import androidx.annotation.CallSuper 7 | import com.topjohnwu.magisk.core.patch 8 | 9 | abstract class BaseReceiver : BroadcastReceiver() { 10 | @CallSuper 11 | override fun onReceive(context: Context, intent: Intent?) { 12 | context.patch() 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_superuser_outlined_md2.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | -------------------------------------------------------------------------------- /native/src/include/resetprop.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | int setprop(const char *name, const char *value, bool prop_svc = true); 7 | std::string getprop(const char *name, bool persist = false); 8 | void getprops(void (*callback)(const char *, const char *, void *), 9 | void *cookie = nullptr, bool persist = false); 10 | int delprop(const char *name, bool persist = false); 11 | void load_prop_file(const char *filename, bool prop_svc = true); 12 | -------------------------------------------------------------------------------- /stub/src/main/res/values-fa/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | برای به پایان رساندن تنظیمات ، به نسخه کامل Magisk Manager ارتقا دهید. دانلود و نصب بشه؟ 4 | لطفاً به اینترنت متصل شوید! برای ارتقا به نسخه کامل Magisk Manager لازم است. 5 | درحال دانلود 6 | لطفاً به صورت دستی برنامه را دوباره راه اندازی کنید 7 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/core/model/module/Module.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.core.model.module 2 | 3 | abstract class Module : Comparable { 4 | abstract var id: String 5 | protected set 6 | abstract var name: String 7 | protected set 8 | abstract var version: String 9 | protected set 10 | abstract var versionCode: Int 11 | protected set 12 | 13 | override operator fun compareTo(other: Module) = id.compareTo(other.id) 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_favorite.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_filled_md2.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_patreon.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_update_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-v28/styles_md2_impl.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/releases/index.md: -------------------------------------------------------------------------------- 1 | # Release Notes 2 | 3 | - [v25.2](25200.md) 4 | - [v25.1](25100.md) 5 | - [v25.0](25000.md) 6 | - [v24.3](24300.md) 7 | - [v24.2](24200.md) 8 | - [v24.1](24100.md) 9 | - [v24.0](24000.md) 10 | - [v23.0](23000.md) 11 | - [v22.1](22100.md) 12 | - [v22.0](22000.md) 13 | - [v21.4](21400.md) 14 | - [v21.2](21200.md) 15 | - [v21.1](21100.md) 16 | - [v21.0](21000.md) 17 | - [v20.4](20400.md) 18 | - [v20.3](20300.md) 19 | - [v20.2](20200.md) 20 | - [v20.1](20100.md) 21 | - [v20.0](20000.md) 22 | - [v19.4](19400.md) 23 | - [v19.3](19300.md) 24 | - [v19.2](19200.md) 25 | - [v19.1](19100.md) 26 | - [v19.0](19000.md) 27 | - [v18.1](18100.md) 28 | - [v18.0](18000.md) 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_console_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/core/model/su/SuPolicy.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.core.model.su 2 | 3 | class SuPolicy(val uid: Int) { 4 | companion object { 5 | const val INTERACTIVE = 0 6 | const val DENY = 1 7 | const val ALLOW = 2 8 | } 9 | 10 | var policy: Int = INTERACTIVE 11 | var until: Long = -1L 12 | var logging: Boolean = true 13 | var notification: Boolean = true 14 | 15 | fun toMap(): MutableMap = mutableMapOf( 16 | "uid" to uid, 17 | "policy" to policy, 18 | "until" to until, 19 | "logging" to logging, 20 | "notification" to notification 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_md2.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_module_filled_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_restart.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_log_textview.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /native/src/base/new.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | /* Override libc++ new implementation 5 | * to optimize final build size */ 6 | 7 | void* operator new(std::size_t s) { return malloc(s); } 8 | void* operator new[](std::size_t s) { return malloc(s); } 9 | void operator delete(void *p) { free(p); } 10 | void operator delete[](void *p) { free(p); } 11 | void* operator new(std::size_t s, const std::nothrow_t&) noexcept { return malloc(s); } 12 | void* operator new[](std::size_t s, const std::nothrow_t&) noexcept { return malloc(s); } 13 | void operator delete(void *p, const std::nothrow_t&) noexcept { free(p); } 14 | void operator delete[](void *p, const std::nothrow_t&) noexcept { free(p); } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/arch/AsyncLoadViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.arch 2 | 3 | import androidx.annotation.MainThread 4 | import androidx.lifecycle.viewModelScope 5 | import kotlinx.coroutines.Job 6 | import kotlinx.coroutines.launch 7 | 8 | abstract class AsyncLoadViewModel : BaseViewModel() { 9 | 10 | private var loadingJob: Job? = null 11 | 12 | @MainThread 13 | fun startLoading() { 14 | if (loadingJob?.isActive == true) { 15 | // Prevent multiple jobs from running at the same time 16 | return 17 | } 18 | loadingJob = viewModelScope.launch { doLoadWork() } 19 | } 20 | 21 | protected abstract suspend fun doLoadWork() 22 | } 23 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set the default behavior, in case people don't have core.autocrlf set. 2 | * text eol=lf 3 | 4 | # Explicitly declare text files you want to always be normalized and converted 5 | # to native line endings on checkout. 6 | # *.c text 7 | # *.h text 8 | 9 | # Declare files that will always have CRLF line endings on checkout. 10 | *.cmd text eol=crlf 11 | *.bat text eol=crlf 12 | 13 | # Denote all files that are truly binary and should not be modified. 14 | tools/** binary 15 | *.jar binary 16 | *.exe binary 17 | *.apk binary 18 | *.png binary 19 | *.jpg binary 20 | *.ttf binary 21 | 22 | # Help GitHub detect languages 23 | native/jni/external/** linguist-vendored 24 | native/jni/systemproperties/** linguist-language=C++ 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_day.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_multiuser.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_forth_md2.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /native/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | } 4 | 5 | setupCommon() 6 | 7 | android { 8 | namespace = "com.topjohnwu.magisk.native" 9 | 10 | externalNativeBuild { 11 | ndkBuild { 12 | path("src/Android.mk") 13 | } 14 | } 15 | 16 | sourceSets.getByName("main") { 17 | manifest.srcFile("src/AndroidManifest.xml") 18 | } 19 | 20 | defaultConfig { 21 | externalNativeBuild { 22 | ndkBuild { 23 | // Pass arguments to ndk-build. 24 | arguments( 25 | "B_MAGISK=1", "B_INIT=1", "B_BOOT=1", "B_TEST=1", "B_POLICY=1", "B_PRELOAD=1", "B_PROP=1" 26 | ) 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/ui/theme/ThemeViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.ui.theme 2 | 3 | import android.view.MenuItem 4 | import com.topjohnwu.magisk.R 5 | import com.topjohnwu.magisk.arch.BaseViewModel 6 | import com.topjohnwu.magisk.core.Config 7 | import com.topjohnwu.magisk.events.RecreateEvent 8 | import com.topjohnwu.magisk.events.dialog.DarkThemeDialog 9 | import com.topjohnwu.magisk.view.TappableHeadlineItem 10 | 11 | class ThemeViewModel : BaseViewModel(){ 12 | fun onThemeModeOptionClicked(){ 13 | DarkThemeDialog().publish() 14 | } 15 | fun saveTheme(theme: Theme) { 16 | if (!theme.isSelected) { 17 | Config.themeOrdinal = theme.ordinal 18 | RecreateEvent().publish() 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /scripts/module_installer.sh: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | ################# 4 | # Initialization 5 | ################# 6 | 7 | umask 022 8 | 9 | # echo before loading util_functions 10 | ui_print() { echo "$1"; } 11 | 12 | require_new_magisk() { 13 | ui_print "*******************************" 14 | ui_print " Please install Magisk v20.4+! " 15 | ui_print "*******************************" 16 | exit 1 17 | } 18 | 19 | ######################### 20 | # Load util_functions.sh 21 | ######################### 22 | 23 | OUTFD=$2 24 | ZIPFILE=$3 25 | 26 | mount /data 2>/dev/null 27 | 28 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk 29 | . /data/adb/magisk/util_functions.sh 30 | [ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk 31 | 32 | install_module 33 | exit 0 34 | -------------------------------------------------------------------------------- /docs/releases/21200.md: -------------------------------------------------------------------------------- 1 | ## 2020.12.28 Magisk v21.2 2 | 3 | v21.2 is a maintenance update, mostly addressing bugs, and expanding device compatibility. Checkout the full [v21.0 release notes](https://topjohnwu.github.io/Magisk/releases/21000.html) if coming from older releases. 4 | 5 | ### v21.2 6 | 7 | - [MagiskInit] Detect 2SI after mounting `system_root` on legacy SAR devices 8 | - [General] Make sure `post-fs-data` scripts cannot block more than 35 seconds 9 | - [General] Fix the `magisk --install-module` command 10 | - [General] Trim Windows newline when reading files 11 | - [General] Directly log to file to prevent `logcat` weirdness 12 | - [MagiskBoot] Fix header dump/load for header v3 images 13 | 14 | ### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html) 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/view/TappableHeadlineItem.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.view 2 | 3 | import com.topjohnwu.magisk.R 4 | import com.topjohnwu.magisk.databinding.DiffRvItem 5 | 6 | sealed class TappableHeadlineItem : DiffRvItem() { 7 | 8 | abstract val title: Int 9 | abstract val icon: Int 10 | 11 | override val layoutRes = R.layout.item_tappable_headline 12 | 13 | // --- listener 14 | 15 | interface Listener { 16 | 17 | fun onItemPressed(item: TappableHeadlineItem) 18 | 19 | } 20 | 21 | // --- objects 22 | 23 | object ThemeMode : TappableHeadlineItem() { 24 | override val title = R.string.settings_dark_mode_title 25 | override val icon = R.drawable.ic_day_night 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /native/src/zygisk/loader.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #if defined(__LP64__) 5 | // Use symlink to workaround linker bug on old broken Android 6 | // https://issuetracker.google.com/issues/36914295 7 | #define SECOND_STAGE_PATH "/system/bin/app_process" 8 | #else 9 | #define SECOND_STAGE_PATH "/system/bin/app_process32" 10 | #endif 11 | 12 | __attribute__((constructor)) 13 | static void zygisk_loader() { 14 | android_dlextinfo info = { 15 | .flags = ANDROID_DLEXT_FORCE_LOAD 16 | }; 17 | void *handle = android_dlopen_ext(SECOND_STAGE_PATH, RTLD_LAZY, &info); 18 | if (handle) { 19 | void(*entry)(void*) = dlsym(handle, "zygisk_inject_entry"); 20 | if (entry) { 21 | entry(handle); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/core/data/magiskdb/StringDao.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.core.data.magiskdb 2 | 3 | class StringDao : MagiskDB() { 4 | 5 | suspend fun delete(key: String) { 6 | val query = "DELETE FROM ${Table.STRINGS} WHERE key == \"$key\"" 7 | exec(query) 8 | } 9 | 10 | suspend fun put(key: String, value: String) { 11 | val kv = mapOf("key" to key, "value" to value) 12 | val query = "REPLACE INTO ${Table.STRINGS} ${kv.toQuery()}" 13 | exec(query) 14 | } 15 | 16 | suspend fun fetch(key: String, default: String = ""): String { 17 | val query = "SELECT value FROM ${Table.STRINGS} WHERE key == \"$key\" LIMIT 1" 18 | return exec(query) { it["value"] }.firstOrNull() ?: default 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/core/data/magiskdb/SettingsDao.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.core.data.magiskdb 2 | 3 | class SettingsDao : MagiskDB() { 4 | 5 | suspend fun delete(key: String) { 6 | val query = "DELETE FROM ${Table.SETTINGS} WHERE key == \"$key\"" 7 | exec(query) 8 | } 9 | 10 | suspend fun put(key: String, value: Int) { 11 | val kv = mapOf("key" to key, "value" to value) 12 | val query = "REPLACE INTO ${Table.SETTINGS} ${kv.toQuery()}" 13 | exec(query) 14 | } 15 | 16 | suspend fun fetch(key: String, default: Int = -1): Int { 17 | val query = "SELECT value FROM ${Table.SETTINGS} WHERE key == \"$key\" LIMIT 1" 18 | return exec(query) { it["value"]?.toInt() }.firstOrNull() ?: default 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 12 | 13 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /native/src/include/socket.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | struct sock_cred : public ucred { 10 | std::string context; 11 | }; 12 | 13 | socklen_t setup_sockaddr(sockaddr_un *sun, const char *name); 14 | bool get_client_cred(int fd, sock_cred *cred); 15 | std::vector recv_fds(int sockfd); 16 | int recv_fd(int sockfd); 17 | int send_fds(int sockfd, const int *fds, int cnt); 18 | int send_fd(int sockfd, int fd); 19 | int read_int(int fd); 20 | int read_int_be(int fd); 21 | void write_int(int fd, int val); 22 | void write_int_be(int fd, int val); 23 | std::string read_string(int fd); 24 | bool read_string(int fd, std::string &str); 25 | void write_string(int fd, std::string_view str); 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_magisk_delete.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bug_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | 17 | 18 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_home_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/markdown_window_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_module_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/values/resources.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Magisk 6 | Zygisk 7 | 8 | 9 | \@topjohnwu 10 | \@diareuse 11 | PayPal 12 | Patreon 13 | Twitter 14 | GitHub 15 | 16 | @drawable/ic_logo 17 | 18 | 19 | -------------------------------------------------------------------------------- /native/src/init/preload.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | __attribute__((constructor)) 7 | static void preload_init() { 8 | // Make sure our next exec won't get bugged 9 | unsetenv("LD_PRELOAD"); 10 | unlink("/dev/preload.so"); 11 | } 12 | 13 | int security_load_policy(void *data, size_t len) { 14 | int (*load_policy)(void *, size_t) = dlsym(RTLD_NEXT, "security_load_policy"); 15 | // Skip checking errors, because if we cannot find the symbol, there 16 | // isn't much we can do other than crashing anyways. 17 | int result = load_policy(data, len); 18 | 19 | // Wait for ack 20 | int fd = open("/sys/fs/selinux/enforce", O_RDONLY); 21 | char c; 22 | read(fd, &c, 1); 23 | close(fd); 24 | 25 | return result; 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/arch/ViewEvent.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.arch 2 | 3 | import android.content.Context 4 | import kotlinx.coroutines.CoroutineScope 5 | 6 | /** 7 | * Class for passing events from ViewModels to Activities/Fragments 8 | * (see https://medium.com/google-developers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150) 9 | */ 10 | abstract class ViewEvent 11 | 12 | abstract class ViewEventWithScope: ViewEvent() { 13 | lateinit var scope: CoroutineScope 14 | } 15 | 16 | interface ContextExecutor { 17 | operator fun invoke(context: Context) 18 | } 19 | 20 | interface ActivityExecutor { 21 | operator fun invoke(activity: UIActivity<*>) 22 | } 23 | 24 | interface FragmentExecutor { 25 | operator fun invoke(fragment: BaseFragment<*>) 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bug_filled_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /native/src/base/missing.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | static inline int sigtimedwait(const sigset_t* set, siginfo_t* info, const timespec* timeout) { 10 | union { 11 | sigset_t set; 12 | sigset64_t set64; 13 | } s{}; 14 | s.set = *set; 15 | return syscall(__NR_rt_sigtimedwait, &s.set64, info, timeout, sizeof(s.set64)); 16 | } 17 | 18 | static inline int fexecve(int fd, char* const* argv, char* const* envp) { 19 | syscall(__NR_execveat, fd, "", argv, envp, AT_EMPTY_PATH); 20 | if (errno == ENOSYS) { 21 | char buf[256]; 22 | std::snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd); 23 | execve(buf, argv, envp); 24 | } 25 | return -1; 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_settings_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /config.prop.sample: -------------------------------------------------------------------------------- 1 | ########################################################## 2 | # All variables in config.prop are optional 3 | # Removing or leaving them blank will keep default values 4 | ########################################################## 5 | 6 | # The version name of Magisk. Default: git HEAD short SHA1 7 | version=string 8 | 9 | # Output path. Default: out 10 | outdir=string 11 | 12 | ##################################################### 13 | # Signing configs for signing zips and APKs 14 | # These 4 variables has to be either all set or not 15 | ##################################################### 16 | 17 | # Path to keystore file 18 | keyStore=string 19 | # Keystore password 20 | keyStorePass=string 21 | # The desired key alias in the keystore 22 | keyAlias=string 23 | # Password of specified key alias 24 | keyPass=string 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_superuser_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 12 | 13 | 17 | 18 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_deny_md2.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 15 | 20 | 21 | -------------------------------------------------------------------------------- /app/shared/src/main/java/com/topjohnwu/magisk/ProviderInstaller.java: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk; 2 | 3 | import android.content.Context; 4 | 5 | public class ProviderInstaller { 6 | 7 | public static boolean install(Context context) { 8 | try { 9 | // Try installing new SSL provider from Google Play Service 10 | Context gms = context.createPackageContext("com.google.android.gms", 11 | Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); 12 | gms.getClassLoader() 13 | .loadClass("com.google.android.gms.common.security.ProviderInstallerImpl") 14 | .getMethod("insertProvider", Context.class) 15 | .invoke(null, gms); 16 | } catch (Exception e) { 17 | return false; 18 | } 19 | return true; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 14 | 15 | 20 | 21 | 26 | 27 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/arch/NavigationActivity.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.arch 2 | 3 | import android.view.KeyEvent 4 | import androidx.databinding.ViewDataBinding 5 | import androidx.navigation.NavController 6 | import androidx.navigation.NavDirections 7 | import androidx.navigation.fragment.NavHostFragment 8 | 9 | abstract class NavigationActivity : UIActivity() { 10 | 11 | abstract val navHostId: Int 12 | 13 | private val navHostFragment by lazy { 14 | supportFragmentManager.findFragmentById(navHostId) as NavHostFragment 15 | } 16 | 17 | protected val currentFragment get() = 18 | navHostFragment.childFragmentManager.fragments.getOrNull(0) as? BaseFragment<*> 19 | 20 | val navigation: NavController get() = navHostFragment.navController 21 | 22 | override fun dispatchKeyEvent(event: KeyEvent): Boolean { 23 | return if (binded && currentFragment?.onKeyEvent(event) == true) true else super.dispatchKeyEvent(event) 24 | } 25 | 26 | override fun onBackPressed() { 27 | if (binded) { 28 | if (currentFragment?.onBackPressed() == false) { 29 | super.onBackPressed() 30 | } 31 | } 32 | } 33 | 34 | fun NavDirections.navigate() { 35 | navigation.navigate(this) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/ui/superuser/SuperuserFragment.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.ui.superuser 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import com.topjohnwu.magisk.R 6 | import com.topjohnwu.magisk.arch.BaseFragment 7 | import com.topjohnwu.magisk.arch.viewModel 8 | import com.topjohnwu.magisk.databinding.FragmentSuperuserMd2Binding 9 | import rikka.recyclerview.addEdgeSpacing 10 | import rikka.recyclerview.addItemSpacing 11 | import rikka.recyclerview.fixEdgeEffect 12 | 13 | class SuperuserFragment : BaseFragment() { 14 | 15 | override val layoutRes = R.layout.fragment_superuser_md2 16 | override val viewModel by viewModel() 17 | 18 | override fun onStart() { 19 | super.onStart() 20 | activity?.title = resources.getString(R.string.superuser) 21 | } 22 | 23 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 24 | super.onViewCreated(view, savedInstanceState) 25 | 26 | binding.superuserList.apply { 27 | addEdgeSpacing(top = R.dimen.l_50, bottom = R.dimen.l1) 28 | addItemSpacing(R.dimen.l1, R.dimen.l_50, R.dimen.l1) 29 | fixEdgeEffect() 30 | } 31 | } 32 | 33 | override fun onPreBind(binding: FragmentSuperuserMd2Binding) {} 34 | 35 | } 36 | -------------------------------------------------------------------------------- /native/src/zygisk/memory.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #pragma clang diagnostic push 6 | #pragma clang diagnostic ignored "-Wdeprecated-builtins" 7 | #include 8 | #pragma clang diagnostic pop 9 | 10 | #include 11 | 12 | namespace jni_hook { 13 | 14 | struct memory_block { 15 | static void *allocate(size_t sz); 16 | static void deallocate(void *, size_t) { /* Monotonic increase */ } 17 | static void release(); 18 | }; 19 | 20 | template 21 | using allocator = stateless_allocator; 22 | 23 | using string = std::basic_string, allocator>; 24 | 25 | // Use node_hash_map since it will use less memory because we are using a monotonic allocator 26 | template 27 | using hash_map = phmap::node_hash_map, 29 | phmap::priv::hash_default_eq, 30 | allocator> 31 | >; 32 | 33 | template 34 | using tree_map = std::map, 36 | allocator> 37 | >; 38 | 39 | } // namespace jni_hook 40 | 41 | // Provide heterogeneous lookup for jni_hook::string 42 | namespace phmap::priv { 43 | template <> struct HashEq : StringHashEqT {}; 44 | } // namespace phmap::priv 45 | -------------------------------------------------------------------------------- /docs/releases/22100.md: -------------------------------------------------------------------------------- 1 | ## 2021.4.9 Magisk v22.1 2 | 3 | This release is focused on fixing regressions and bugs. Check the [v22.0 release notes](https://topjohnwu.github.io/Magisk/releases/22000.html) if coming from older releases. 4 | 5 | Note: Magisk v22 is the last major version to support Jellybean and Kitkat. Magisk v23 will only support Android 5.0 and higher. 6 | 7 | ### Bug Fixes 8 | 9 | - [App] Prevent multiple installation sessions running in parallel 10 | - [App] Prevent OutOfMemory crashes when checking boot signature on PXA boot images 11 | - [General] Proper cgroup migration implementation 12 | - [General] Rewrite log writer from scratch, should resolve any crashes and deadlocks 13 | - [General] Many scripts updates fixing regressions 14 | - [MagiskHide] Prevent possible deadlock when signal arrives 15 | - [MagiskHide] Partial match process names if necessary 16 | - [MagiskBoot] Preserve and patch AVB 2.0 structures/headers in boot images 17 | - [MagiskBoot] Properly strip out data encryption flags 18 | - [MagiskBoot] Prevent possible integer overflow 19 | - [MagiskInit] Fix `sepolicy.rule` mounting strategy 20 | - [resetprop] Always delete existing `ro.` props before updating. This will fix bootloops that could be caused by modifying device fingerprint properties. 21 | 22 | ### Full Changelog: [here](https://topjohnwu.github.io/Magisk/changes.html) 23 | -------------------------------------------------------------------------------- /native/src/boot/hexpatch.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include 4 | 5 | #include "magiskboot.hpp" 6 | 7 | using namespace std; 8 | 9 | static void hex2byte(const char *hex, uint8_t *buf) { 10 | char high, low; 11 | for (int i = 0, length = strlen(hex); i < length; i += 2) { 12 | high = toupper(hex[i]) - '0'; 13 | low = toupper(hex[i + 1]) - '0'; 14 | buf[i / 2] = ((high > 9 ? high - 7 : high) << 4) + (low > 9 ? low - 7 : low); 15 | } 16 | } 17 | 18 | int hexpatch(const char *file, const char *from, const char *to) { 19 | int patched = 1; 20 | 21 | auto m = mmap_data(file, true); 22 | 23 | vector pattern(strlen(from) / 2); 24 | vector patch(strlen(to) / 2); 25 | 26 | hex2byte(from, pattern.data()); 27 | hex2byte(to, patch.data()); 28 | 29 | uint8_t * const end = m.buf + m.sz; 30 | for (uint8_t *curr = m.buf; curr < end; curr += pattern.size()) { 31 | curr = static_cast(memmem(curr, end - curr, pattern.data(), pattern.size())); 32 | if (curr == nullptr) 33 | return patched; 34 | fprintf(stderr, "Patch @ %08X [%s] -> [%s]\n", (unsigned)(curr - m.buf), from, to); 35 | memset(curr, 0, pattern.size()); 36 | memcpy(curr, patch.data(), patch.size()); 37 | patched = 0; 38 | } 39 | 40 | return patched; 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_icon_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | 18 | 28 | 29 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/ui/flash/ConsoleItem.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.ui.flash 2 | 3 | import android.view.View 4 | import android.widget.TextView 5 | import androidx.core.view.updateLayoutParams 6 | import androidx.databinding.ViewDataBinding 7 | import androidx.recyclerview.widget.RecyclerView 8 | import com.topjohnwu.magisk.R 9 | import com.topjohnwu.magisk.databinding.DiffRvItem 10 | import com.topjohnwu.magisk.databinding.RvContainer 11 | import com.topjohnwu.magisk.databinding.ViewAwareRvItem 12 | import kotlin.math.max 13 | 14 | class ConsoleItem( 15 | override val item: String 16 | ) : DiffRvItem(), ViewAwareRvItem, RvContainer { 17 | override val layoutRes = R.layout.item_console_md2 18 | 19 | private var parentWidth = -1 20 | 21 | override fun onBind(binding: ViewDataBinding, recyclerView: RecyclerView) { 22 | if (parentWidth < 0) 23 | parentWidth = (recyclerView.parent as View).width 24 | 25 | val view = binding.root as TextView 26 | view.measure(0, 0) 27 | 28 | // We want our recyclerView at least as wide as screen 29 | val desiredWidth = max(view.measuredWidth, parentWidth) 30 | 31 | view.updateLayoutParams { width = desiredWidth } 32 | 33 | if (recyclerView.width < desiredWidth) { 34 | recyclerView.requestLayout() 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.ui.settings 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import com.topjohnwu.magisk.R 6 | import com.topjohnwu.magisk.arch.BaseFragment 7 | import com.topjohnwu.magisk.arch.viewModel 8 | import com.topjohnwu.magisk.databinding.FragmentSettingsMd2Binding 9 | import rikka.recyclerview.addEdgeSpacing 10 | import rikka.recyclerview.addItemSpacing 11 | import rikka.recyclerview.fixEdgeEffect 12 | 13 | class SettingsFragment : BaseFragment() { 14 | 15 | override val layoutRes = R.layout.fragment_settings_md2 16 | override val viewModel by viewModel() 17 | override val snackbarView: View get() = binding.snackbarContainer 18 | 19 | override fun onStart() { 20 | super.onStart() 21 | 22 | activity?.title = resources.getString(R.string.settings) 23 | } 24 | 25 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 26 | super.onViewCreated(view, savedInstanceState) 27 | binding.settingsList.apply { 28 | addEdgeSpacing(bottom = R.dimen.l1) 29 | addItemSpacing(R.dimen.l1, R.dimen.l_50, R.dimen.l1) 30 | fixEdgeEffect() 31 | } 32 | } 33 | 34 | override fun onResume() { 35 | super.onResume() 36 | viewModel.items.forEach { it.refresh() } 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_manager.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/events/dialog/MarkDownDialog.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.events.dialog 2 | 3 | import android.view.LayoutInflater 4 | import android.widget.TextView 5 | import androidx.annotation.CallSuper 6 | import androidx.lifecycle.lifecycleScope 7 | import com.topjohnwu.magisk.R 8 | import com.topjohnwu.magisk.core.di.ServiceLocator 9 | import com.topjohnwu.magisk.view.MagiskDialog 10 | import kotlinx.coroutines.Dispatchers 11 | import kotlinx.coroutines.launch 12 | import kotlinx.coroutines.withContext 13 | import timber.log.Timber 14 | import java.io.IOException 15 | 16 | abstract class MarkDownDialog : DialogEvent() { 17 | 18 | abstract suspend fun getMarkdownText(): String 19 | 20 | @CallSuper 21 | override fun build(dialog: MagiskDialog) { 22 | with(dialog) { 23 | val view = LayoutInflater.from(context).inflate(R.layout.markdown_window_md2, null) 24 | setView(view) 25 | val tv = view.findViewById(R.id.md_txt) 26 | activity.lifecycleScope.launch { 27 | try { 28 | val text = withContext(Dispatchers.IO) { getMarkdownText() } 29 | ServiceLocator.markwon.setMarkdown(tv, text) 30 | } catch (e: IOException) { 31 | Timber.e(e) 32 | tv.setText(R.string.download_file_error) 33 | } 34 | } 35 | } 36 | } 37 | } 38 | --------------------------------------------------------------------------------