Android:load(getClass()。getClassLoader(),classLoadingStrategy)抛出java.lang.IllegalStateException

时间:2015-06-11 21:13:00

标签: java android byte-buddy

我试图在Android中的方法代理(...)下创建byteBuddy对象,然后在byteBuddy对象上调用一些方法:

<T> T proxy(Class<T> clz, InvocationHandler invocationHandler) {
    ByteBuddy byteBuddy = null;
    try {
        byteBuddy = new ByteBuddy(ClassFileVersion.JAVA_V6);
    } catch (Throwable e) {
        //e.printStackTrace();
    }
    if(byteBuddy!=null) {
        Class<?> enhanced = byteBuddy
                .subclass(clz, ConstructorStrategy.Default.IMITATE_SUPER_TYPE)
                .method(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class)))
                .intercept(InvocationHandlerAdapter.of(invocationHandler))
                .make().load(getClass().getClassLoader(), classLoadingStrategy)
                .getLoaded();

        ...

但是符合:

load(getClass().getClassLoader(), classLoadingStrategy)

ByteBuddy抛出异常:

  

06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:java.lang.IllegalStateException:无法加载类   pdl.transport.overlay.fissione.FissioneTransport $ FissioneHandler $ ByteBuddy $ vhLwLk79   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at   net.bytebuddy.android.AndroidClassLoadingStrategy.load(AndroidClassLoadingStrategy.java:138)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at   net.bytebuddy.dynamic.DynamicType $默认$ Unloaded.load(DynamicType.java:3380)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at pdl.transport.Messenger.proxy(Messenger.java:320)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at pdl.transport.Messenger.async(Messenger.java:382)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at pdl.transport.Messenger.async(Messenger.java:373)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at   pdl.transport.overlay.fissione.FissioneTransport.join(FissioneTransport.java:221)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at   pdl.transport.overlay.fissione.FissioneTransport.open(FissioneTransport.java:202)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at pdl.transport.overlay.util.DHT。(DHT.java:37)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at pdl.transport.overlay.util.DHT.main(DHT.java:117)   06-11 21:29:23.351 12028-12028 / com.example.AndroidOverlay   W / System.err:at   com.example.AndroidOverlay.MyActivity_newbie.onCreate(MyActivity_newbie.java:72)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   android.app.Activity.performCreate(Activity.java:6289)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   android.app.ActivityThread.access $ 900(ActivityThread.java:177)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1448)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:在android.os.Handler.dispatchMessage(Handler.java:102)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:在android.os.Looper.loop(Looper.java:145)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   android.app.ActivityThread.main(ActivityThread.java:5942)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   java.lang.reflect.Method.invoke(Native Method)06-11 21:29:23.361   12028-12028 / com.example.AndroidOverlay W / System.err:at   java.lang.reflect.Method.invoke(Method.java:372)06-11 21:29:23.361   12028-12028 / com.example.AndroidOverlay W / System.err:at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1400)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:   引起:java.lang.ClassNotFoundException:没找到类   &#34; pdl.transport.overlay.fissione.FissioneTransport $ $ FissioneHandler $ ByteBuddy vhLwLk79&#34;   在路径上:DexPathList [[zip文件   &#34; /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.jar"],nativeLibraryDirectories = [/供应商/ lib中,   / system / lib]] 06-11 21:29:23.361   12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at java.lang.ClassLoader.loadClass(ClassLoader.java:511)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at java.lang.ClassLoader.loadClass(ClassLoader.java:469)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   net.bytebuddy.android.AndroidClassLoadingStrategy.load(AndroidClassLoadingStrategy.java:136)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:... 22更多06-11 21:29:23.361   12028-12028 / com.example.AndroidOverlay W / System.err:抑制:   java.io.IOException:无法打开dex文件   &#39; /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.jar'从   内存:无法识别的版本号   /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.jar:0 3 6   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at dalvik.system.DexFile.openDexFileNative(Native   方法)06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at dalvik.system.DexFile.openDexFile(DexFile.java:295)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at dalvik.system.DexFile。(DexFile.java:111)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.DexFile.loadDex(DexFile.java:151)06-11 21:29:23.361   12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.DexPathList.loadDexFile(DexPathList.java:265)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.DexPathList.makeDexElements(DexPathList.java:231)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.DexPathList。(DexPathList.java:109)06-11   21:29:23.361 12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.BaseDexClassLoader。(BaseDexClassLoader.java:48)   06-11 21:29:23.361 12028-12028 / com.example.AndroidOverlay   W / System.err:at   dalvik.system.DexClassLoader。(DexClassLoader.java:57)06-11   21:29:23.371 12028-12028 / com.example.AndroidOverlay W / System.err:at   net.bytebuddy.android.AndroidClassLoadingStrategy $ DexProcessor $ ForSdkCompiler.makeClassLoader(AndroidClassLoadingStrategy.java:257)   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:at   net.bytebuddy.android.AndroidClassLoadingStrategy.load(AndroidClassLoadingStrategy.java:132)   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:... 22更多06-11 21:29:23.371   12028-12028 / com.example.AndroidOverlay W / System.err:引起:   java.io.IOException:execv失败(/ system / bin / dex2oat --runtime-arg   -classpath --runtime-arg --instruction-set = arm --instruction-set-features = div --runtime-arg -Xrelocate --boot-image = / system / framework / boot.art --dex-file = /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.jar   --oat-fd = 64 --art-fd = -1 --oat-location = / data / data / com.example.AndroidOverlay / app_TnUR5LUb / 1Gzh1FCI.dex   --runtime-arg -Xms64m --runtime-arg -Xmx512m)因为非0退出状态06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:... 33更多06-11 21:29:23.371   12028-12028 / com.example.AndroidOverlay W / System.err:引起:   java.io.IOException:找不到dex文件失败   &#39; /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.jar'在   燕麦的位置   &#39; /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.dex' ;:   无法找到现有的燕麦文件   /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.dex:文件   0字节的大小不足以包含52字节的ELF标头:   &#39; /data/data/com.example.AndroidOverlay/app_TnUR5LUb/1Gzh1FCI.dex'   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:... 33更多06-11 21:29:23.371   12028-12028 / com.example.AndroidOverlay W / System.err:抑制:   java.lang.ClassNotFoundException:没找到类   &#34; pdl.transport.overlay.fissione.FissioneTransport $ $ FissioneHandler $ ByteBuddy vhLwLk79&#34;   在路径上:DexPathList [[zip文件   &#34; /data/app/com.example.AndroidOverlay-1/base.apk"],nativeLibraryDirectories = [/供应商/ lib中,   / system / lib]] 06-11 21:29:23.371   12028-12028 / com.example.AndroidOverlay W / System.err:at   dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:at java.lang.ClassLoader.loadClass(ClassLoader.java:511)   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:at java.lang.ClassLoader.loadClass(ClassLoader.java:504)   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:... 24更多06-11 21:29:23.371   12028-12028 / com.example.AndroidOverlay W / System.err:抑制:   抛出java.lang.ClassNotFoundException:   pdl.transport.overlay.fissione.FissioneTransport $ FissioneHandler $ ByteBuddy $ vhLwLk79   06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:at java.lang.Class.classForName(Native Method)06-11   21:29:23.371 12028-12028 / com.example.AndroidOverlay W / System.err:at   java.lang.BootClassLoader.findClass(ClassLoader.java:781)06-11   21:29:23.371 12028-12028 / com.example.AndroidOverlay W / System.err:at   java.lang.BootClassLoader.loadClass(ClassLoader.java:841)06-11   21:29:23.371 12028-12028 / com.example.AndroidOverlay W / System.err:at   java.lang.ClassLoader.loadClass(ClassLoader.java:504)06-11   21:29:23.371 12028-12028 / com.example.AndroidOverlay W / System.err:...   25更多06-11 21:29:23.371 12028-12028 / com.example.AndroidOverlay   W / System.err:引起:java.lang.NoClassDefFoundError:Class not   发现使用引导类加载器;没有可用的堆栈

我正在使用来自http://central.maven.org/maven2/com/google/android/tools/dx/1.7/dx-1.7.jar的dx-1.7.jar 和byte-buddy-0.6.8.jar,byte-buddy-android-0.6.8.jar

我错过了什么吗?我得到也无法运行动态类型。(失败的解决方案:Lorg / objectweb / asmType;)在你的android示例应用程序,似乎我错过了什么,一些库或我不知道... 谢谢你的回答。

EDIT1: 我正在使用Lollipop,这就是我设置AndroidClassLoadingStrategy的方式:

final File dir = this.getDir("dexgen", Context.MODE_PRIVATE);
    Messenger.setClassLoadingStrategy(new AndroidClassLoadingStrategy(dir));

设置为类Messenger,其中我有方法代理(...)

public static void setClassLoadingStrategy(ClassLoadingStrategy cls) {
    classLoadingStrategy = cls;
}

和classLoadingStrategy定义为

private static ClassLoadingStrategy classLoadingStrategy;

编辑2: 毕竟我拿了ByteBuddy示例应用程序,尝试用Android棒棒糖代替

File file = TestActivity.this.getDir(RandomString.make(), Context.MODE_PRIVATE);

对于其中一个应该更换的人,尝试了所有这些并且所有人都提供相同的例外,只是来自不同的课堂活动

File file = getCodeCacheDir(); //NOT WORKING
// File file = getApplicationContext().getCodeCacheDir(); //NOT WORKING
// File file = getBaseContext().getCodeCacheDir(); //NOT WORKING
// File file = TestActivity.this.getCodeCacheDir(); //NOT WORKING

异常仍然存在:

06-12 23:18:57.916    1947-1947/net.bytebuddy.android.test W/net.bytebuddy﹕ java.lang.IllegalStateException: Cannot load class net.bytebuddy.renamed.java.lang.Object$ByteBuddy$uSYJ5787$auxiliary$MBywjCuh

我创建并推出了我的网站来源,以便将来可能重现错误:

bashism.com/shared/ByteBuddyTest.tar.gz

编辑3:

Android版:5.0.1 Lollipop

设备:三星galaxy S4

IDE:IntelliJ Idea 14.1.3

编辑4: 更改主要活动内部后:

File file = TestActivity.this.getDir(RandomString.make(), Context.MODE_PRIVATE);

和net.bytebuddy.android.AndroidClassLoadingStrategy里面

public ForSdkCompiler(DexOptions dexFileOptions, CfOptions dexCompilerOptions) {
dexFileOptions.targetApiLevel = 13;
this.dexFileOptions = dexFileOptions;
this.dexCompilerOptions = dexCompilerOptions;

}

似乎工作/稳定,很快就会进一步调试

1 个答案:

答案 0 :(得分:2)

正如我在上面的评论中提到的那样,问题在于生成的DEX文件目前太新了(较新的版本显然引入了“扩展操作码”)以供底层ART机器处理。实际问题可能源于具有不同默认DexOptions.targetApiLevel值的不同设备(可能忽略实际的API构建目标)。要解决此问题,任何涉及classes.dex文件的类加载策略都应该专门将此值设置为13或更低,以确保生成正确的dex文件。例如,在@ raphw的AndroidClassLoadingStrategy中,可以修改DexProcessor.ForSdkCompiler构造函数以专门设置此值,例如:

public ForSdkCompiler(DexOptions dexFileOptions, CfOptions dexCompilerOptions) {
    dexFileOptions.targetApiLevel = 13;
    this.dexFileOptions = dexFileOptions;
    this.dexCompilerOptions = dexCompilerOptions;
}