diff --git a/projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ImplLoader.java b/projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ImplLoader.java index 02ea1190c..b73c80c34 100644 --- a/projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ImplLoader.java +++ b/projects/sdk/dynamic/dynamic-apk/src/main/java/com/tencent/shadow/dynamic/apk/ImplLoader.java @@ -18,9 +18,13 @@ package com.tencent.shadow.dynamic.apk; +import android.os.Build; + import com.tencent.shadow.core.common.InstalledApk; +import java.io.File; import java.lang.reflect.Field; +import java.util.Objects; import dalvik.system.DexClassLoader; @@ -35,6 +39,7 @@ public String[] loadWhiteList(InstalledApk installedApk) { } public String[] loadWhiteList(InstalledApk installedApk, String whiteListClassName, String whiteListFieldName) { + checkDexReadOnly(installedApk); DexClassLoader dexClassLoader = new DexClassLoader( installedApk.apkFilePath, installedApk.oDexPath, @@ -72,4 +77,13 @@ private static String[] concatenate(String[] a, String[] b) { System.arraycopy(b, 0, c, aLen, bLen); return c; } + + private static void checkDexReadOnly(InstalledApk installedApk) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) { + boolean readOnly = new File(Objects.requireNonNull(installedApk.apkFilePath)).setReadOnly(); + if (!readOnly) { + throw new RuntimeException("apk file is not read only"); + } + } + } }