From f8888b81e84e1d724861b6054a0e10671a041f44 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Fri, 21 Oct 2022 15:24:16 +0800 Subject: [PATCH] Support bootstrapping loader dynamically for local mode (#118) --- appstub/proguard-rules.pro | 4 - appstub/src/main/AndroidManifest.xml | 5 - .../appstub/LSPAppComponentFactoryStub.java | 43 ------- build.gradle.kts | 2 +- {appstub => jar}/.gitignore | 0 {patch-jar => jar}/build.gradle.kts | 4 +- {patch-jar => jar}/src/main/assets/keystore | Bin manager/build.gradle.kts | 6 +- .../java/org/lsposed/lspatch/Constants.kt | 6 - .../main/java/org/lsposed/lspatch/Patcher.kt | 6 +- .../lspatch/ui/page/manage/AppManagePage.kt | 42 ++++--- .../lsposed/lspatch/util/LSPPackageManager.kt | 4 +- manager/src/main/res/values/strings.xml | 1 + {patch-jar => meta-loader}/.gitignore | 0 {appstub => meta-loader}/build.gradle.kts | 5 +- meta-loader/proguard-rules.pro | 4 + meta-loader/src/main/AndroidManifest.xml | 2 + .../LSPAppComponentFactoryStub.java | 105 ++++++++++++++++++ patch-loader/build.gradle.kts | 6 +- .../src/main/jni/src/patch_loader.cpp | 2 +- .../main/java/org/lsposed/patch/LSPatch.java | 21 ++-- settings.gradle.kts | 4 +- .../org/lsposed/lspatch/share/Constants.java | 8 +- 23 files changed, 176 insertions(+), 104 deletions(-) delete mode 100644 appstub/proguard-rules.pro delete mode 100644 appstub/src/main/AndroidManifest.xml delete mode 100644 appstub/src/main/java/org/lsposed/lspatch/appstub/LSPAppComponentFactoryStub.java rename {appstub => jar}/.gitignore (100%) rename {patch-jar => jar}/build.gradle.kts (93%) rename {patch-jar => jar}/src/main/assets/keystore (100%) delete mode 100644 manager/src/main/java/org/lsposed/lspatch/Constants.kt rename {patch-jar => meta-loader}/.gitignore (100%) rename {appstub => meta-loader}/build.gradle.kts (87%) create mode 100644 meta-loader/proguard-rules.pro create mode 100644 meta-loader/src/main/AndroidManifest.xml create mode 100644 meta-loader/src/main/java/org/lsposed/lspatch/metaloader/LSPAppComponentFactoryStub.java diff --git a/appstub/proguard-rules.pro b/appstub/proguard-rules.pro deleted file mode 100644 index 7f40236..0000000 --- a/appstub/proguard-rules.pro +++ /dev/null @@ -1,4 +0,0 @@ --keep class org.lsposed.lspatch.appstub.LSPAppComponentFactoryStub { - public static byte[] dex; - (); -} diff --git a/appstub/src/main/AndroidManifest.xml b/appstub/src/main/AndroidManifest.xml deleted file mode 100644 index 53b1155..0000000 --- a/appstub/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPAppComponentFactoryStub.java b/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPAppComponentFactoryStub.java deleted file mode 100644 index fe79cfd..0000000 --- a/appstub/src/main/java/org/lsposed/lspatch/appstub/LSPAppComponentFactoryStub.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.lsposed.lspatch.appstub; - -import android.annotation.SuppressLint; -import android.app.AppComponentFactory; -import android.util.Log; - -import java.io.ByteArrayOutputStream; -import java.lang.reflect.Method; -import java.util.Objects; - -@SuppressLint("UnsafeDynamicallyLoadedCode") -public class LSPAppComponentFactoryStub extends AppComponentFactory { - public static byte[] dex = null; - - static { - var cl = Objects.requireNonNull(LSPAppComponentFactoryStub.class.getClassLoader()); - try (var is = cl.getResourceAsStream("assets/lspatch/lsp.dex"); - var os = new ByteArrayOutputStream()) { - byte[] buffer = new byte[8192]; - int n; - while (-1 != (n = is.read(buffer))) { - os.write(buffer, 0, n); - } - dex = os.toByteArray(); - } catch (Throwable e) { - Log.e("LSPatch", "load dex error", e); - } - - try { - Class VMRuntime = Class.forName("dalvik.system.VMRuntime"); - Method getRuntime = VMRuntime.getDeclaredMethod("getRuntime"); - getRuntime.setAccessible(true); - Method vmInstructionSet = VMRuntime.getDeclaredMethod("vmInstructionSet"); - vmInstructionSet.setAccessible(true); - - String arch = (String) vmInstructionSet.invoke(getRuntime.invoke(null)); - String path = cl.getResource("assets/lspatch/so/" + arch + "/liblspatch.so").getPath().substring(5); - System.load(path); - } catch (Throwable e) { - throw new ExceptionInInitializerError(e); - } - } -} diff --git a/build.gradle.kts b/build.gradle.kts index 7748159..c3bf79a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -58,7 +58,7 @@ tasks.register("clean") { listOf("Debug", "Release").forEach { variant -> tasks.register("build$variant") { description = "Build LSPatch with $variant" - dependsOn(projects.patchJar.dependencyProject.tasks["build$variant"]) + dependsOn(projects.jar.dependencyProject.tasks["build$variant"]) dependsOn(projects.manager.dependencyProject.tasks["build$variant"]) } } diff --git a/appstub/.gitignore b/jar/.gitignore similarity index 100% rename from appstub/.gitignore rename to jar/.gitignore diff --git a/patch-jar/build.gradle.kts b/jar/build.gradle.kts similarity index 93% rename from patch-jar/build.gradle.kts rename to jar/build.gradle.kts index 2a7b37e..ced4dee 100644 --- a/patch-jar/build.gradle.kts +++ b/jar/build.gradle.kts @@ -34,13 +34,13 @@ fun Jar.configure(variant: String) { } tasks.register("buildDebug") { - dependsOn(":appstub:copyDebug") + dependsOn(":meta-loader:copyDebug") dependsOn(":patch-loader:copyDebug") configure("debug") } tasks.register("buildRelease") { - dependsOn(":appstub:copyRelease") + dependsOn(":meta-loader:copyRelease") dependsOn(":patch-loader:copyRelease") configure("release") } diff --git a/patch-jar/src/main/assets/keystore b/jar/src/main/assets/keystore similarity index 100% rename from patch-jar/src/main/assets/keystore rename to jar/src/main/assets/keystore diff --git a/manager/build.gradle.kts b/manager/build.gradle.kts index 9d58033..5d7525a 100644 --- a/manager/build.gradle.kts +++ b/manager/build.gradle.kts @@ -18,6 +18,10 @@ android { applicationId = defaultManagerPackageName } + androidResources { + noCompress.add(".so") + } + buildTypes { debug { isMinifyEnabled = true @@ -58,7 +62,7 @@ afterEvaluate { val variantCapped = variant.name.capitalize() task("copy${variantCapped}Assets") { - dependsOn(":appstub:copy$variantCapped") + dependsOn(":meta-loader:copy$variantCapped") dependsOn(":patch-loader:copy$variantCapped") tasks["merge${variantCapped}Assets"].dependsOn(this) diff --git a/manager/src/main/java/org/lsposed/lspatch/Constants.kt b/manager/src/main/java/org/lsposed/lspatch/Constants.kt deleted file mode 100644 index 6223a36..0000000 --- a/manager/src/main/java/org/lsposed/lspatch/Constants.kt +++ /dev/null @@ -1,6 +0,0 @@ -package org.lsposed.lspatch - -object Constants { - - const val PATCH_FILE_SUFFIX = "-lspatched.apk" -} diff --git a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt index 953f884..1bf2d64 100644 --- a/manager/src/main/java/org/lsposed/lspatch/Patcher.kt +++ b/manager/src/main/java/org/lsposed/lspatch/Patcher.kt @@ -4,9 +4,9 @@ import androidx.core.net.toUri import androidx.documentfile.provider.DocumentFile import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.lsposed.lspatch.Constants.PATCH_FILE_SUFFIX import org.lsposed.lspatch.config.Configs import org.lsposed.lspatch.config.MyKeyStore +import org.lsposed.lspatch.share.Constants import org.lsposed.lspatch.share.PatchConfig import org.lsposed.patch.LSPatch import org.lsposed.patch.util.Logger @@ -47,10 +47,10 @@ object Patcher { val root = DocumentFile.fromTreeUri(lspApp, uri) ?: throw IOException("DocumentFile is null") root.listFiles().forEach { - if (it.name?.endsWith(PATCH_FILE_SUFFIX) == true) it.delete() + if (it.name?.endsWith(Constants.PATCH_FILE_SUFFIX) == true) it.delete() } lspApp.tmpApkDir.walk() - .filter { it.name.endsWith(PATCH_FILE_SUFFIX) } + .filter { it.name.endsWith(Constants.PATCH_FILE_SUFFIX) } .forEach { apk -> val file = root.createFile("application/vnd.android.package-archive", apk.name) ?: throw IOException("Failed to create output file") diff --git a/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt b/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt index 181bde0..0a14311 100644 --- a/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt +++ b/manager/src/main/java/org/lsposed/lspatch/ui/page/manage/AppManagePage.kt @@ -14,12 +14,14 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.KeyboardCapslock import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle @@ -41,6 +43,7 @@ import org.lsposed.lspatch.config.ConfigManager import org.lsposed.lspatch.config.Configs import org.lsposed.lspatch.database.entity.Module import org.lsposed.lspatch.lspApp +import org.lsposed.lspatch.share.Constants import org.lsposed.lspatch.share.LSPConfig import org.lsposed.lspatch.ui.component.AnywhereDropdown import org.lsposed.lspatch.ui.component.AppItem @@ -136,6 +139,8 @@ fun AppManageBody( items = viewModel.appList, key = { it.first.app.packageName } ) { + val isRolling = it.second.useManager && it.second.lspConfig.VERSION_CODE >= Constants.MIN_ROLLING_VERSION_CODE + val canUpdateLoader = !isRolling && it.second.lspConfig.VERSION_CODE < LSPConfig.instance.VERSION_CODE var expanded by remember { mutableStateOf(false) } AnywhereDropdown( expanded = expanded, @@ -148,19 +153,28 @@ fun AppManageBody( label = it.first.label, packageName = it.first.app.packageName, additionalContent = { - Text( - text = buildAnnotatedString { - val (text, color) = - if (it.second.useManager) stringResource(R.string.patch_local) to MaterialTheme.colorScheme.secondary - else stringResource(R.string.patch_portable) to MaterialTheme.colorScheme.tertiary - append(AnnotatedString(text, SpanStyle(color = color))) - append(" ") - append(it.second.lspConfig.VERSION_CODE.toString()) - }, - fontWeight = FontWeight.SemiBold, - fontFamily = FontFamily.Serif, - style = MaterialTheme.typography.bodySmall - ) + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = buildAnnotatedString { + val (text, color) = + if (it.second.useManager) stringResource(R.string.patch_local) to MaterialTheme.colorScheme.secondary + else stringResource(R.string.patch_portable) to MaterialTheme.colorScheme.tertiary + append(AnnotatedString(text, SpanStyle(color = color))) + append(" ") + if (isRolling) append(stringResource(R.string.manage_rolling)) + else append(it.second.lspConfig.VERSION_CODE.toString()) + }, + fontWeight = FontWeight.SemiBold, + fontFamily = FontFamily.Serif, + style = MaterialTheme.typography.bodySmall + ) + if (canUpdateLoader) { + with(LocalDensity.current) { + val size = MaterialTheme.typography.bodySmall.fontSize * 1.2 + Icon(Icons.Filled.KeyboardCapslock, null, Modifier.size(size.toDp())) + } + } + } } ) } @@ -170,7 +184,7 @@ fun AppManageBody( onClick = {}, enabled = false ) val shizukuUnavailable = stringResource(R.string.shizuku_unavailable) - if (it.second.lspConfig.VERSION_CODE < LSPConfig.instance.VERSION_CODE || BuildConfig.DEBUG) { + if (canUpdateLoader || BuildConfig.DEBUG) { DropdownMenuItem( text = { Text(stringResource(R.string.manage_update_loader)) }, onClick = { diff --git a/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt b/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt index 5c713ba..4daccb5 100644 --- a/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt +++ b/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt @@ -20,10 +20,10 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize import me.zhanghai.android.appiconloader.AppIconLoader -import org.lsposed.lspatch.Constants.PATCH_FILE_SUFFIX import org.lsposed.lspatch.config.ConfigManager import org.lsposed.lspatch.config.Configs import org.lsposed.lspatch.lspApp +import org.lsposed.lspatch.share.Constants import java.io.File import java.io.IOException import java.text.Collator @@ -91,7 +91,7 @@ object LSPPackageManager { val uri = Configs.storageDirectory?.toUri() ?: throw IOException("Uri is null") val root = DocumentFile.fromTreeUri(lspApp, uri) ?: throw IOException("DocumentFile is null") root.listFiles().forEach { file -> - if (file.name?.endsWith(PATCH_FILE_SUFFIX) != true) return@forEach + if (file.name?.endsWith(Constants.PATCH_FILE_SUFFIX) != true) return@forEach Log.d(TAG, "Add ${file.name}") val input = lspApp.contentResolver.openInputStream(file.uri) ?: throw IOException("Cannot open input stream") diff --git a/manager/src/main/res/values/strings.xml b/manager/src/main/res/values/strings.xml index 09cb08c..d71ae10 100644 --- a/manager/src/main/res/values/strings.xml +++ b/manager/src/main/res/values/strings.xml @@ -29,6 +29,7 @@ Manage Loading No patched apps yet + Rolling Update loader Update successfully Update failed diff --git a/patch-jar/.gitignore b/meta-loader/.gitignore similarity index 100% rename from patch-jar/.gitignore rename to meta-loader/.gitignore diff --git a/appstub/build.gradle.kts b/meta-loader/build.gradle.kts similarity index 87% rename from appstub/build.gradle.kts rename to meta-loader/build.gradle.kts index b60f211..0af01bb 100644 --- a/appstub/build.gradle.kts +++ b/meta-loader/build.gradle.kts @@ -26,8 +26,8 @@ androidComponents.onVariants { variant -> "$buildDir/intermediates/dex/$variantLowered/minify${variantCapped}WithR8" else "$buildDir/intermediates/dex/$variantLowered/mergeDex$variantCapped" from(dexOutPath) - rename("classes.dex", "loader.dex") - into("${rootProject.projectDir}/out/assets/dex") + rename("classes.dex", "metaloader.dex") + into("${rootProject.projectDir}/out/assets/lspatch") } task("copy$variantCapped") { @@ -41,4 +41,5 @@ androidComponents.onVariants { variant -> dependencies { compileOnly(projects.hiddenapi.stubs) + implementation(projects.share.java) } diff --git a/meta-loader/proguard-rules.pro b/meta-loader/proguard-rules.pro new file mode 100644 index 0000000..ba99067 --- /dev/null +++ b/meta-loader/proguard-rules.pro @@ -0,0 +1,4 @@ +-keep class org.lsposed.lspatch.metaloader.LSPAppComponentFactoryStub { + public static byte[] dex; + (); +} diff --git a/meta-loader/src/main/AndroidManifest.xml b/meta-loader/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c00f1ef --- /dev/null +++ b/meta-loader/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/meta-loader/src/main/java/org/lsposed/lspatch/metaloader/LSPAppComponentFactoryStub.java b/meta-loader/src/main/java/org/lsposed/lspatch/metaloader/LSPAppComponentFactoryStub.java new file mode 100644 index 0000000..6ee8c0a --- /dev/null +++ b/meta-loader/src/main/java/org/lsposed/lspatch/metaloader/LSPAppComponentFactoryStub.java @@ -0,0 +1,105 @@ +package org.lsposed.lspatch.metaloader; + +import android.annotation.SuppressLint; +import android.app.AppComponentFactory; +import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; +import android.os.Build; +import android.os.ServiceManager; +import android.util.JsonReader; +import android.util.Log; + +import org.lsposed.lspatch.share.Constants; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Objects; +import java.util.zip.ZipFile; + +@SuppressLint("UnsafeDynamicallyLoadedCode") +public class LSPAppComponentFactoryStub extends AppComponentFactory { + + private static final String TAG = "LSPatch-MetaLoader"; + private static final Map archToLib = Map.of( + "arm", "armeabi-v7a", + "arm64", "arm64-v8a", + "x86", "x86", + "x86_64", "x86_64" + ); + + public static byte[] dex; + + static { + try { + var cl = Objects.requireNonNull(LSPAppComponentFactoryStub.class.getClassLoader()); + Class VMRuntime = Class.forName("dalvik.system.VMRuntime"); + Method getRuntime = VMRuntime.getDeclaredMethod("getRuntime"); + getRuntime.setAccessible(true); + Method vmInstructionSet = VMRuntime.getDeclaredMethod("vmInstructionSet"); + vmInstructionSet.setAccessible(true); + String arch = (String) vmInstructionSet.invoke(getRuntime.invoke(null)); + String libName = archToLib.get(arch); + + boolean useManager = false; + String soPath; + + try (var is = cl.getResourceAsStream(Constants.CONFIG_ASSET_PATH); + var reader = new JsonReader(new InputStreamReader(is))) { + reader.beginObject(); + while (reader.hasNext()) { + var name = reader.nextName(); + if (name.equals("useManager")) { + useManager = reader.nextBoolean(); + break; + } else { + reader.skipValue(); + } + } + } + + if (useManager) { + Log.i(TAG, "Bootstrap loader from manager"); + var ipm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + ApplicationInfo manager; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + manager = ipm.getApplicationInfo(Constants.MANAGER_PACKAGE_NAME, 0L, 0); + } else { + manager = ipm.getApplicationInfo(Constants.MANAGER_PACKAGE_NAME, 0, 0); + } + try (var zip = new ZipFile(new File(manager.sourceDir)); + var is = zip.getInputStream(zip.getEntry(Constants.LOADER_DEX_ASSET_PATH)); + var os = new ByteArrayOutputStream()) { + transfer(is, os); + dex = os.toByteArray(); + } + soPath = manager.sourceDir + "!/assets/lspatch/so/" + libName + "/liblspatch.so"; + } else { + Log.i(TAG, "Bootstrap loader from embedment"); + try (var is = cl.getResourceAsStream(Constants.LOADER_DEX_ASSET_PATH); + var os = new ByteArrayOutputStream()) { + transfer(is, os); + dex = os.toByteArray(); + } + soPath = cl.getResource("assets/lspatch/so/" + libName + "/liblspatch.so").getPath().substring(5); + } + + System.load(soPath); + } catch (Throwable e) { + throw new ExceptionInInitializerError(e); + } + } + + private static void transfer(InputStream is, OutputStream os) throws IOException { + byte[] buffer = new byte[8192]; + int n; + while (-1 != (n = is.read(buffer))) { + os.write(buffer, 0, n); + } + } +} diff --git a/patch-loader/build.gradle.kts b/patch-loader/build.gradle.kts index 9e723cb..73afef8 100644 --- a/patch-loader/build.gradle.kts +++ b/patch-loader/build.gradle.kts @@ -27,8 +27,8 @@ androidComponents.onVariants { variant -> task("copyDex$variantCapped") { dependsOn("assemble$variantCapped") from("$buildDir/intermediates/dex/${variant.name}/mergeDex$variantCapped/classes.dex") - rename("classes.dex", "lsp.dex") - into("${rootProject.projectDir}/out/assets/dex") + rename("classes.dex", "loader.dex") + into("${rootProject.projectDir}/out/assets/lspatch") } task("copySo$variantCapped") { @@ -39,7 +39,7 @@ androidComponents.onVariants { variant -> "include" to listOf("**/liblspatch.so") ) ) - into("${rootProject.projectDir}/out/assets/so") + into("${rootProject.projectDir}/out/assets/lspatch/so") } task("copy$variantCapped") { diff --git a/patch-loader/src/main/jni/src/patch_loader.cpp b/patch-loader/src/main/jni/src/patch_loader.cpp index 3937651..f4d515f 100644 --- a/patch-loader/src/main/jni/src/patch_loader.cpp +++ b/patch-loader/src/main/jni/src/patch_loader.cpp @@ -108,7 +108,7 @@ namespace lspd { }, }; - auto stub = JNI_FindClass(env, "org/lsposed/lspatch/appstub/LSPAppComponentFactoryStub"); + auto stub = JNI_FindClass(env, "org/lsposed/lspatch/metaloader/LSPAppComponentFactoryStub"); auto dex_field = JNI_GetStaticFieldID(env, stub, "dex", "[B"); ScopedLocalRef array = JNI_GetStaticObjectField(env, stub, dex_field); diff --git a/patch/src/main/java/org/lsposed/patch/LSPatch.java b/patch/src/main/java/org/lsposed/patch/LSPatch.java index df37857..b9a3c0a 100644 --- a/patch/src/main/java/org/lsposed/patch/LSPatch.java +++ b/patch/src/main/java/org/lsposed/patch/LSPatch.java @@ -1,7 +1,7 @@ package org.lsposed.patch; import static org.lsposed.lspatch.share.Constants.CONFIG_ASSET_PATH; -import static org.lsposed.lspatch.share.Constants.DEX_ASSET_PATH; +import static org.lsposed.lspatch.share.Constants.LOADER_DEX_ASSET_PATH; import static org.lsposed.lspatch.share.Constants.ORIGINAL_APK_ASSET_PATH; import static org.lsposed.lspatch.share.Constants.PROXY_APP_COMPONENT_FACTORY; @@ -21,6 +21,7 @@ import com.wind.meditor.property.ModificationProperty; import com.wind.meditor.utils.NodeValue; import org.apache.commons.io.FilenameUtils; +import org.lsposed.lspatch.share.Constants; import org.lsposed.lspatch.share.LSPConfig; import org.lsposed.lspatch.share.PatchConfig; import org.lsposed.patch.util.ApkSignatureHelper; @@ -98,12 +99,6 @@ public class LSPatch { "x86", "x86_64" )); - private static final HashSet APK_LIB_PATH_ARRAY = new HashSet<>(Arrays.asList( - "arm", - "arm64", - "x86", - "x86_64" - )); private static final ZFileOptions Z_FILE_OPTIONS = new ZFileOptions().setAlignmentRule(AlignmentRules.compose( AlignmentRules.constantForSuffix(".so", 4096), @@ -244,10 +239,10 @@ public class LSPatch { logger.d("Adding native lib.."); // copy so and dex files into the unzipped apk - // do not put liblspd.so into apk!lib because x86 native bridge causes crash - for (String arch : APK_LIB_PATH_ARRAY) { + // do not put liblspatch.so into apk!lib because x86 native bridge causes crash + for (String arch : ARCHES) { String entryName = "assets/lspatch/so/" + arch + "/liblspatch.so"; - try (var is = getClass().getClassLoader().getResourceAsStream("assets/so/" + (arch.equals("arm") ? "armeabi-v7a" : (arch.equals("arm64") ? "arm64-v8a" : arch)) + "/liblspatch.so")) { + try (var is = getClass().getClassLoader().getResourceAsStream(entryName)) { dstZFile.add(entryName, is, false); // no compress for so } catch (Throwable e) { // More exception info @@ -258,14 +253,14 @@ public class LSPatch { logger.d("Adding dex.."); - try (var is = getClass().getClassLoader().getResourceAsStream("assets/dex/loader.dex")) { + try (var is = getClass().getClassLoader().getResourceAsStream(Constants.META_LOADER_DEX_ASSET_PATH)) { dstZFile.add("classes.dex", is); } catch (Throwable e) { throw new PatchError("Error when adding dex", e); } - try (var is = getClass().getClassLoader().getResourceAsStream("assets/dex/lsp.dex")) { - dstZFile.add(DEX_ASSET_PATH, is); + try (var is = getClass().getClassLoader().getResourceAsStream(LOADER_DEX_ASSET_PATH)) { + dstZFile.add(LOADER_DEX_ASSET_PATH, is); } catch (Throwable e) { throw new PatchError("Error when adding assets", e); } diff --git a/settings.gradle.kts b/settings.gradle.kts index c562573..1ee2288 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,14 +26,14 @@ dependencyResolutionManagement { rootProject.name = "LSPatch" include( ":apkzlib", - ":appstub", ":axmlprinter", ":core", ":hiddenapi:bridge", ":hiddenapi:stubs", + ":jar", ":manager", + ":meta-loader", ":patch", - ":patch-jar", ":patch-loader", ":services:daemon-service", ":services:manager-service", diff --git a/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java b/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java index ed01f8d..79ff1cd 100644 --- a/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java +++ b/share/java/src/main/java/org/lsposed/lspatch/share/Constants.java @@ -2,12 +2,16 @@ package org.lsposed.lspatch.share; public class Constants { - final static public String DEX_ASSET_PATH = "assets/lspatch/lsp.dex"; final static public String CONFIG_ASSET_PATH = "assets/lspatch/config.json"; + final static public String LOADER_DEX_ASSET_PATH = "assets/lspatch/loader.dex"; + final static public String META_LOADER_DEX_ASSET_PATH = "assets/lspatch/metaloader.dex"; final static public String ORIGINAL_APK_ASSET_PATH = "assets/lspatch/origin.apk"; - final static public String PROXY_APP_COMPONENT_FACTORY = "org.lsposed.lspatch.appstub.LSPAppComponentFactoryStub"; + final static public String PATCH_FILE_SUFFIX = "-lspatched.apk"; + final static public String PROXY_APP_COMPONENT_FACTORY = "org.lsposed.lspatch.metaloader.LSPAppComponentFactoryStub"; final static public String MANAGER_PACKAGE_NAME = "org.lsposed.lspatch"; + final static public int MIN_ROLLING_VERSION_CODE = 341; + final static public int SIGBYPASS_LV_DISABLE = 0; final static public int SIGBYPASS_LV_PM = 1; final static public int SIGBYPASS_LV_PM_OPENAT = 2;