From ac28e6e5ca0c39375d9d78cc9711328c1727f1f5 Mon Sep 17 00:00:00 2001 From: osm0sis Date: Wed, 8 May 2019 20:06:29 -0300 Subject: [PATCH 1/6] Fix uninstaller missing recent changes - group unsupported formats into the same code (https://github.com/topjohnwu/Magisk/commit/86f778c0aa21f1cc7a358331c102180488b3351b#diff-93690a8d9f50c177ef97416af3be8726) - support A only system-as-root devices (https://github.com/topjohnwu/Magisk/commit/e72c6685edf81706617a3444575c4500b9b8fe6c#diff-93690a8d9f50c177ef97416af3be8726) - remove unnecessary '--' from magiskboot actions (https://github.com/topjohnwu/Magisk/commit/7f08c0694392ede38ebbb6bd835757f2b3c3c477#diff-93690a8d9f50c177ef97416af3be8726) - get_flags need to be before find_boot_image (https://github.com/topjohnwu/Magisk/commit/a4f5d47e72158a559bd4b47e70bf7ba1126b2dbd) closes #1371, closes #1431, closes #1439 --- app/src/main/res/raw/utils.sh | 1 + scripts/magisk_uninstaller.sh | 36 +++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/src/main/res/raw/utils.sh b/app/src/main/res/raw/utils.sh index 66d2cafe1..4e2a298a1 100644 --- a/app/src/main/res/raw/utils.sh +++ b/app/src/main/res/raw/utils.sh @@ -55,6 +55,7 @@ restore_imgs() { local STOCKDTBO=/data/stock_dtbo.img.gz [ -f $STOCKBOOT ] || return 1 + get_flags find_boot_image find_dtbo_image diff --git a/scripts/magisk_uninstaller.sh b/scripts/magisk_uninstaller.sh index 8a9fd2410..0fb59b9ff 100644 --- a/scripts/magisk_uninstaller.sh +++ b/scripts/magisk_uninstaller.sh @@ -55,6 +55,7 @@ $BOOTMODE || recovery_actions # Uninstall ########################################################################################## +get_flags find_boot_image find_dtbo_image @@ -67,36 +68,35 @@ cd $MAGISKBIN CHROMEOS=false ui_print "- Unpacking boot image" -./magiskboot --unpack "$BOOTIMAGE" +./magiskboot unpack "$BOOTIMAGE" case $? in 1 ) - abort "! Unable to unpack boot image" + abort "! Unsupported/Unknown image format" ;; 2 ) ui_print "- ChromeOS boot image detected" CHROMEOS=true ;; - 3 ) - ui_print "! Sony ELF32 format detected" - abort "! Please use BootBridge from @AdrianDC" - ;; - 4 ) - ui_print "! Sony ELF64 format detected" - abort "! Stock kernel cannot be patched, please use a custom kernel" esac # Detect boot image state ui_print "- Checking ramdisk status" -./magiskboot --cpio ramdisk.cpio test -case $? in +if [ -e ramdisk.cpio ]; then + ./magiskboot cpio ramdisk.cpio test + STATUS=$? +else + # Stock A only system-as-root + STATUS=0 +fi +case $((STATUS & 3)) in 0 ) # Stock boot ui_print "- Stock boot image detected" ;; 1 ) # Magisk patched ui_print "- Magisk patched image detected" # Find SHA1 of stock boot image - [ -z $SHA1 ] && SHA1=`./magiskboot --cpio ramdisk.cpio sha1 2>/dev/null` + [ -z $SHA1 ] && SHA1=`./magiskboot cpio ramdisk.cpio sha1 2>/dev/null` STOCKBOOT=/data/stock_boot_${SHA1}.img.gz STOCKDTBO=/data/stock_dtbo.img.gz if [ -f $STOCKBOOT ]; then @@ -109,16 +109,20 @@ case $? in else ui_print "! Boot image backup unavailable" ui_print "- Restoring ramdisk with internal backup" - ./magiskboot --cpio ramdisk.cpio restore - ./magiskboot --repack $BOOTIMAGE + ./magiskboot cpio ramdisk.cpio restore + if ! ./magiskboot cpio ramdisk.cpio "exists init.rc"; then + # A only system-as-root + rm -f ramdisk.cpio + fi + ./magiskboot repack $BOOTIMAGE # Sign chromeos boot $CHROMEOS && sign_chromeos ui_print "- Flashing restored boot image" flash_image new-boot.img $BOOTIMAGE || abort "! Insufficient partition size" fi ;; - 2 ) # Other patched - ui_print "! Boot image patched by other programs" + 2 ) # Unsupported + ui_print "! Boot image patched by unsupported programs" abort "! Cannot uninstall" ;; esac From b0d6de783e3fad6d528506c46c806f5fa7135cf0 Mon Sep 17 00:00:00 2001 From: osm0sis Date: Wed, 8 May 2019 23:13:12 -0300 Subject: [PATCH 2/6] Correct magiskboot help --- native/jni/magiskboot/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/jni/magiskboot/main.cpp b/native/jni/magiskboot/main.cpp index e9d6eb217..545a01e82 100644 --- a/native/jni/magiskboot/main.cpp +++ b/native/jni/magiskboot/main.cpp @@ -74,7 +74,7 @@ static void usage(char *arg0) { " test\n" " Check if fstab has verity/avb flags\n" " Return values:\n" - " 0:no flags 1:flag exists\n" + " 0:flag exists 1:no flags\n" " patch\n" " Search for fstab and remove verity/avb\n" "\n" From 415ff23be5872f537d9ad59b4055abe3ddf3e280 Mon Sep 17 00:00:00 2001 From: Shaka Huang Date: Fri, 10 May 2019 10:48:06 +0800 Subject: [PATCH 3/6] Fix error mounting /data partition For devices come with two /data mount points, magisk will bind the one in tmpfs and failed to load modules since this partition is empty. Signed-off-by: Shaka Huang --- native/jni/core/bootstages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native/jni/core/bootstages.cpp b/native/jni/core/bootstages.cpp index 84bd15e9f..36181811e 100644 --- a/native/jni/core/bootstages.cpp +++ b/native/jni/core/bootstages.cpp @@ -374,7 +374,7 @@ static bool magisk_env() { mount_mirror(system, MS_RDONLY); } else if (str_contains(line, " /vendor ")) { mount_mirror(vendor, MS_RDONLY); - } else if (str_contains(line, " /data ")) { + } else if (str_contains(line, " /data ") && !str_contains(line, "tmpfs")) { mount_mirror(data, 0); } else if (SDK_INT >= 24 && str_contains(line, " /proc ") && !str_contains(line, "hidepid=2")) { From b152c631025933ed6e02522e971b4f8f4ce3ec8c Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Thu, 9 May 2019 23:16:21 -0700 Subject: [PATCH 4/6] Upgrade AS --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2bd42d85b..ead6ba1b2 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ buildscript { } dependencies { classpath 'com.android.tools:r8:1.4.93' - classpath 'com.android.tools.build:gradle:3.5.0-alpha13' + classpath 'com.android.tools.build:gradle:3.5.0-beta01' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.31" @@ -46,7 +46,7 @@ subprojects { getPlugins().hasPlugin('com.android.application')) { android { compileSdkVersion 'android-Q' - buildToolsVersion '29.0.0-rc2' + buildToolsVersion '29.0.0-rc3' defaultConfig { if (minSdkVersion == null) From ff7a0ba59957967a1376248a7dcb1a2ea9dbbf6f Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 10 May 2019 00:19:28 -0700 Subject: [PATCH 5/6] Force apply preferred locale in applyOverrideConfiguration Close #1442 --- .../java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt index 20384d02f..dc37ae9b2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt @@ -1,6 +1,7 @@ package com.topjohnwu.magisk.ui.base import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import androidx.annotation.CallSuper import androidx.appcompat.app.AppCompatDelegate @@ -24,6 +25,7 @@ import com.topjohnwu.magisk.model.navigation.MagiskAnimBuilder import com.topjohnwu.magisk.model.navigation.MagiskNavigationEvent import com.topjohnwu.magisk.model.navigation.Navigator import com.topjohnwu.magisk.model.permissions.PermissionRequestBuilder +import com.topjohnwu.magisk.utils.LocaleManager import com.topjohnwu.magisk.utils.Utils import timber.log.Timber import kotlin.reflect.KClass @@ -58,6 +60,12 @@ abstract class MagiskActivity Date: Fri, 10 May 2019 16:22:03 +0200 Subject: [PATCH 6/6] Fixed language won't change in certain views unless app restarts --- .../topjohnwu/magisk/di/ApplicationModule.kt | 9 ++- .../topjohnwu/magisk/di/ViewModelsModule.kt | 2 +- .../magisk/ui/base/MagiskActivity.kt | 2 +- .../topjohnwu/magisk/ui/home/HomeViewModel.kt | 64 +++++++++---------- .../com/topjohnwu/magisk/utils/XAndroid.kt | 6 ++ .../com/topjohnwu/magisk/utils/XString.kt | 7 ++ .../main/res/layout/include_update_card.xml | 4 +- 7 files changed, 50 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt index 861f1ce27..f58961dda 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ApplicationModule.kt @@ -9,12 +9,11 @@ import org.koin.dsl.module val applicationModule = module { single { RxBus() } - single { get().resources } - single { get() as App } - single { get().packageManager } + factory { get().resources } + factory { get() as App } + factory { get().packageManager } single(SUTimeout) { - get().protectedContext - .getSharedPreferences("su_timeout", 0) + get().protectedContext.getSharedPreferences("su_timeout", 0) } single { PreferenceManager.getDefaultSharedPreferences(get().protectedContext) } } diff --git a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt index 9983734a8..941176a48 100644 --- a/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt +++ b/app/src/main/java/com/topjohnwu/magisk/di/ViewModelsModule.kt @@ -15,7 +15,7 @@ import org.koin.dsl.module val viewModelModules = module { viewModel { MainViewModel() } - viewModel { HomeViewModel(get(), get()) } + viewModel { HomeViewModel(get()) } viewModel { SuperuserViewModel(get(), get(), get(), get()) } viewModel { HideViewModel(get(), get()) } viewModel { ModuleViewModel(get(), get()) } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt index dc37ae9b2..ec0a1f4d6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/MagiskActivity.kt @@ -62,7 +62,7 @@ abstract class MagiskActivity TODO() - MagiskState.NOT_INSTALLED -> resources.getString(R.string.magisk_version_error) - MagiskState.UP_TO_DATE -> resources.getString(R.string.magisk_up_to_date) - MagiskState.LOADING -> resources.getString(R.string.checking_for_updates) - MagiskState.OBSOLETE -> resources.getString(R.string.magisk_update_title) + MagiskState.NOT_INSTALLED -> R.string.magisk_version_error.res() + MagiskState.UP_TO_DATE -> R.string.magisk_up_to_date.res() + MagiskState.LOADING -> R.string.checking_for_updates.res() + MagiskState.OBSOLETE -> R.string.magisk_update_title.res() } } val magiskCurrentVersion = KObservableField("") val magiskLatestVersion = KObservableField("") val magiskAdditionalInfo = Observer(magiskState) { if (Config.get(Config.Key.COREONLY)) - resources.getString(R.string.core_only_enabled) + R.string.core_only_enabled.res() else "" } @@ -48,22 +48,22 @@ class HomeViewModel( val managerStateText = Observer(managerState) { when (managerState.value) { MagiskState.NO_ROOT -> "wtf" - MagiskState.NOT_INSTALLED -> resources.getString(R.string.invalid_update_channel) - MagiskState.UP_TO_DATE -> resources.getString(R.string.manager_up_to_date) - MagiskState.LOADING -> resources.getString(R.string.checking_for_updates) - MagiskState.OBSOLETE -> resources.getString(R.string.manager_update_title) + MagiskState.NOT_INSTALLED -> R.string.invalid_update_channel.res() + MagiskState.UP_TO_DATE -> R.string.manager_up_to_date.res() + MagiskState.LOADING -> R.string.checking_for_updates.res() + MagiskState.OBSOLETE -> R.string.manager_update_title.res() } } val managerCurrentVersion = KObservableField("") val managerLatestVersion = KObservableField("") val managerAdditionalInfo = Observer(managerState) { - if (app.packageName != BuildConfig.APPLICATION_ID) - "(${app.packageName})" + if (packageName != BuildConfig.APPLICATION_ID) + "($packageName)" else "" } - val safetyNetTitle = KObservableField(resources.getString(R.string.safetyNet_check_text)) + val safetyNetTitle = KObservableField(R.string.safetyNet_check_text.res()) val ctsState = KObservableField(SafetyNetState.IDLE) val basicIntegrityState = KObservableField(SafetyNetState.IDLE) val safetyNetState = Observer(ctsState, basicIntegrityState) { @@ -81,8 +81,6 @@ class HomeViewModel( val hasRoot = KObservableField(false) private var shownDialog = false - private val current = resources.getString(R.string.current_installed) - private val latest = resources.getString(R.string.latest_version) init { Event.register(this) @@ -126,7 +124,7 @@ class HomeViewModel( fun safetyNetPressed() { ctsState.value = SafetyNetState.LOADING basicIntegrityState.value = SafetyNetState.LOADING - safetyNetTitle.value = resources.getString(R.string.checking_safetyNet_status) + safetyNetTitle.value = R.string.checking_safetyNet_status.res() UpdateSafetyNetEvent().publish() } @@ -135,7 +133,7 @@ class HomeViewModel( response and 0x0F == 0 -> { val hasCtsPassed = response and ISafetyNetHelper.CTS_PASS != 0 val hasBasicIntegrityPassed = response and ISafetyNetHelper.BASIC_PASS != 0 - safetyNetTitle.value = resources.getString(R.string.safetyNet_check_success) + safetyNetTitle.value = R.string.safetyNet_check_success.res() ctsState.value = if (hasCtsPassed) { SafetyNetState.PASS } else { @@ -154,11 +152,10 @@ class HomeViewModel( else -> { ctsState.value = SafetyNetState.IDLE basicIntegrityState.value = SafetyNetState.IDLE - val errorString = when (response) { + safetyNetTitle.value = when (response) { ISafetyNetHelper.RESPONSE_ERR -> R.string.safetyNet_res_invalid else -> R.string.safetyNet_api_error - } - safetyNetTitle.value = resources.getString(errorString) + }.res() } } @@ -172,7 +169,7 @@ class HomeViewModel( hasRoot.value = Shell.rootAccess() - if (Networking.checkNetworkStatus(app)) { + if (Networking.checkNetworkStatus(context)) { CheckUpdates.check() } else { state = State.LOADING_FAILED @@ -187,16 +184,14 @@ class HomeViewModel( else -> MagiskState.UP_TO_DATE } - if (magiskState.value != MagiskState.NOT_INSTALLED) { - magiskCurrentVersion.value = version - .format(Config.magiskVersionString, Config.magiskVersionCode) - .let { current.format(it) } + magiskCurrentVersion.value = if (magiskState.value != MagiskState.NOT_INSTALLED) { + version.format(Config.magiskVersionString, Config.magiskVersionCode) } else { - magiskCurrentVersion.value = "" + "" } + magiskLatestVersion.value = version .format(Config.remoteMagiskVersionString, Config.remoteMagiskVersionCode) - .let { latest.format(it) } managerState.value = when (Config.remoteManagerVersionCode) { in Int.MIN_VALUE until 0 -> MagiskState.NOT_INSTALLED //wrong update channel @@ -206,10 +201,9 @@ class HomeViewModel( managerCurrentVersion.value = version .format(BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE) - .let { current.format(it) } + managerLatestVersion.value = version .format(Config.remoteManagerVersionString, Config.remoteManagerVersionCode) - .let { latest.format(it) } } private fun ensureEnv() { diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/XAndroid.kt b/app/src/main/java/com/topjohnwu/magisk/utils/XAndroid.kt index 0db67d30b..a2fdf97bc 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/XAndroid.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/XAndroid.kt @@ -11,6 +11,12 @@ import android.provider.OpenableColumns import com.topjohnwu.magisk.App import java.io.FileNotFoundException +val packageName: String + get() { + val app: App by inject() + return app.packageName + } + val PackageInfo.processes get() = activities?.processNames.orEmpty() + services?.processNames.orEmpty() + diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/XString.kt b/app/src/main/java/com/topjohnwu/magisk/utils/XString.kt index 5f41b8693..8e9ab7165 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/XString.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/XString.kt @@ -1,5 +1,7 @@ package com.topjohnwu.magisk.utils +import android.content.res.Resources + val specialChars = arrayOf('!', '@', '#', '$', '%', '&', '?') fun String.replaceRandomWithSpecial(): String { @@ -8,4 +10,9 @@ fun String.replaceRandomWithSpecial(): String { random = random() } while (random == '.') return replace(random, specialChars.random()) +} + +fun Int.res(vararg args: Any): String { + val resources: Resources by inject() + return resources.getString(this, *args) } \ No newline at end of file diff --git a/app/src/main/res/layout/include_update_card.xml b/app/src/main/res/layout/include_update_card.xml index a337a0edf..c40b531ac 100644 --- a/app/src/main/res/layout/include_update_card.xml +++ b/app/src/main/res/layout/include_update_card.xml @@ -110,7 +110,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:maxLines="1" - android:text="@{state != MagiskState.LOADING ? currentVersion : @string/checking_for_updates}" + android:text="@{state != MagiskState.LOADING ? @string/current_installed(currentVersion) : @string/checking_for_updates}" app:autoSizeMinTextSize="1sp" app:autoSizeTextType="uniform" app:layout_constraintBottom_toTopOf="@+id/latest_version" @@ -125,7 +125,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:maxLines="1" - android:text="@{state != MagiskState.LOADING ? latestVersion : @string/checking_for_updates}" + android:text="@{state != MagiskState.LOADING ? @string/latest_version(latestVersion) : @string/checking_for_updates}" app:autoSizeMinTextSize="1sp" app:autoSizeTextType="uniform" app:layout_constraintBottom_toTopOf="@+id/additional"