diff --git a/README.MD b/README.MD index 7b1619acc..4212cbc99 100644 --- a/README.MD +++ b/README.MD @@ -38,7 +38,7 @@ For Magisk app crashes, record and upload the logcat when the crash occurs. Default string resources for the Magisk app and its stub APK are located here: - `app/core/src/main/res/values/strings.xml` -- `app/stub/src/main/res/values/strings.xml` +- `app/stub-res/src/main/res/values/strings.xml` Translate each and place them in the respective locations (`[module]/src/main/res/values-[lang]/strings.xml`). diff --git a/app/build-logic/src/main/java/Setup.kt b/app/build-logic/src/main/java/Setup.kt index 7bbec29b4..7839d62ff 100644 --- a/app/build-logic/src/main/java/Setup.kt +++ b/app/build-logic/src/main/java/Setup.kt @@ -170,7 +170,7 @@ fun Project.setupCoreLib() { it.addGeneratedSourceDirectory(syncResources, SyncWithDir::outputFolder) } - val stubTask = tasks.getByPath(":stub:comment$variantCapped") + val stubTask = tasks.getByPath(":stub:transform${variantCapped}Apk") val syncAssets = tasks.register("sync${variantCapped}Assets", SyncWithDir::class) { outputFolder.set(layout.buildDirectory.dir("$variantName/assets")) into(outputFolder) @@ -261,20 +261,23 @@ fun Project.setupAppCommon() { androidAppComponents { onVariants { variant -> val commentTask = tasks.register( - "comment${variant.name.replaceFirstChar { it.uppercase() }}", - AddCommentTask::class.java + "transform${variant.name.replaceFirstChar { it.uppercase() }}Apk", + TransformApkTask::class.java ) val transformationRequest = variant.artifacts.use(commentTask) - .wiredWithDirectories(AddCommentTask::apkFolder, AddCommentTask::outFolder) + .wiredWithDirectories(TransformApkTask::apkFolder, TransformApkTask::outFolder) .toTransformMany(SingleArtifact.APK) val signingConfig = androidApp.buildTypes.getByName(variant.buildType!!).signingConfig commentTask.configure { this.transformationRequest = transformationRequest this.signingConfig = signingConfig - this.comment = "version=${Config.version}\n" + - "versionCode=${Config.versionCode}\n" + - "stubVersion=${Config.stubVersion}\n" this.outFolder.set(layout.buildDirectory.dir("outputs/apk/${variant.name}")) + // Always add a transformation to set comments on the APK + this.transformations.add { + it.eocdComment = ("version=${Config.version}\n" + + "versionCode=${Config.versionCode}\n" + + "stubVersion=${Config.stubVersion}\n").toByteArray() + } } } diff --git a/app/build-logic/src/main/java/Stub.kt b/app/build-logic/src/main/java/Stub.kt index d5e71580f..66d14a875 100644 --- a/app/build-logic/src/main/java/Stub.kt +++ b/app/build-logic/src/main/java/Stub.kt @@ -5,7 +5,6 @@ import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.RegularFileProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.CacheableTask -import org.gradle.api.tasks.Delete import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.OutputDirectory @@ -14,8 +13,8 @@ import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.TaskAction import org.gradle.kotlin.dsl.assign -import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.register +import org.gradle.kotlin.dsl.withType import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.File @@ -24,9 +23,7 @@ import java.security.SecureRandom import java.util.Random import java.util.zip.Deflater import java.util.zip.DeflaterOutputStream -import java.util.zip.ZipEntry import java.util.zip.ZipFile -import java.util.zip.ZipOutputStream import javax.crypto.Cipher import javax.crypto.CipherOutputStream import javax.crypto.spec.IvParameterSpec @@ -290,56 +287,37 @@ fun Project.setupStubApk() { ManifestUpdater::outputManifest) .toTransform(SingleArtifact.MERGED_MANIFEST) - val aapt = sdkComponents.aapt2.get().executable.get().asFile - val apk = layout.buildDirectory.file("intermediates/linked_resources_binary_format/" + - "${variantLowered}/process${variantCapped}Resources/" + - "linked-resources-binary-format-${variantLowered}.ap_").get().asFile - + val resTask = tasks.getByPath(":stub-res:package$variantCapped") val genResourcesTask = tasks.register("generate${variantCapped}BundledResources", TaskWithDir::class) { - dependsOn("process${variantCapped}Resources") + dependsOn(resTask) outputFolder.set(layout.buildDirectory.dir("generated/${variantLowered}/resources")) doLast { - val apkTmp = File("${apk}.tmp") - providers.exec { - commandLine(aapt, "optimize", "-o", apkTmp, "--collapse-resource-names", apk) - }.result.get() + val apk = resTask.outputs.files.asFileTree + .filter { it.name.endsWith(".apk") }.files.first() val bos = ByteArrayOutputStream() - ZipFile(apkTmp).use { src -> - ZipOutputStream(apk.outputStream()).use { - it.setLevel(Deflater.BEST_COMPRESSION) - it.putNextEntry(ZipEntry("AndroidManifest.xml")) - src.getInputStream(src.getEntry("AndroidManifest.xml")).transferTo(it) - it.closeEntry() - } + ZipFile(apk).use { src -> DeflaterOutputStream(bos, Deflater(Deflater.BEST_COMPRESSION)).use { src.getInputStream(src.getEntry("resources.arsc")).transferTo(it) } } - apkTmp.delete() genEncryptedResources(bos.toByteArray(), outputFolder.get().asFile) } } + tasks.withType(TransformApkTask::class) { + transformations.add { + // Always delete resources.arsc from the APK + // to ensure that external resources can be loaded + it.get("resources.arsc")?.delete() + } + } + variant.sources.java?.let { it.addStaticSourceDirectory(componentJavaOutDir.path) it.addGeneratedSourceDirectory(genResourcesTask, TaskWithDir::outputFolder) } } } - - // Override optimizeReleaseResources task - val apk = layout.buildDirectory.file("intermediates/linked_resources_binary_format/" + - "release/processReleaseResources/linked-resources-binary-format-release.ap_").get().asFile - val optRes = layout.buildDirectory.file("intermediates/optimized_processed_res/" + - "release/optimizeReleaseResources/resources-release-optimize.ap_").get().asFile - afterEvaluate { - tasks.named("optimizeReleaseResources") { - doLast { apk.copyTo(optRes, true) } - } - } - tasks.named("clean") { - delete.addAll(listOf("src/debug/AndroidManifest.xml", "src/release/AndroidManifest.xml")) - } } diff --git a/app/build-logic/src/main/java/AddCommentTask.kt b/app/build-logic/src/main/java/TransformApkTask.kt similarity index 88% rename from app/build-logic/src/main/java/AddCommentTask.kt rename to app/build-logic/src/main/java/TransformApkTask.kt index 76586baa6..756995b67 100644 --- a/app/build-logic/src/main/java/AddCommentTask.kt +++ b/app/build-logic/src/main/java/TransformApkTask.kt @@ -5,9 +5,11 @@ import com.android.ide.common.signing.KeystoreHelper import com.android.tools.build.apkzlib.sign.SigningExtension import com.android.tools.build.apkzlib.sign.SigningOptions import com.android.tools.build.apkzlib.zfile.ZFiles +import com.android.tools.build.apkzlib.zip.ZFile import com.android.tools.build.apkzlib.zip.ZFileOptions import org.gradle.api.DefaultTask import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles @@ -17,10 +19,7 @@ import org.gradle.api.tasks.TaskAction import java.io.File import java.util.jar.JarFile -abstract class AddCommentTask: DefaultTask() { - @get:Input - abstract val comment: Property - +abstract class TransformApkTask : DefaultTask() { @get:Input abstract val signingConfig: Property @@ -31,7 +30,10 @@ abstract class AddCommentTask: DefaultTask() { abstract val outFolder: DirectoryProperty @get:Internal - abstract val transformationRequest: Property> + abstract val transformations: ListProperty<(ZFile) -> Unit> + + @get:Internal + abstract val transformationRequest: Property> @TaskAction fun taskAction() = transformationRequest.get().submit(this) { artifact -> @@ -63,10 +65,10 @@ abstract class AddCommentTask: DefaultTask() { inFile.copyTo(outFile, overwrite = true) ZFiles.apk(outFile, options).use { SigningExtension(signingOptions).register(it) - it.eocdComment = comment.get().toByteArray() it.get(IncrementalPackager.APP_METADATA_ENTRY_PATH)?.delete() it.get(IncrementalPackager.VERSION_CONTROL_INFO_ENTRY_PATH)?.delete() it.get(JarFile.MANIFEST_NAME)?.delete() + transformations.get().forEach { transform -> transform(it) } } outFile diff --git a/app/settings.gradle.kts b/app/settings.gradle.kts index 291afebe6..ba03cf2e3 100644 --- a/app/settings.gradle.kts +++ b/app/settings.gradle.kts @@ -17,4 +17,4 @@ pluginManagement { } rootProject.name = "Magisk" -include(":apk", ":apk-ng", ":core", ":shared", ":stub", ":test") +include(":apk", ":apk-ng", ":core", ":shared", ":stub", ":stub-res", ":test") diff --git a/app/stub-res/build.gradle.kts b/app/stub-res/build.gradle.kts new file mode 100644 index 000000000..c3477dd8e --- /dev/null +++ b/app/stub-res/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + alias(libs.plugins.android.application) +} + +setupCommon() + +android { + namespace = "com.topjohnwu.magisk" + enableKotlin = false + + buildTypes { + release { + isShrinkResources = false + } + } +} diff --git a/app/stub-res/src/main/AndroidManifest.xml b/app/stub-res/src/main/AndroidManifest.xml new file mode 100644 index 000000000..6a5597bb4 --- /dev/null +++ b/app/stub-res/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/app/stub/src/main/res/values-ar/strings.xml b/app/stub-res/src/main/res/values-ar/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ar/strings.xml rename to app/stub-res/src/main/res/values-ar/strings.xml diff --git a/app/stub/src/main/res/values-ast/strings.xml b/app/stub-res/src/main/res/values-ast/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ast/strings.xml rename to app/stub-res/src/main/res/values-ast/strings.xml diff --git a/app/stub/src/main/res/values-az/strings.xml b/app/stub-res/src/main/res/values-az/strings.xml similarity index 100% rename from app/stub/src/main/res/values-az/strings.xml rename to app/stub-res/src/main/res/values-az/strings.xml diff --git a/app/stub/src/main/res/values-b+sr+Latn/strings.xml b/app/stub-res/src/main/res/values-b+sr+Latn/strings.xml similarity index 100% rename from app/stub/src/main/res/values-b+sr+Latn/strings.xml rename to app/stub-res/src/main/res/values-b+sr+Latn/strings.xml diff --git a/app/stub/src/main/res/values-be/strings.xml b/app/stub-res/src/main/res/values-be/strings.xml similarity index 100% rename from app/stub/src/main/res/values-be/strings.xml rename to app/stub-res/src/main/res/values-be/strings.xml diff --git a/app/stub/src/main/res/values-bg/strings.xml b/app/stub-res/src/main/res/values-bg/strings.xml similarity index 100% rename from app/stub/src/main/res/values-bg/strings.xml rename to app/stub-res/src/main/res/values-bg/strings.xml diff --git a/app/stub/src/main/res/values-ca/strings.xml b/app/stub-res/src/main/res/values-ca/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ca/strings.xml rename to app/stub-res/src/main/res/values-ca/strings.xml diff --git a/app/stub/src/main/res/values-cs/strings.xml b/app/stub-res/src/main/res/values-cs/strings.xml similarity index 100% rename from app/stub/src/main/res/values-cs/strings.xml rename to app/stub-res/src/main/res/values-cs/strings.xml diff --git a/app/stub/src/main/res/values-de/strings.xml b/app/stub-res/src/main/res/values-de/strings.xml similarity index 100% rename from app/stub/src/main/res/values-de/strings.xml rename to app/stub-res/src/main/res/values-de/strings.xml diff --git a/app/stub/src/main/res/values-el/strings.xml b/app/stub-res/src/main/res/values-el/strings.xml similarity index 100% rename from app/stub/src/main/res/values-el/strings.xml rename to app/stub-res/src/main/res/values-el/strings.xml diff --git a/app/stub/src/main/res/values-es/strings.xml b/app/stub-res/src/main/res/values-es/strings.xml similarity index 100% rename from app/stub/src/main/res/values-es/strings.xml rename to app/stub-res/src/main/res/values-es/strings.xml diff --git a/app/stub/src/main/res/values-et/strings.xml b/app/stub-res/src/main/res/values-et/strings.xml similarity index 100% rename from app/stub/src/main/res/values-et/strings.xml rename to app/stub-res/src/main/res/values-et/strings.xml diff --git a/app/stub/src/main/res/values-fa/strings.xml b/app/stub-res/src/main/res/values-fa/strings.xml similarity index 100% rename from app/stub/src/main/res/values-fa/strings.xml rename to app/stub-res/src/main/res/values-fa/strings.xml diff --git a/app/stub/src/main/res/values-fr/strings.xml b/app/stub-res/src/main/res/values-fr/strings.xml similarity index 100% rename from app/stub/src/main/res/values-fr/strings.xml rename to app/stub-res/src/main/res/values-fr/strings.xml diff --git a/app/stub/src/main/res/values-hi/strings.xml b/app/stub-res/src/main/res/values-hi/strings.xml similarity index 100% rename from app/stub/src/main/res/values-hi/strings.xml rename to app/stub-res/src/main/res/values-hi/strings.xml diff --git a/app/stub/src/main/res/values-hn/strings.xml b/app/stub-res/src/main/res/values-hn/strings.xml similarity index 100% rename from app/stub/src/main/res/values-hn/strings.xml rename to app/stub-res/src/main/res/values-hn/strings.xml diff --git a/app/stub/src/main/res/values-hr/strings.xml b/app/stub-res/src/main/res/values-hr/strings.xml similarity index 100% rename from app/stub/src/main/res/values-hr/strings.xml rename to app/stub-res/src/main/res/values-hr/strings.xml diff --git a/app/stub/src/main/res/values-hu/strings.xml b/app/stub-res/src/main/res/values-hu/strings.xml similarity index 100% rename from app/stub/src/main/res/values-hu/strings.xml rename to app/stub-res/src/main/res/values-hu/strings.xml diff --git a/app/stub/src/main/res/values-in/strings.xml b/app/stub-res/src/main/res/values-in/strings.xml similarity index 100% rename from app/stub/src/main/res/values-in/strings.xml rename to app/stub-res/src/main/res/values-in/strings.xml diff --git a/app/stub/src/main/res/values-it/strings.xml b/app/stub-res/src/main/res/values-it/strings.xml similarity index 100% rename from app/stub/src/main/res/values-it/strings.xml rename to app/stub-res/src/main/res/values-it/strings.xml diff --git a/app/stub/src/main/res/values-iw/strings.xml b/app/stub-res/src/main/res/values-iw/strings.xml similarity index 100% rename from app/stub/src/main/res/values-iw/strings.xml rename to app/stub-res/src/main/res/values-iw/strings.xml diff --git a/app/stub/src/main/res/values-ja/strings.xml b/app/stub-res/src/main/res/values-ja/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ja/strings.xml rename to app/stub-res/src/main/res/values-ja/strings.xml diff --git a/app/stub/src/main/res/values-ka/strings.xml b/app/stub-res/src/main/res/values-ka/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ka/strings.xml rename to app/stub-res/src/main/res/values-ka/strings.xml diff --git a/app/stub/src/main/res/values-kk/strings.xml b/app/stub-res/src/main/res/values-kk/strings.xml similarity index 100% rename from app/stub/src/main/res/values-kk/strings.xml rename to app/stub-res/src/main/res/values-kk/strings.xml diff --git a/app/stub/src/main/res/values-ko/strings.xml b/app/stub-res/src/main/res/values-ko/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ko/strings.xml rename to app/stub-res/src/main/res/values-ko/strings.xml diff --git a/app/stub/src/main/res/values-ku/strings.xml b/app/stub-res/src/main/res/values-ku/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ku/strings.xml rename to app/stub-res/src/main/res/values-ku/strings.xml diff --git a/app/stub/src/main/res/values-lt/strings.xml b/app/stub-res/src/main/res/values-lt/strings.xml similarity index 100% rename from app/stub/src/main/res/values-lt/strings.xml rename to app/stub-res/src/main/res/values-lt/strings.xml diff --git a/app/stub/src/main/res/values-mk/strings.xml b/app/stub-res/src/main/res/values-mk/strings.xml similarity index 100% rename from app/stub/src/main/res/values-mk/strings.xml rename to app/stub-res/src/main/res/values-mk/strings.xml diff --git a/app/stub/src/main/res/values-ml/strings.xml b/app/stub-res/src/main/res/values-ml/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ml/strings.xml rename to app/stub-res/src/main/res/values-ml/strings.xml diff --git a/app/stub/src/main/res/values-nb/strings.xml b/app/stub-res/src/main/res/values-nb/strings.xml similarity index 100% rename from app/stub/src/main/res/values-nb/strings.xml rename to app/stub-res/src/main/res/values-nb/strings.xml diff --git a/app/stub/src/main/res/values-nl/strings.xml b/app/stub-res/src/main/res/values-nl/strings.xml similarity index 100% rename from app/stub/src/main/res/values-nl/strings.xml rename to app/stub-res/src/main/res/values-nl/strings.xml diff --git a/app/stub/src/main/res/values-pa/strings.xml b/app/stub-res/src/main/res/values-pa/strings.xml similarity index 100% rename from app/stub/src/main/res/values-pa/strings.xml rename to app/stub-res/src/main/res/values-pa/strings.xml diff --git a/app/stub/src/main/res/values-pl/strings.xml b/app/stub-res/src/main/res/values-pl/strings.xml similarity index 100% rename from app/stub/src/main/res/values-pl/strings.xml rename to app/stub-res/src/main/res/values-pl/strings.xml diff --git a/app/stub/src/main/res/values-pt-rBR/strings.xml b/app/stub-res/src/main/res/values-pt-rBR/strings.xml similarity index 100% rename from app/stub/src/main/res/values-pt-rBR/strings.xml rename to app/stub-res/src/main/res/values-pt-rBR/strings.xml diff --git a/app/stub/src/main/res/values-pt-rPT/strings.xml b/app/stub-res/src/main/res/values-pt-rPT/strings.xml similarity index 100% rename from app/stub/src/main/res/values-pt-rPT/strings.xml rename to app/stub-res/src/main/res/values-pt-rPT/strings.xml diff --git a/app/stub/src/main/res/values-ro/strings.xml b/app/stub-res/src/main/res/values-ro/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ro/strings.xml rename to app/stub-res/src/main/res/values-ro/strings.xml diff --git a/app/stub/src/main/res/values-ru/strings.xml b/app/stub-res/src/main/res/values-ru/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ru/strings.xml rename to app/stub-res/src/main/res/values-ru/strings.xml diff --git a/app/stub/src/main/res/values-sk/strings.xml b/app/stub-res/src/main/res/values-sk/strings.xml similarity index 100% rename from app/stub/src/main/res/values-sk/strings.xml rename to app/stub-res/src/main/res/values-sk/strings.xml diff --git a/app/stub/src/main/res/values-sq/strings.xml b/app/stub-res/src/main/res/values-sq/strings.xml similarity index 100% rename from app/stub/src/main/res/values-sq/strings.xml rename to app/stub-res/src/main/res/values-sq/strings.xml diff --git a/app/stub/src/main/res/values-sr/strings.xml b/app/stub-res/src/main/res/values-sr/strings.xml similarity index 100% rename from app/stub/src/main/res/values-sr/strings.xml rename to app/stub-res/src/main/res/values-sr/strings.xml diff --git a/app/stub/src/main/res/values-sv/strings.xml b/app/stub-res/src/main/res/values-sv/strings.xml similarity index 100% rename from app/stub/src/main/res/values-sv/strings.xml rename to app/stub-res/src/main/res/values-sv/strings.xml diff --git a/app/stub/src/main/res/values-sw/strings.xml b/app/stub-res/src/main/res/values-sw/strings.xml similarity index 100% rename from app/stub/src/main/res/values-sw/strings.xml rename to app/stub-res/src/main/res/values-sw/strings.xml diff --git a/app/stub/src/main/res/values-ta/strings.xml b/app/stub-res/src/main/res/values-ta/strings.xml similarity index 100% rename from app/stub/src/main/res/values-ta/strings.xml rename to app/stub-res/src/main/res/values-ta/strings.xml diff --git a/app/stub/src/main/res/values-th/strings.xml b/app/stub-res/src/main/res/values-th/strings.xml similarity index 100% rename from app/stub/src/main/res/values-th/strings.xml rename to app/stub-res/src/main/res/values-th/strings.xml diff --git a/app/stub/src/main/res/values-tr/strings.xml b/app/stub-res/src/main/res/values-tr/strings.xml similarity index 100% rename from app/stub/src/main/res/values-tr/strings.xml rename to app/stub-res/src/main/res/values-tr/strings.xml diff --git a/app/stub/src/main/res/values-uk/strings.xml b/app/stub-res/src/main/res/values-uk/strings.xml similarity index 100% rename from app/stub/src/main/res/values-uk/strings.xml rename to app/stub-res/src/main/res/values-uk/strings.xml diff --git a/app/stub/src/main/res/values-vi/strings.xml b/app/stub-res/src/main/res/values-vi/strings.xml similarity index 100% rename from app/stub/src/main/res/values-vi/strings.xml rename to app/stub-res/src/main/res/values-vi/strings.xml diff --git a/app/stub/src/main/res/values-zh-rCN/strings.xml b/app/stub-res/src/main/res/values-zh-rCN/strings.xml similarity index 100% rename from app/stub/src/main/res/values-zh-rCN/strings.xml rename to app/stub-res/src/main/res/values-zh-rCN/strings.xml diff --git a/app/stub/src/main/res/values-zh-rTW/strings.xml b/app/stub-res/src/main/res/values-zh-rTW/strings.xml similarity index 100% rename from app/stub/src/main/res/values-zh-rTW/strings.xml rename to app/stub-res/src/main/res/values-zh-rTW/strings.xml diff --git a/app/stub/src/main/res/values/strings.xml b/app/stub-res/src/main/res/values/strings.xml similarity index 100% rename from app/stub/src/main/res/values/strings.xml rename to app/stub-res/src/main/res/values/strings.xml diff --git a/app/stub/build.gradle.kts b/app/stub/build.gradle.kts index 182bd65a8..3a41d4839 100644 --- a/app/stub/build.gradle.kts +++ b/app/stub/build.gradle.kts @@ -28,7 +28,6 @@ android { release { proguardFiles("proguard-rules.pro") isMinifyEnabled = true - isShrinkResources = false } } diff --git a/app/stub/src/main/java/com/topjohnwu/magisk/DownloadActivity.java b/app/stub/src/main/java/com/topjohnwu/magisk/DownloadActivity.java index ed619e571..58b54856d 100644 --- a/app/stub/src/main/java/com/topjohnwu/magisk/DownloadActivity.java +++ b/app/stub/src/main/java/com/topjohnwu/magisk/DownloadActivity.java @@ -3,9 +3,6 @@ package com.topjohnwu.magisk; import static android.R.string.no; import static android.R.string.ok; import static android.R.string.yes; -import static com.topjohnwu.magisk.R.string.dling; -import static com.topjohnwu.magisk.R.string.no_internet_msg; -import static com.topjohnwu.magisk.R.string.upgrade_msg; import android.app.Activity; import android.app.AlertDialog; @@ -46,14 +43,18 @@ import javax.crypto.spec.SecretKeySpec; public class DownloadActivity extends Activity { private static final String APP_NAME = "Magisk"; + private static final String RES_PKG_NAME = "com.topjohnwu.magisk"; - private Context themed; private boolean dynLoad; + private int dling; + private int no_internet_msg; + private int upgrade_msg; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - themed = new ContextThemeWrapper(this, android.R.style.Theme_DeviceDefault); + getTheme().applyStyle(android.R.style.Theme_DeviceDefault_Dialog_NoActionBar, true); // Only download and dynamic load full APK if hidden dynLoad = !getPackageName().equals(BuildConfig.APPLICATION_ID); @@ -63,6 +64,7 @@ public class DownloadActivity extends Activity { loadResources(); } catch (Exception e) { error(e); + return; } ProviderInstaller.install(this); @@ -70,7 +72,7 @@ public class DownloadActivity extends Activity { if (Networking.checkNetworkStatus(this)) { showDialog(); } else { - new AlertDialog.Builder(themed) + new AlertDialog.Builder(this) .setCancelable(false) .setTitle(APP_NAME) .setMessage(getString(no_internet_msg)) @@ -95,7 +97,7 @@ public class DownloadActivity extends Activity { } private void showDialog() { - new AlertDialog.Builder(themed) + new AlertDialog.Builder(this) .setCancelable(false) .setTitle(APP_NAME) .setMessage(getString(upgrade_msg)) @@ -105,7 +107,7 @@ public class DownloadActivity extends Activity { } private void dlAPK() { - ProgressDialog.show(themed, getString(dling), getString(dling) + " " + APP_NAME, true); + ProgressDialog.show(this, getString(dling), getString(dling) + " " + APP_NAME, true); // Download and upgrade the app var request = request(BuildConfig.APK_URL).setExecutor(AsyncTask.THREAD_POOL_EXECUTOR); if (dynLoad) { @@ -139,6 +141,7 @@ public class DownloadActivity extends Activity { } private void loadResources() throws Exception { + var res = getResources(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { var fd = Os.memfd_create("res", 0); try { @@ -147,14 +150,14 @@ public class DownloadActivity extends Activity { var loader = new ResourcesLoader(); try (var pfd = ParcelFileDescriptor.dup(fd)) { loader.addProvider(ResourcesProvider.loadFromTable(pfd, null)); - getResources().addLoaders(loader); + res.addLoaders(loader); } } finally { Os.close(fd); } } else { - File res = new File(getCodeCacheDir(), "res.apk"); - try (var out = new ZipOutputStream(new FileOutputStream(res))) { + File apk = new File(getCodeCacheDir(), "res.apk"); + try (var out = new ZipOutputStream(new FileOutputStream(apk))) { // AndroidManifest.xml is required on Android 6-, and directory support is broken on Android 9-10 out.putNextEntry(new ZipEntry("AndroidManifest.xml")); try (var stubApk = new ZipFile(getPackageCodePath())) { @@ -163,7 +166,10 @@ public class DownloadActivity extends Activity { out.putNextEntry(new ZipEntry("resources.arsc")); decryptResources(out); } - StubApk.addAssetPath(getResources(), res.getPath()); + StubApk.addAssetPath(res, apk.getPath()); } + dling = res.getIdentifier("dling", "string", RES_PKG_NAME); + no_internet_msg = res.getIdentifier("no_internet_msg", "string", RES_PKG_NAME); + upgrade_msg = res.getIdentifier("upgrade_msg", "string", RES_PKG_NAME); } }