如何在不首先写入文件的情况下使Android加载动态生成的dalvik字节码?

时间:2016-09-02 21:58:31

标签: android class bytecode loader emulation

作为我最后一个大学项目的过去六个月,我一直在用Java编写一个PlayStation 1模拟器来证明它可以表现出来 - 我的策略的一部分是编写一个自定义类加载器来导入我刚从中生成的字节码将数组转换为新类 - 实际上是一个Java字节码dynarec核心,它可以加速模拟的CPU数量级(理论上)。在Oracle JVM上完全可能,而其他人则完成了。

我的问题是,除了我需要生成dalvik字节码而不是Java字节码这一事实外,似乎无论如何都没有动态地将类加载到正在运行的Android应用程序中,该应用程序不涉及从dex加载它们在某处闪存文件。我知道之前已经问过类似的事情,但是因为我最终想要移植这个模拟器(并且比它当前无法播放的速度更快),不管怎么说还有吗?当MIPS代码的新部分转换为字节码时,我不想继续写入闪存,因为它可能会磨损闪存并且可能也不是很快。

我的想法可能是使用一个小的JNI lib来安装一个tmpfs并在那里存储要加载的类文件,所以实际上将它们存储在RAM中 - 这对于一个无特权的应用程序来说甚至可能吗?我很欣赏人们的意见/想法。

1 个答案:

答案 0 :(得分:1)

不,这可能适用于越狱设备,但在沙盒应用中无法实现。

我尝试了几种在Android上加载动态代码的方法,但唯一可行的方法是通过DexClassLoader,其中dex文件必须存储在特权区域。

您可以查看我的项目Byte Buddy,我在其中实现了这样的类加载:https://github.com/raphw/byte-buddy/blob/master/byte-buddy-android/src/main/java/net/bytebuddy/android/AndroidClassLoadingStrategy.java