From 594c2accc0046a8e35d004b472e38c245908f9e6 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 5 Feb 2021 04:41:01 -0800 Subject: [PATCH] Update dependencies --- app/build.gradle.kts | 14 +++++----- .../topjohnwu/magisk/core/SplashActivity.kt | 11 ++------ .../magisk/core/model/su/SuPolicy.kt | 8 +++--- .../magisk/core/tasks/MagiskInstaller.kt | 26 ++++--------------- .../topjohnwu/magisk/core/utils/ZipUtils.kt | 2 +- .../java/com/topjohnwu/signing/SignBoot.java | 21 ++++++++++++--- build.gradle.kts | 4 +-- 7 files changed, 40 insertions(+), 46 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e526c396d..00a7865aa 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -201,13 +201,13 @@ dependencies { implementation("${bindingAdapter}:${vBAdapt}") implementation("${bindingAdapter}-recyclerview:${vBAdapt}") - val vMarkwon = "4.6.0" + val vMarkwon = "4.6.1" implementation("io.noties.markwon:core:${vMarkwon}") implementation("io.noties.markwon:html:${vMarkwon}") implementation("io.noties.markwon:image:${vMarkwon}") implementation("com.caverock:androidsvg:1.4") - val vLibsu = "3.0.2" + val vLibsu = "3.1.0" implementation("com.github.topjohnwu.libsu:core:${vLibsu}") implementation("com.github.topjohnwu.libsu:io:${vLibsu}") @@ -234,7 +234,7 @@ dependencies { implementation("com.squareup.moshi:moshi:${vMoshi}") kapt("com.squareup.moshi:moshi-kotlin-codegen:${vMoshi}") - val vRoom = "2.3.0-alpha04" + val vRoom = "2.3.0-beta01" implementation("androidx.room:room-runtime:${vRoom}") implementation("androidx.room:room-ktx:${vRoom}") kapt("androidx.room:room-compiler:${vRoom}") @@ -243,16 +243,16 @@ dependencies { implementation("androidx.navigation:navigation-fragment-ktx:${vNav}") implementation("androidx.navigation:navigation-ui-ktx:${vNav}") - implementation("androidx.biometric:biometric:1.0.1") + implementation("androidx.biometric:biometric:1.1.0") implementation("androidx.constraintlayout:constraintlayout:2.0.4") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("androidx.browser:browser:1.3.0") implementation("androidx.preference:preference:1.1.1") implementation("androidx.recyclerview:recyclerview:1.1.0") implementation("androidx.fragment:fragment-ktx:1.2.5") - implementation("androidx.work:work-runtime-ktx:2.4.0") - implementation("androidx.transition:transition:1.3.1") + implementation("androidx.work:work-runtime-ktx:2.5.0") + implementation("androidx.transition:transition:1.4.0") implementation("androidx.multidex:multidex:2.0.1") implementation("androidx.core:core-ktx:1.3.2") - implementation("com.google.android.material:material:1.2.1") + implementation("com.google.android.material:material:1.3.0") } diff --git a/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt b/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt index c88c73fbb..9b9fba1c6 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/SplashActivity.kt @@ -11,9 +11,6 @@ import com.topjohnwu.magisk.ui.MainActivity import com.topjohnwu.magisk.view.Notifications import com.topjohnwu.magisk.view.Shortcuts import com.topjohnwu.superuser.Shell -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch open class SplashActivity : Activity() { @@ -24,9 +21,8 @@ open class SplashActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { setTheme(R.style.SplashTheme) super.onCreate(savedInstanceState) - GlobalScope.launch(Dispatchers.IO) { - initAndStart() - } + // Pre-initialize root shell + Shell.getShell(null) { initAndStart() } } private fun handleRepackage(pkg: String?) { @@ -45,9 +41,6 @@ open class SplashActivity : Activity() { } private fun initAndStart() { - // Pre-initialize root shell - Shell.getShell() - val prevPkg = intent.getStringExtra(Const.Key.PREV_PKG) Config.load(prevPkg) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/model/su/SuPolicy.kt b/app/src/main/java/com/topjohnwu/magisk/core/model/su/SuPolicy.kt index 3d6a2eafb..cbe406850 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/model/su/SuPolicy.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/model/su/SuPolicy.kt @@ -1,11 +1,13 @@ +@file:SuppressLint("InlinedApi") + package com.topjohnwu.magisk.core.model.su +import android.annotation.SuppressLint import android.content.pm.PackageManager import android.graphics.drawable.Drawable import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.INTERACTIVE import com.topjohnwu.magisk.ktx.getLabel - data class SuPolicy( var uid: Int, val packageName: String, @@ -38,7 +40,7 @@ fun SuPolicy.toMap() = mapOf( fun Map.toPolicy(pm: PackageManager): SuPolicy { val uid = get("uid")?.toIntOrNull() ?: -1 val packageName = get("package_name").orEmpty() - val info = pm.getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES) + val info = pm.getApplicationInfo(packageName, PackageManager.MATCH_UNINSTALLED_PACKAGES) if (info.uid != uid) throw PackageManager.NameNotFoundException() @@ -59,7 +61,7 @@ fun Map.toPolicy(pm: PackageManager): SuPolicy { fun Int.toPolicy(pm: PackageManager, policy: Int = INTERACTIVE): SuPolicy { val pkg = pm.getPackagesForUid(this)?.firstOrNull() ?: throw PackageManager.NameNotFoundException() - val info = pm.getApplicationInfo(pkg, PackageManager.GET_UNINSTALLED_PACKAGES) + val info = pm.getApplicationInfo(pkg, PackageManager.MATCH_UNINSTALLED_PACKAGES) return SuPolicy( uid = info.uid, packageName = pkg, diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt index e8bc75ee6..e3283285c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt @@ -27,6 +27,7 @@ import com.topjohnwu.superuser.ShellUtils import com.topjohnwu.superuser.internal.NOPList import com.topjohnwu.superuser.internal.UiThreadHandler import com.topjohnwu.superuser.io.SuFile +import com.topjohnwu.superuser.io.SuFileInputStream import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import net.jpountz.lz4.LZ4FrameInputStream @@ -292,24 +293,6 @@ abstract class MagiskInstallImpl protected constructor( return true } - private fun rootInputStream(file: File): InputStream { - return if (file is SuFile) - object : BufferedInputStream(null) { - private val tmp = - File.createTempFile(file.name, null, context.cacheDir).also { - // Copy to tmp file and read from there - "cat $file > $it".sh() - `in` = it.inputStream() - } - override fun close() { - super.close() - tmp.delete() - } - } - else - file.inputStream().buffered() - } - private fun patchBoot(): Boolean { val inRootDir = shell.isRoot && Info.noDataExec @@ -335,7 +318,7 @@ abstract class MagiskInstallImpl protected constructor( var isSigned = false if (srcBoot.let { it !is SuFile || !it.isCharacter }) { try { - rootInputStream(srcBoot).use { + SuFileInputStream.open(srcBoot).use { if (SignBoot.verifySignature(it, null)) { isSigned = true console.add("- Boot image is signed with AVB 1.0") @@ -361,8 +344,9 @@ abstract class MagiskInstallImpl protected constructor( console.add("- Signing boot image with verity keys") val signed = File.createTempFile("signed", ".img", context.cacheDir) try { - withStreams(rootInputStream(newBootImg), signed.outputStream().buffered()) { - src, out -> SignBoot.doSignature(null, null, src, out, "/boot") + withStreams(SuFileInputStream.open(newBootImg).buffered(), + signed.outputStream().buffered()) { src, out -> + SignBoot.doSignature(null, null, src, out, "/boot") } } catch (e: IOException) { console.add("! Unable to sign image") diff --git a/app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt b/app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt index 1267f19b7..57f8a21f7 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/utils/ZipUtils.kt @@ -36,7 +36,7 @@ fun InputStream.unzip(folder: File, path: String, junkPath: Boolean) { dest = SuFile(folder, name) dest.parentFile!!.mkdirs() } - SuFileOutputStream(dest).use { out -> zin.copyTo(out) } + SuFileOutputStream.open(dest).use { out -> zin.copyTo(out) } } } catch (e: IOException) { e.printStackTrace() diff --git a/app/src/main/java/com/topjohnwu/signing/SignBoot.java b/app/src/main/java/com/topjohnwu/signing/SignBoot.java index 6f934a492..38f008f8c 100644 --- a/app/src/main/java/com/topjohnwu/signing/SignBoot.java +++ b/app/src/main/java/com/topjohnwu/signing/SignBoot.java @@ -90,6 +90,21 @@ public class SignBoot { } } + private static int fullRead(InputStream in, byte[] b) throws IOException { + return fullRead(in, b, 0, b.length); + } + + private static int fullRead(InputStream in, byte[] b, int off, int len) throws IOException { + int n = 0; + while (n < len) { + int count = in.read(b, off + n, len - n); + if (count <= 0) + break; + n += count; + } + return n; + } + public static boolean doSignature( @Nullable X509Certificate cert, @Nullable PrivateKey key, @NonNull InputStream imgIn, @NonNull OutputStream imgOut, @NonNull String target @@ -98,7 +113,7 @@ public class SignBoot { PushBackRWStream in = new PushBackRWStream(imgIn, imgOut); byte[] hdr = new byte[BOOT_IMAGE_HEADER_SIZE_MAXIMUM]; // First read the header - in.read(hdr); + fullRead(in, hdr); int signableSize = getSignableImageSize(hdr); // Unread header in.unread(hdr); @@ -128,7 +143,7 @@ public class SignBoot { try { // Read the header for size byte[] hdr = new byte[BOOT_IMAGE_HEADER_SIZE_MAXIMUM]; - if (imgIn.read(hdr) != hdr.length) { + if (fullRead(imgIn, hdr) != hdr.length) { System.err.println("Unable to read image header"); return false; } @@ -137,7 +152,7 @@ public class SignBoot { // Read the rest of the image byte[] rawImg = Arrays.copyOf(hdr, signableSize); int remain = signableSize - hdr.length; - if (imgIn.read(rawImg, hdr.length, remain) != remain) { + if (fullRead(imgIn, rawImg, hdr.length, remain) != remain) { System.err.println("Unable to read image"); return false; } diff --git a/build.gradle.kts b/build.gradle.kts index 4292fad07..8e33c5517 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,12 +14,12 @@ buildscript { maven { url = uri("https://kotlin.bintray.com/kotlinx") } } - val vNav = "2.3.2" + val vNav = "2.3.3" extra["vNav"] = vNav dependencies { classpath("com.android.tools.build:gradle:4.1.2") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.30") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:${vNav}") // NOTE: Do not place your application dependencies here; they belong