运行 另一个应用程序后 DexClassLoader 工作不稳定
DexClassLoader works unstable after run another application
我有一个与 apk-plugin 链接的工作代码。
我在 android 模拟器上 运行 另一个应用程序后,此代码停止工作。
DexClassLoader 不再找到 apk 文件。
How it looks
loadClass 开始掉落到带有文本的异常:
未找到 class“com.example.testandlib.Testt”
请帮助了解 运行 在 android 模拟器上使用另一个应用程序可能会导致什么问题。
重启模拟器没有效果。
还清理项目。
插件代码:
package com.example.testandlib
import android.util.Log
class Testt {
fun plus(a: Int,b: Int): Int {
return a + b - 2
}
fun minus(a: Int, b: Int): Int {
return a - b - 2
}
fun stringBoolHello(a: String, b: Boolean): String {
if (b)
return "Trully Hello, " + a
return "Hello, " + a
}
fun arrayHello(a: MutableList<String>): String {
var res = ""
var iter = a.iterator()
iter.forEach { res += it+";" }
return "Hello, " + res
}
fun originalArrayHello(a: Array<String>): String {
var res = ""
for ((index, value) in a.withIndex()) {
res += value+index.toString()+";"
}
return "Hello, " + res
}
}
部分主要应用程序代码:
val cont = getApplicationContext()
val apkPath = "/data/data/com.example.pozitivmobile/tmp/app-debug.apk"
val cachePath = getDir("dex",0).absolutePath
val classLoaderr = DexClassLoader(
apkPath,
cachePath,
null,
classLoader
)
try {
val curClass = classLoaderr.loadClass("com.example.testandlib.Testt")
val curObj = curClass.newInstance()
val methodParams = arrayOf(Int.javaClass)
val plusMethod = curClass.getMethod("plus", Int::class.java, Int::class.java)
val minusMethod = curClass.getMethod("minus", Int::class.java, Int::class.java)
val stringBoolHelloMethod = curClass.getMethod("stringBoolHello", String::class.java, Boolean::class.java )
val arrayHelloMethod = curClass.getMethod("arrayHello", MutableList::class.java )
val originalArrayHelloMethod = curClass.getMethod("originalArrayHello", Array<String>::class.java )
val plusResult = plusMethod.invoke(curObj,25,35)
val minusResult = minusMethod.invoke(curObj,35,45)
val stringBoolHelloResult1 = stringBoolHelloMethod.invoke(curObj,"Dmitry",true)
val stringBoolHelloResult2 = stringBoolHelloMethod.invoke(curObj,"Dmitry",false)
val paramHelloArray = mutableListOf<String>()
paramHelloArray.add("odin")
paramHelloArray.add("dva")
paramHelloArray.add("tri")
val arrayHelloResult = arrayHelloMethod.invoke(curObj,paramHelloArray)
val paramOriginalHelloArray = arrayOf("odinn","dvaa","trii")
val OriginalArrayHelloResult = originalArrayHelloMethod.invoke(curObj,paramOriginalHelloArray)
} catch (e: Exception){
Log.d("loadClass",e.message.toString() )
}
编辑:
我换行
val cachePath = getDir("dex",0).absolutePath
到
val cachePath = cont.cacheDir.absolutePath.toString()
现在我的代码可以正常工作了。
然后我return这条线回来
val cachePath = getDir("dex",0).absolutePath
而且我的代码仍然有效!海森堡?
执行这些操作后错误消失:
转到 adb shell
进入超级用户模式(使用 su 命令)
执行此命令:
chmod 777 /data/data/com.example.pozitivmobile/plugins/app-debug.apk
chmod 777 /data/data/com.示例.pozitivmobile/plugins
chmod 777 /data/data/com.example.pozitivmobile
chmod 777 /data/data
chmod 777 /数据
清理项目
运行 再次项目
在此之后,应用程序可以使用插件,但我不能再更改模拟器存储中的 app-debug.apk 文件(权限被拒绝)。为此,我需要将 apk 文件上传到目录:
/storage/emulated/0/Download/app-debug.apk
然后使用命令将其复制到超级用户 adb shell 中的应用程序目录:
cp /storage/emulated/0/Download/app-debug.apk /data/data/com.example.pozitivmobile/plugins/
所有这一切之后,应用程序正在使用 apk 插件,即使在主应用程序 运行ning 期间更改了 apk 文件。
但是,如果我从 android 模拟器中删除应用程序,则会出现错误 returns。我现在不知道为什么。
我有一个与 apk-plugin 链接的工作代码。 我在 android 模拟器上 运行 另一个应用程序后,此代码停止工作。
DexClassLoader 不再找到 apk 文件。
How it looks
loadClass 开始掉落到带有文本的异常:
未找到 class“com.example.testandlib.Testt”
请帮助了解 运行 在 android 模拟器上使用另一个应用程序可能会导致什么问题。 重启模拟器没有效果。 还清理项目。
插件代码:
package com.example.testandlib
import android.util.Log
class Testt {
fun plus(a: Int,b: Int): Int {
return a + b - 2
}
fun minus(a: Int, b: Int): Int {
return a - b - 2
}
fun stringBoolHello(a: String, b: Boolean): String {
if (b)
return "Trully Hello, " + a
return "Hello, " + a
}
fun arrayHello(a: MutableList<String>): String {
var res = ""
var iter = a.iterator()
iter.forEach { res += it+";" }
return "Hello, " + res
}
fun originalArrayHello(a: Array<String>): String {
var res = ""
for ((index, value) in a.withIndex()) {
res += value+index.toString()+";"
}
return "Hello, " + res
}
}
部分主要应用程序代码:
val cont = getApplicationContext()
val apkPath = "/data/data/com.example.pozitivmobile/tmp/app-debug.apk"
val cachePath = getDir("dex",0).absolutePath
val classLoaderr = DexClassLoader(
apkPath,
cachePath,
null,
classLoader
)
try {
val curClass = classLoaderr.loadClass("com.example.testandlib.Testt")
val curObj = curClass.newInstance()
val methodParams = arrayOf(Int.javaClass)
val plusMethod = curClass.getMethod("plus", Int::class.java, Int::class.java)
val minusMethod = curClass.getMethod("minus", Int::class.java, Int::class.java)
val stringBoolHelloMethod = curClass.getMethod("stringBoolHello", String::class.java, Boolean::class.java )
val arrayHelloMethod = curClass.getMethod("arrayHello", MutableList::class.java )
val originalArrayHelloMethod = curClass.getMethod("originalArrayHello", Array<String>::class.java )
val plusResult = plusMethod.invoke(curObj,25,35)
val minusResult = minusMethod.invoke(curObj,35,45)
val stringBoolHelloResult1 = stringBoolHelloMethod.invoke(curObj,"Dmitry",true)
val stringBoolHelloResult2 = stringBoolHelloMethod.invoke(curObj,"Dmitry",false)
val paramHelloArray = mutableListOf<String>()
paramHelloArray.add("odin")
paramHelloArray.add("dva")
paramHelloArray.add("tri")
val arrayHelloResult = arrayHelloMethod.invoke(curObj,paramHelloArray)
val paramOriginalHelloArray = arrayOf("odinn","dvaa","trii")
val OriginalArrayHelloResult = originalArrayHelloMethod.invoke(curObj,paramOriginalHelloArray)
} catch (e: Exception){
Log.d("loadClass",e.message.toString() )
}
编辑:
我换行
val cachePath = getDir("dex",0).absolutePath
到
val cachePath = cont.cacheDir.absolutePath.toString()
现在我的代码可以正常工作了。
然后我return这条线回来
val cachePath = getDir("dex",0).absolutePath
而且我的代码仍然有效!海森堡?
执行这些操作后错误消失:
转到 adb shell
进入超级用户模式(使用 su 命令)
执行此命令:
chmod 777 /data/data/com.example.pozitivmobile/plugins/app-debug.apk
chmod 777 /data/data/com.示例.pozitivmobile/plugins
chmod 777 /data/data/com.example.pozitivmobile
chmod 777 /data/data
chmod 777 /数据
清理项目
运行 再次项目
在此之后,应用程序可以使用插件,但我不能再更改模拟器存储中的 app-debug.apk 文件(权限被拒绝)。为此,我需要将 apk 文件上传到目录:
/storage/emulated/0/Download/app-debug.apk
然后使用命令将其复制到超级用户 adb shell 中的应用程序目录:
cp /storage/emulated/0/Download/app-debug.apk /data/data/com.example.pozitivmobile/plugins/
所有这一切之后,应用程序正在使用 apk 插件,即使在主应用程序 运行ning 期间更改了 apk 文件。
但是,如果我从 android 模拟器中删除应用程序,则会出现错误 returns。我现在不知道为什么。