├── .gitattributes ├── .gitignore ├── .gitmodules ├── LICENSE ├── README.MD ├── app ├── .gitignore ├── build.gradle ├── proguard-kotlin.pro ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── a │ │ ├── a.java │ │ ├── b.java │ │ ├── c.java │ │ ├── e.java │ │ ├── f.java │ │ ├── g.java │ │ ├── h.java │ │ ├── j.java │ │ ├── m.java │ │ └── w.java │ └── com │ │ └── topjohnwu │ │ └── magisk │ │ ├── App.kt │ │ ├── ClassMap.kt │ │ ├── Config.kt │ │ ├── Const.kt │ │ ├── Info.java │ │ ├── data │ │ ├── database │ │ │ ├── LogDao.kt │ │ │ ├── PolicyDao.kt │ │ │ ├── RepoDao.kt │ │ │ ├── RepoDatabase.kt │ │ │ ├── SettingsDao.kt │ │ │ ├── StringDao.kt │ │ │ └── base │ │ │ │ ├── BaseDao.kt │ │ │ │ ├── DatabaseDefinition.kt │ │ │ │ ├── MagiskQuery.kt │ │ │ │ └── MagiskQueryBuilder.kt │ │ ├── network │ │ │ └── GithubServices.kt │ │ └── repository │ │ │ ├── DBConfig.kt │ │ │ ├── LogRepository.kt │ │ │ ├── MagiskRepository.kt │ │ │ └── StringRepository.kt │ │ ├── di │ │ ├── ApplicationModule.kt │ │ ├── DatabaseModule.kt │ │ ├── MiscModule.kt │ │ ├── Modules.kt │ │ ├── NamedInjection.kt │ │ ├── NetworkingModule.kt │ │ ├── RepositoryModule.kt │ │ └── ViewModelsModule.kt │ │ ├── extensions │ │ ├── XAndroid.kt │ │ ├── XBinding.kt │ │ ├── XJava.kt │ │ ├── XKoin.kt │ │ ├── XList.kt │ │ ├── XRx.kt │ │ ├── XSU.kt │ │ ├── XString.kt │ │ ├── XTime.kt │ │ └── XView.kt │ │ ├── model │ │ ├── binding │ │ │ └── BindingAdapter.kt │ │ ├── download │ │ │ ├── DownloadService.kt │ │ │ ├── ManagerUpgrade.kt │ │ │ ├── ModuleProcessor.kt │ │ │ ├── NotificationService.kt │ │ │ └── RemoteFileService.kt │ │ ├── entity │ │ │ ├── HideAppInfo.kt │ │ │ ├── HideTarget.kt │ │ │ ├── MagiskLog.kt │ │ │ ├── MagiskPolicy.kt │ │ │ ├── Policy.java │ │ │ ├── SuLogEntry.java │ │ │ ├── UpdateInfo.kt │ │ │ ├── Version.kt │ │ │ ├── internal │ │ │ │ ├── Configuration.kt │ │ │ │ └── DownloadSubject.kt │ │ │ ├── module │ │ │ │ ├── BaseModule.kt │ │ │ │ ├── Module.kt │ │ │ │ └── Repo.kt │ │ │ ├── recycler │ │ │ │ ├── ConsoleRvItem.kt │ │ │ │ ├── HideRvItem.kt │ │ │ │ ├── LenientRvItem.kt │ │ │ │ ├── LogRvItem.kt │ │ │ │ ├── ModuleRvItem.kt │ │ │ │ ├── PolicyRvItem.kt │ │ │ │ ├── SectionRvItem.kt │ │ │ │ └── SpinnerRvItem.kt │ │ │ └── state │ │ │ │ └── IndeterminateState.kt │ │ ├── events │ │ │ ├── RxEvents.kt │ │ │ └── ViewEvents.kt │ │ ├── flash │ │ │ ├── FlashResultListener.kt │ │ │ ├── Flashing.kt │ │ │ └── Patching.kt │ │ ├── navigation │ │ │ ├── MagiskNavigationEvent.kt │ │ │ ├── Navigation.kt │ │ │ └── Navigator.kt │ │ ├── observer │ │ │ └── Observer.kt │ │ ├── permissions │ │ │ └── PermissionRequestBuilder.kt │ │ ├── preference │ │ │ ├── BooleanProperty.kt │ │ │ ├── FloatProperty.kt │ │ │ ├── IntProperty.kt │ │ │ ├── LongProperty.kt │ │ │ ├── PreferenceModel.kt │ │ │ ├── Property.kt │ │ │ ├── StringProperty.kt │ │ │ └── StringSetProperty.kt │ │ ├── receiver │ │ │ └── GeneralReceiver.kt │ │ ├── update │ │ │ └── UpdateCheckService.kt │ │ ├── worker │ │ │ └── DelegateWorker.java │ │ └── zip │ │ │ └── Zip.kt │ │ ├── tasks │ │ ├── FlashZip.kt │ │ ├── InstallerHelper.kt │ │ ├── MagiskInstaller.kt │ │ └── RepoUpdater.kt │ │ ├── ui │ │ ├── MainActivity.kt │ │ ├── MainViewModel.kt │ │ ├── SplashActivity.kt │ │ ├── base │ │ │ ├── BasePreferenceFragment.kt │ │ │ ├── MagiskActivity.kt │ │ │ ├── MagiskFragment.kt │ │ │ └── MagiskViewModel.kt │ │ ├── flash │ │ │ ├── FlashActivity.kt │ │ │ └── FlashViewModel.kt │ │ ├── hide │ │ │ ├── HideViewModel.kt │ │ │ └── MagiskHideFragment.kt │ │ ├── home │ │ │ ├── HomeFragment.kt │ │ │ ├── HomeViewModel.kt │ │ │ ├── MagiskItem.kt │ │ │ ├── MagiskState.kt │ │ │ └── SafetyNetState.kt │ │ ├── log │ │ │ ├── LogFragment.kt │ │ │ └── LogViewModel.kt │ │ ├── module │ │ │ ├── ModuleViewModel.kt │ │ │ ├── ModulesFragment.kt │ │ │ └── ReposFragment.kt │ │ ├── settings │ │ │ └── SettingsFragment.kt │ │ ├── superuser │ │ │ ├── SuperuserFragment.kt │ │ │ └── SuperuserViewModel.kt │ │ └── surequest │ │ │ ├── SuRequestActivity.kt │ │ │ └── SuRequestViewModel.kt │ │ ├── utils │ │ ├── DataBindingAdapters.kt │ │ ├── FingerprintHelper.kt │ │ ├── ISafetyNetHelper.java │ │ ├── LocaleManager.kt │ │ ├── Logger.java │ │ ├── PatchAPK.java │ │ ├── ProgressInputStream.kt │ │ ├── RootUtils.kt │ │ ├── SuConnector.java │ │ ├── SuLogger.kt │ │ ├── Utils.kt │ │ ├── ValueSortedMap.java │ │ ├── ZipUtils.kt │ │ └── feature │ │ │ └── Annotations.kt │ │ └── view │ │ ├── MagiskDialog.kt │ │ ├── MarkDownWindow.kt │ │ ├── Notifications.java │ │ ├── Shortcuts.kt │ │ ├── SnackbarMaker.kt │ │ └── dialogs │ │ ├── CustomAlertDialog.kt │ │ ├── EnvFixDialog.kt │ │ ├── FingerprintAuthDialog.kt │ │ ├── InstallMethodDialog.kt │ │ ├── MagiskInstallDialog.kt │ │ ├── ManagerInstallDialog.kt │ │ └── UninstallDialog.kt │ └── res │ ├── drawable-anydpi-v21 │ └── ic_magisk_outline.xml │ ├── drawable-anydpi-v26 │ └── ic_launcher.xml │ ├── drawable-hdpi │ ├── ic_launcher.png │ └── ic_magisk_outline.png │ ├── drawable-mdpi │ ├── ic_launcher.png │ └── ic_magisk_outline.png │ ├── drawable-nodpi │ └── logo.png │ ├── drawable-v26 │ ├── sc_cloud_download.xml │ ├── sc_extension.xml │ ├── sc_magiskhide.xml │ └── sc_superuser.xml │ ├── drawable-xhdpi │ ├── ic_launcher.png │ └── ic_magisk_outline.png │ ├── drawable-xxhdpi │ ├── ic_launcher.png │ └── ic_magisk_outline.png │ ├── drawable-xxxhdpi │ ├── ic_launcher.png │ └── ic_magisk_outline.png │ ├── drawable │ ├── ic_add.xml │ ├── ic_arrow.xml │ ├── ic_arrow_down.xml │ ├── ic_back.xml │ ├── ic_bug_report.xml │ ├── ic_cancel.xml │ ├── ic_check_circle.xml │ ├── ic_checked.xml │ ├── ic_cloud_download.xml │ ├── ic_delete.xml │ ├── ic_extension.xml │ ├── ic_file_download_black.xml │ ├── ic_fingerprint.xml │ ├── ic_github.xml │ ├── ic_help.xml │ ├── ic_indeterminate.xml │ ├── ic_magisk_padded.xml │ ├── ic_magiskhide.xml │ ├── ic_menu.xml │ ├── ic_more.xml │ ├── ic_notifications.xml │ ├── ic_patreon.xml │ ├── ic_paypal.xml │ ├── ic_refresh.xml │ ├── ic_restart.xml │ ├── ic_safetynet.xml │ ├── ic_save.xml │ ├── ic_save_compat.xml │ ├── ic_settings.xml │ ├── ic_sort.xml │ ├── ic_splash_activity.xml │ ├── ic_superuser.xml │ ├── ic_twitter.xml │ ├── ic_unchecked.xml │ ├── ic_undelete.xml │ ├── ic_update.xml │ ├── ic_warning.xml │ ├── ic_xda.xml │ ├── sc_cloud_download.xml │ ├── sc_extension.xml │ ├── sc_magiskhide.xml │ └── sc_superuser.xml │ ├── layout │ ├── activity_flash.xml │ ├── activity_main.xml │ ├── activity_main_content.xml │ ├── activity_request.xml │ ├── activity_su_request.xml │ ├── alert_dialog.xml │ ├── custom_channel_dialog.xml │ ├── custom_download_dialog.xml │ ├── dialog_magisk_base.xml │ ├── fragment_log.xml │ ├── fragment_magisk.xml │ ├── fragment_magisk_hide.xml │ ├── fragment_magisk_log.xml │ ├── fragment_modules.xml │ ├── fragment_repos.xml │ ├── fragment_su_log.xml │ ├── fragment_superuser.xml │ ├── include_update_card.xml │ ├── item_console.xml │ ├── item_hide_app.xml │ ├── item_hide_process.xml │ ├── item_module.xml │ ├── item_page_log.xml │ ├── item_page_magisk_log.xml │ ├── item_policy.xml │ ├── item_repo.xml │ ├── item_section.xml │ ├── item_spinner.xml │ ├── item_superuser_log.xml │ ├── item_superuser_log_entry.xml │ ├── markdown_window.xml │ ├── section.xml │ ├── toolbar.xml │ └── update_card.xml │ ├── menu │ ├── drawer.xml │ ├── menu_log.xml │ ├── menu_magiskhide.xml │ ├── menu_reboot.xml │ └── menu_repo.xml │ ├── raw │ ├── .gitignore │ ├── changelog.md │ ├── nonroot_utils.sh │ └── utils.sh │ ├── values-ar │ └── strings.xml │ ├── values-az │ └── strings.xml │ ├── values-bg │ └── strings.xml │ ├── values-ca │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-el │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-et │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-hr │ └── strings.xml │ ├── values-in │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-ko │ └── strings.xml │ ├── values-lt │ └── strings.xml │ ├── values-mk │ └── strings.xml │ ├── values-nb │ └── strings.xml │ ├── values-night │ ├── colors.xml │ └── styles_new.xml │ ├── values-nl │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sr │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-sw600dp │ ├── bools.xml │ ├── dimens.xml │ └── styles.xml │ ├── values-th │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-v19 │ └── styles.xml │ ├── values-v21 │ └── styles.xml │ ├── values-vi │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values │ ├── arrays.xml │ ├── attrs.xml │ ├── bools.xml │ ├── colors.xml │ ├── dimens.xml │ ├── ids.xml │ ├── strings.xml │ ├── styles.xml │ ├── styles_new.xml │ ├── view_appearances.xml │ ├── view_button_styles.xml │ ├── view_card_styles.xml │ ├── view_dialog_styles.xml │ ├── view_divider_styles.xml │ ├── view_image_styles.xml │ ├── view_input_styles.xml │ ├── view_progress_styles.xml │ ├── view_styles.xml │ └── view_text_styles.xml │ └── xml │ └── app_settings.xml ├── build.gradle ├── build.py ├── chromeos ├── futility ├── kernel.keyblock └── kernel_data_key.vbprivk ├── config.prop.sample ├── docs ├── README.md ├── deploy.md ├── details.md ├── guides.md ├── images │ ├── beta_channel.png │ ├── core_only.png │ ├── disable_auto_ota.png │ ├── flashfire.png │ ├── hide_manager.png │ ├── install_inactive_slot.png │ ├── manager_reboot.png │ ├── ota_done.png │ ├── restore_img.png │ └── safetynet.png ├── install.md ├── procedures.html ├── tools.md └── tutorials.md ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── native ├── .gitignore ├── build.gradle ├── jni │ ├── .gitignore │ ├── Android.mk │ ├── Application.mk │ ├── core │ │ ├── applet_stub.cpp │ │ ├── applets.cpp │ │ ├── bootstages.cpp │ │ ├── daemon.cpp │ │ ├── db.cpp │ │ ├── magisk.cpp │ │ ├── scripting.cpp │ │ └── socket.cpp │ ├── external │ │ ├── Android.mk │ │ ├── include │ │ │ ├── sqlite3.h │ │ │ ├── xz.h │ │ │ └── xz_config │ │ │ │ └── config.h │ │ ├── stubs │ │ │ ├── selinux_stub.c │ │ │ └── sqlite3_stub.c │ │ └── xz-embedded │ │ │ ├── xz_config.h │ │ │ ├── xz_crc32.c │ │ │ ├── xz_dec_lzma2.c │ │ │ ├── xz_dec_stream.c │ │ │ ├── xz_lzma2.h │ │ │ ├── xz_private.h │ │ │ └── xz_stream.h │ ├── include │ │ ├── daemon.h │ │ ├── db.h │ │ ├── flags.h │ │ ├── magisk.h │ │ └── resetprop.h │ ├── init │ │ ├── early_mount.cpp │ │ ├── getinfo.cpp │ │ ├── init.cpp │ │ ├── init.h │ │ ├── magiskrc.h │ │ └── rootdir.cpp │ ├── magiskboot │ │ ├── bootimg.cpp │ │ ├── bootimg.h │ │ ├── compress.cpp │ │ ├── compress.h │ │ ├── dtb.cpp │ │ ├── format.cpp │ │ ├── format.h │ │ ├── hexpatch.cpp │ │ ├── magiskboot.h │ │ ├── main.cpp │ │ ├── pattern.cpp │ │ └── ramdisk.cpp │ ├── magiskhide │ │ ├── hide_policy.cpp │ │ ├── hide_utils.cpp │ │ ├── magiskhide.cpp │ │ ├── magiskhide.h │ │ └── proc_monitor.cpp │ ├── magiskpolicy │ │ ├── api.cpp │ │ ├── magiskpolicy.cpp │ │ ├── magiskpolicy.h │ │ ├── policydb.cpp │ │ ├── rules.cpp │ │ ├── sepolicy.c │ │ └── sepolicy.h │ ├── resetprop │ │ ├── persist_properties.cpp │ │ ├── private │ │ │ ├── _system_properties.h │ │ │ ├── bionic_defs.h │ │ │ ├── bionic_macros.h │ │ │ ├── redefs.h │ │ │ ├── resetprop.h │ │ │ └── system_properties.h │ │ ├── resetprop.cpp │ │ ├── system_property_api.cpp │ │ └── system_property_set.cpp │ ├── su │ │ ├── connect.cpp │ │ ├── pts.cpp │ │ ├── pts.h │ │ ├── su.cpp │ │ ├── su.h │ │ └── su_daemon.cpp │ ├── systemproperties │ │ ├── Android.mk │ │ ├── context_node.cpp │ │ ├── contexts_serialized.cpp │ │ ├── contexts_split.cpp │ │ ├── include │ │ │ ├── async_safe │ │ │ │ └── log.h │ │ │ ├── hacks.h │ │ │ ├── private │ │ │ │ ├── ErrnoRestorer.h │ │ │ │ ├── bionic_futex.h │ │ │ │ ├── bionic_lock.h │ │ │ │ └── bionic_macros.h │ │ │ ├── property_info_parser │ │ │ │ └── property_info_parser.h │ │ │ └── system_properties │ │ │ │ ├── context_node.h │ │ │ │ ├── contexts.h │ │ │ │ ├── contexts_pre_split.h │ │ │ │ ├── contexts_serialized.h │ │ │ │ ├── contexts_split.h │ │ │ │ ├── prop_area.h │ │ │ │ ├── prop_info.h │ │ │ │ └── system_properties.h │ │ ├── prop_area.cpp │ │ ├── prop_info.cpp │ │ ├── property_info_parser.cpp │ │ └── system_properties.cpp │ └── utils │ │ ├── Android.mk │ │ ├── cpio.cpp │ │ ├── file.cpp │ │ ├── files.h │ │ ├── include │ │ ├── BlockingQueue.h │ │ ├── OutStream.h │ │ ├── cpio.h │ │ ├── logging.h │ │ ├── selinux.h │ │ └── utils.h │ │ ├── logging.cpp │ │ ├── misc.cpp │ │ ├── misc.h │ │ ├── missing.cpp │ │ ├── missing.h │ │ ├── new.cpp │ │ ├── selinux.cpp │ │ ├── xwrap.cpp │ │ └── xwrap.h └── src │ └── main │ └── AndroidManifest.xml ├── net ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── topjohnwu │ └── net │ ├── BadRequest.java │ ├── ErrorHandler.java │ ├── Networking.java │ ├── NoSSLv3SocketFactory.java │ ├── Request.java │ ├── ResponseListener.java │ └── SSLSocketWrapper.java ├── scripts ├── addon.d.sh ├── boot_patch.sh ├── flash_script.sh ├── magisk_uninstaller.sh ├── module_installer.sh ├── update_binary.sh └── util_functions.sh ├── settings.gradle ├── shared ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── a │ │ └── p.java │ └── com │ │ └── topjohnwu │ │ └── magisk │ │ └── utils │ │ ├── APKInstall.java │ │ └── FileProvider.java │ └── res │ ├── drawable │ ├── ic_logo.xml │ └── ic_magisk.xml │ ├── values-anydpi-v21 │ └── drawable.xml │ ├── values-ar │ └── strings.xml │ ├── values-bg │ └── strings.xml │ ├── values-ca │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-el │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-et │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-hr │ └── strings.xml │ ├── values-in │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-ko │ └── strings.xml │ ├── values-lt │ └── strings.xml │ ├── values-mk │ └── strings.xml │ ├── values-nb │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sr │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-th │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-vi │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values │ └── strings.xml │ └── xml │ └── file_paths.xml ├── signing ├── .gitignore ├── build.gradle └── src │ └── main │ ├── java │ └── com │ │ └── topjohnwu │ │ └── signing │ │ ├── BootSigner.java │ │ ├── ByteArrayStream.java │ │ ├── CryptoUtils.java │ │ ├── JarMap.java │ │ ├── SignAPK.java │ │ ├── SignBoot.java │ │ ├── ZipAdjust.java │ │ └── ZipSigner.java │ └── resources │ └── keys │ ├── testkey.pk8 │ ├── testkey.x509.pem │ ├── verity.pk8 │ └── verity.x509.pem ├── snet ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── topjohnwu │ └── snet │ ├── SafetyNetHelper.java │ ├── Snet.java │ └── SwapResContext.java └── stub ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java └── com │ └── topjohnwu │ └── magisk │ ├── BootLauncher.java │ └── MainActivity.java └── res ├── values-bg └── strings.xml ├── values-ca └── strings.xml ├── values-de └── strings.xml ├── values-es └── strings.xml ├── values-et └── strings.xml ├── values-fr └── strings.xml ├── values-in └── strings.xml ├── values-it └── strings.xml ├── values-ko └── strings.xml ├── values-lt └── strings.xml ├── values-mk └── strings.xml ├── values-nb └── strings.xml ├── values-pl └── strings.xml ├── values-ro └── strings.xml ├── values-ru └── strings.xml ├── values-sk └── strings.xml ├── values-tr └── strings.xml ├── values-uk └── strings.xml ├── values-zh-rCN └── strings.xml ├── values-zh-rTW └── strings.xml └── values └── strings.xml /.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 | chromeos/** binary 15 | *.jar binary 16 | *.exe binary 17 | *.apk binary 18 | *.png binary 19 | *.jpg binary 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | *.zip 3 | *.jks 4 | *.apk 5 | config.prop 6 | update.sh 7 | 8 | # Built binaries 9 | native/out 10 | 11 | # Android Studio / Gradle 12 | *.iml 13 | .gradle 14 | /local.properties 15 | /.idea 16 | /build 17 | /captures 18 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "selinux"] 2 | path = native/jni/external/selinux 3 | url = https://github.com/topjohnwu/selinux.git 4 | [submodule "busybox"] 5 | path = native/jni/external/busybox 6 | url = https://github.com/topjohnwu/ndk-busybox.git 7 | [submodule "dtc"] 8 | path = native/jni/external/dtc 9 | url = https://github.com/dgibson/dtc 10 | [submodule "lz4"] 11 | path = native/jni/external/lz4 12 | url = https://github.com/lz4/lz4.git 13 | [submodule "bzip2"] 14 | path = native/jni/external/bzip2 15 | url = https://github.com/nemequ/bzip2.git 16 | [submodule "xz"] 17 | path = native/jni/external/xz 18 | url = https://github.com/xz-mirror/xz.git 19 | [submodule "nanopb"] 20 | path = native/jni/external/nanopb 21 | url = https://github.com/nanopb/nanopb.git 22 | [submodule "mincrypt"] 23 | path = native/jni/external/mincrypt 24 | url = https://github.com/topjohnwu/mincrypt.git 25 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea/ 5 | /build 6 | app/release 7 | *.hprof 8 | .externalNativeBuild/ 9 | public.certificate.x509.pem 10 | private.key.pk8 11 | *.apk 12 | -------------------------------------------------------------------------------- /app/proguard-kotlin.pro: -------------------------------------------------------------------------------- 1 | ## So every class is case insensitive to avoid some bizare problems 2 | -dontusemixedcaseclassnames 3 | 4 | ## If reflection issues come up uncomment this, that should temporarily fix it 5 | #-keep class kotlin.** { *; } 6 | #-keep class kotlin.Metadata { *; } 7 | #-keepclassmembers class kotlin.Metadata { 8 | # public ; 9 | #} 10 | 11 | ## Never warn about Kotlin, it should work as-is 12 | -dontwarn kotlin.** 13 | 14 | ## Removes runtime null checks - doesn't really matter if it crashes on kotlin or java NPE 15 | -assumenosideeffects class kotlin.jvm.internal.Intrinsics { 16 | static void checkParameterIsNotNull(java.lang.Object, java.lang.String); 17 | } 18 | 19 | ## Useless option for dex 20 | -dontpreverify -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/topjohnwu/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Snet 20 | -keepclassmembers class com.topjohnwu.magisk.utils.ISafetyNetHelper { *; } 21 | -keep,allowobfuscation interface com.topjohnwu.magisk.utils.ISafetyNetHelper$Callback 22 | -keepclassmembers class * implements com.topjohnwu.magisk.utils.ISafetyNetHelper$Callback { 23 | void onResponse(int); 24 | } 25 | 26 | # Keep all fragment constructors 27 | -keepclassmembers class * extends androidx.fragment.app.Fragment { 28 | public (...); 29 | } 30 | 31 | # DelegateWorker 32 | -keep,allowobfuscation class * extends com.topjohnwu.magisk.model.worker.DelegateWorker 33 | 34 | # BootSigner 35 | -keepclassmembers class com.topjohnwu.signing.BootSigner { *; } 36 | 37 | # Strip logging 38 | -assumenosideeffects class timber.log.Timber.Tree { *; } 39 | -assumenosideeffects class com.topjohnwu.magisk.utils.Logger { 40 | public *** debug(...); 41 | } 42 | 43 | # Excessive obfuscation 44 | -repackageclasses 'a' 45 | -allowaccessmodification 46 | 47 | # QOL 48 | -dontnote ** 49 | -dontwarn com.caverock.androidsvg.** 50 | -dontwarn ru.noties.markwon.** 51 | -------------------------------------------------------------------------------- /app/src/main/java/a/a.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.utils.PatchAPK; 4 | import com.topjohnwu.signing.BootSigner; 5 | 6 | import androidx.annotation.Keep; 7 | 8 | @Keep 9 | public class a extends BootSigner { 10 | public static boolean patchAPK(String in, String out, String pkg) { 11 | return PatchAPK.patch(in, out, pkg); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/a/b.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.ui.MainActivity; 4 | 5 | public class b extends MainActivity { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/c.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.ui.SplashActivity; 4 | 5 | public class c extends SplashActivity { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/e.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.App; 4 | 5 | public class e extends App { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/f.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.ui.flash.FlashActivity; 4 | 5 | public class f extends FlashActivity { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/g.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import android.content.Context; 4 | 5 | import com.topjohnwu.magisk.model.update.UpdateCheckService; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.work.WorkerParameters; 9 | 10 | public class g extends w { 11 | /* Stub */ 12 | public g(@NonNull Context context, @NonNull WorkerParameters workerParams) { 13 | super(context, workerParams); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/a/h.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.model.receiver.GeneralReceiver; 4 | 5 | public class h extends GeneralReceiver { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/j.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.model.download.DownloadService; 4 | 5 | public class j extends DownloadService { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/m.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import com.topjohnwu.magisk.ui.surequest.SuRequestActivity; 4 | 5 | public class m extends SuRequestActivity { 6 | /* stub */ 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/java/a/w.java: -------------------------------------------------------------------------------- 1 | package a; 2 | 3 | import android.content.Context; 4 | 5 | import com.topjohnwu.magisk.model.worker.DelegateWorker; 6 | 7 | import java.lang.reflect.ParameterizedType; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.work.Worker; 11 | import androidx.work.WorkerParameters; 12 | 13 | public abstract class w extends Worker { 14 | 15 | /* Wrapper class to workaround Proguard -keep class * extends Worker */ 16 | 17 | private T base; 18 | 19 | @SuppressWarnings("unchecked") 20 | w(@NonNull Context context, @NonNull WorkerParameters workerParams) { 21 | super(context, workerParams); 22 | try { 23 | base = ((Class) ((ParameterizedType) getClass().getGenericSuperclass()) 24 | .getActualTypeArguments()[0]).newInstance(); 25 | base.setActualWorker(this); 26 | } catch (Exception ignored) {} 27 | } 28 | 29 | @NonNull 30 | @Override 31 | public Result doWork() { 32 | if (base == null) 33 | return Result.failure(); 34 | return base.doWork(); 35 | } 36 | 37 | @Override 38 | public void onStopped() { 39 | if (base != null) 40 | base.onStopped(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/ClassMap.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk 2 | 3 | import com.topjohnwu.magisk.model.download.DownloadService 4 | import com.topjohnwu.magisk.model.receiver.GeneralReceiver 5 | import com.topjohnwu.magisk.model.update.UpdateCheckService 6 | import com.topjohnwu.magisk.ui.MainActivity 7 | import com.topjohnwu.magisk.ui.SplashActivity 8 | import com.topjohnwu.magisk.ui.flash.FlashActivity 9 | import com.topjohnwu.magisk.ui.surequest.SuRequestActivity 10 | 11 | object ClassMap { 12 | private val map = mapOf( 13 | App::class.java to a.e::class.java, 14 | MainActivity::class.java to a.b::class.java, 15 | SplashActivity::class.java to a.c::class.java, 16 | FlashActivity::class.java to a.f::class.java, 17 | UpdateCheckService::class.java to a.g::class.java, 18 | GeneralReceiver::class.java to a.h::class.java, 19 | DownloadService::class.java to a.j::class.java, 20 | SuRequestActivity::class.java to a.m::class.java 21 | ) 22 | 23 | @JvmStatic 24 | operator fun >get(c: Class<*>): T { 25 | return map.getOrElse(c) { throw IllegalArgumentException() } as T 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/Info.java: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.topjohnwu.magisk.model.entity.UpdateInfo; 6 | import com.topjohnwu.superuser.Shell; 7 | import com.topjohnwu.superuser.ShellUtils; 8 | 9 | public final class Info { 10 | 11 | public static int magiskVersionCode = -1; 12 | 13 | @NonNull 14 | public static String magiskVersionString = ""; 15 | 16 | @NonNull 17 | public static UpdateInfo remote = new UpdateInfo(); 18 | 19 | public static boolean keepVerity = false; 20 | public static boolean keepEnc = false; 21 | public static boolean recovery = false; 22 | 23 | public static void loadMagiskInfo() { 24 | try { 25 | magiskVersionString = ShellUtils.fastCmd("magisk -v").split(":")[0]; 26 | magiskVersionCode = Integer.parseInt(ShellUtils.fastCmd("magisk -V")); 27 | Config.setMagiskHide(Shell.su("magiskhide --status").exec().isSuccess()); 28 | } catch (NumberFormatException ignored) { 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.data.database 2 | 3 | import com.topjohnwu.magisk.data.database.base.* 4 | import com.topjohnwu.magisk.model.entity.MagiskLog 5 | import com.topjohnwu.magisk.model.entity.toLog 6 | import com.topjohnwu.magisk.model.entity.toMap 7 | import java.util.concurrent.TimeUnit 8 | 9 | class LogDao : BaseDao() { 10 | 11 | override val table = DatabaseDefinition.Table.LOG 12 | 13 | fun deleteOutdated( 14 | suTimeout: Long = TimeUnit.DAYS.toMillis(14) 15 | ) = query { 16 | condition { 17 | lessThan("time", suTimeout.toString()) 18 | } 19 | }.ignoreElement() 20 | 21 | fun deleteAll() = query {}.ignoreElement() 22 | 23 | fun fetchAll() = query { 18 | fields("value") 19 | condition { equals("key", key) } 20 | }.map { it.firstOrNull()?.values?.firstOrNull()?.toIntOrNull() ?: default } 21 | 22 | } -------------------------------------------------------------------------------- /app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt: -------------------------------------------------------------------------------- 1 | package com.topjohnwu.magisk.data.database 2 | 3 | import com.topjohnwu.magisk.data.database.base.* 4 | 5 | class StringDao : BaseDao() { 6 | 7 | override val table = DatabaseDefinition.Table.STRINGS 8 | 9 | fun delete(key: String) = query { 10 | condition { equals("key", key) } 11 | }.ignoreElement() 12 | 13 | fun put(key: String, value: String) = query { 14 | values("key" to key, "value" to value) 15 | }.ignoreElement() 16 | 17 | fun fetch(key: String, default: String = "") = query