【问题标题】:App crashes when Android Studio hits breakpoint which is inside a proxy当 Android Studio 遇到代理内部的断点时,应用程序崩溃
【发布时间】:2018-08-21 14:20:49
【问题描述】:

在我的日常 android 开发中,我在使用 android studio 进行调试时看到了几次应用程序崩溃的情况。我以为是android studio的问题。今天我尝试使用 jdb 进行调试,但是当我输入“where”命令时,应用程序仍然崩溃。并且回溯停止在调用代理之类的地方,这与往常不同。通常,回溯的顶部是handleMessage/nativePollOnce 之类的东西。所以我开始想也许它是由代理引起的。所以我用Proxy写了一些简单的代码来验证它。应用程序在断点处崩溃。有人见过这个吗?如何让应用程序不崩溃?真的很烦。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.activity_main);
    bindProxy(new Runnable() {
        @Override
        public void run() {
            setContentView(R.layout.activity_main); // Set breakpoint here
        }
    }).run();
}

Runnable bindProxy(final Runnable r) {
    return (Runnable)Proxy.newProxyInstance(getClassLoader(), new Class[]{Runnable.class}, new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Wrapped runnable");
            r.run();
            return null;
        }
    });
}
}

jdb 回溯:

Breakpoint hit: "thread=main", android.support.v7.app.AppCompatActivity.setContentView(), line=139 bci=0

main[1] where
  [1] android.support.v7.app.AppCompatActivity.setContentView (AppCompatActivity.java:139)
  [2] com.example.ally.ipc.MainActivity$1.run (MainActivity.java:32)
  [3] com.example.ally.ipc.MainActivity$2.invoke (MainActivity.java:44)
  [4] java.lang.reflect.Proxy.invoke (Proxy.java:913)

The application has been disconnected

【问题讨论】:

    标签: java android android-studio jdb


    【解决方案1】:

    你需要这个Runnable,它正在触及它不拥有的View? 您必须夸大内容视图,并且不要触及来自其所有者范围之外的视图。就像这样:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    

    这是因为MainActivity 应该是View 的所有者; Runnable 甚至不能在 UIThread 上运行 - 希望这应该可以理解,为什么这永远不会成功。

    【讨论】:

    • 谢谢。刻意写出丑陋的代码来演示下断点时的崩溃。
    • 调试/中断期间的执行配置文件比正常运行时更具确定性。这会导致一个错误,该错误会以更具确定性的方式使运行时崩溃。
    • @user2548774 您必须在该后台线程中设置断点...因为当执行进入Runnable 范围时,它突然变成了另一个线程。即使应用本身不是多线程的,也总会有一些线程在运行且可调试。
    猜你喜欢
    • 1970-01-01
    • 2017-10-27
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多