我试图在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;
}
似乎工作/稳定,很快就会进一步调试
答案 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;
}