说说Android Studio断点调试时那个著名的“Frames are not available”问题

估计很多新手都遇到过这个问题:

然后在网上搜到的解决方案通通不管用,甚至还被骗去装了一遍flash player。

好了,说说真正的解决方案:真正的解决方案就是不需要解决,这其实不是个问题,而是正常的界面,当程序还没执行到断点位置的时候界面就是这样的,明白了吧。

 

 

 

 

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Android Studio 中修改字节码需要使用字节码操作库,例如 ASM (Java 字节码操作框架)。 以下是基本的步骤: 1. 添加 ASM 依赖项到项目中。在 app 模块的 build.gradle 文件中添加以下代码: ``` dependencies { implementation 'org.ow2.asm:asm:9.1' } ``` 2. 创建一个 ClassVisitor 子类来访问要修改的类的字节码。该子类必须实现 visitMethod 方法,该方法将返回一个 MethodVisitor 子类,该子类将访问类的方法字节码。 ``` public class MyClassVisitor extends ClassVisitor { public MyClassVisitor(ClassVisitor classVisitor) { super(Opcodes.ASM7, classVisitor); } @Override public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions); return new MyMethodVisitor(mv); } } ``` 3. 创建一个 MethodVisitor 子类来访问要修改的方法的字节码。该子类必须实现 visitInsn 方法,该方法将返回一个 InsnList,该列表将包含要插入到方法中的操作码。 ``` public class MyMethodVisitor extends MethodVisitor { public MyMethodVisitor(MethodVisitor methodVisitor) { super(Opcodes.ASM7, methodVisitor); } @Override public void visitInsn(int opcode) { if (opcode == Opcodes.RETURN) { InsnList list = new InsnList(); list.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;")); list.add(new LdcInsnNode("Hello, World!")); list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false)); super.visitFieldInsn(Opcodes.RETURN); } else { super.visitInsn(opcode); } } } ``` 4. 在 AndroidManifest.xml 文件中将应用程序的启动活动指定为要修改的类。 5. 创建一个应用程序类,该类将使用 ASM 库读取和修改要修改的类的字节码。 ``` public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); try { ClassReader reader = new ClassReader("com.example.MyClass"); ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); ClassVisitor visitor = new MyClassVisitor(writer); reader.accept(visitor, ClassReader.EXPAND_FRAMES); byte[] modifiedClass = writer.toByteArray(); // 将修改后的字节码写回到应用程序的 dex 文件中 // ... } catch (IOException e) { e.printStackTrace(); } } } ``` 注意:修改字节码可能会导致应用程序的崩溃或不稳定。如果您不熟悉字节码操作和 Java 虚拟机的工作原理,请先进行充分的学习和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值