с использованием Byte Buddy Android: официальная ссылка, никогда раньше не использовалась.
есть ли какое-нибудь руководство по этому поводу?
код использует AndroidClassLoadingStrategy.Wrapping, который генерирует файл . dex в доступном для записи месте, обычно в личном каталоге вашего приложения (например, /data/data/), и пытается его выполнить.
В Android 10 и более поздних версиях применяются строгие политики безопасности, чтобы приложения не могли записывать .dex. или .jar-файлы и выполнение их во время выполнения.
как мы можем использовать byte Buddy Android для последних версий Android?
private fun runBuddyTest(context: Context) {
val strategy = AndroidClassLoadingStrategy.Wrapping(applicationContext.getDir("generated", Context.MODE_PRIVATE))
// Create a dynamic type (subclass of Object) and modify the "toString" method
val dynamicType = ByteBuddy()
.subclass(Any::class.java)
.method(ElementMatchers.named("toString"))
.intercept(FixedValue.value("Hello World!"))
.make()
.load(this.javaClass.classLoader, strategy)
.loaded
// Instantiate the dynamically created class and assert the "toString" method
val instance = dynamicType.getDeclaredConstructor().newInstance()
assert(instance.toString() == "Hello World!")
}
появляется эта ошибка
FATAL EXCEPTION: main
Process: com.rnadigital.bytebuddyapplication, PID: 12815
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rnadigital.bytebuddyapplication/com.rnadigital.bytebuddyapplication.MainActivity}: java.lang.SecurityException: Writable dex file '/data/user/0/com.rnadigital.bytebuddyapplication/app_generated/d7rUqolH.jar' is not allowed.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3782)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: java.lang.SecurityException: W r i t a b l e d e x f i l e ' / d a t a / u s e r / 0 / c o m . r n a d i g i t a l . b y t e b u d d y a p p l i c a t i o n / a p p _ g e n e r a t e d / d 7 r U q o l H . j a r ' i s n o t a l l o w e d . < b r / > a t d a l v i k . s y s t e m . D e x F i l e . o p e n D e x F i l e N a t i v e ( N a t i v e M e t h o d ) < b r / > a t d a l v i k . s y s t e m . D e x F i l e . o p e n D e x F i l e ( D e x F i l e . j a v a : 4 0 6 ) < b r / > a t d a l v i k . s y s t e m . D e x F i l e . & l t ; i n i t & g t ; ( D e x F i l e . j a v a : 1 2 8 ) < b r / > a t d a l v i k . s y s t e m . D e x F i l e . & l t ; init>(DexFile.java:101)
at dalvik.system.DexPathList.loadDexFile(DexPathList.java:438)
at dalvik.system.DexPathList.makeDexElements(DexPathList.java:397)
at dalvik.system.DexPathList.(DexPathList.java:166)
at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:160)
at dalvik.system.BaseDexClassLoader.(BaseDexClassLoader.java:105)
at dalvik.system.DexClassLoader.(DexClassLoader.java:55)
at net.bytebuddy.android.AndroidClassLoadingStrategy$Wrapping.doLoad(AndroidClassLoadingStrategy.java:580)
at net.bytebuddy.android.AndroidClassLoadingStrategy.load(AndroidClassLoadingStrategy.java:148)
at net.bytebuddy.dynamic.TypeResolutionStrategy$Passive.initialize(TypeResolutionStrategy.java:101)
at net.bytebuddy.dynamic.DynamicType$Default$Unloaded.load(DynamicType.java:6317)
at com.rnadigital.bytebuddyapplication.MainActivity.generateDynamicClassInMemory(MainActivity.kt:79)
at com.rnadigital.bytebuddyapplication.MainActivity.onCreate(MainActivity.kt:52)
at android.app.Activity.performCreate(Activity.java:8595)
at android.app.Activity.performCreate(Activity.java:8573)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1456)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3764)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3922)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
это файл Gradle
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
}
android {
namespace = "com.rnadigital.bytebuddyapplication"
compileSdk = 34
defaultConfig {
applicationId = "com.rnadigital.bytebuddyapplication"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
multiDexEnabled = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
androidTestImplementation(platform(libs.androidx.compose.bom))
androidTestImplementation(libs.androidx.ui.test.junit4)
debugImplementation(libs.androidx.ui.tooling)
debugImplementation(libs.androidx.ui.test.manifest)
// implementation (libs.byte.buddy)
implementation (libs.byte.buddy.android)
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... yexception
Android Byte-Buddy выдает ошибки на Android 14 java.lang.SecurityException: файл dex с возможностью записи не разрешен ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение