Android Studio 连接到设备上的目标 VM 但不会对其进行调试 - 大多数时候

Android Studio connects to target VM on device but won't debug it - most of the time

我在从 Eclipse 迁移的应用项目上使用 Android Studio 1.0.2 in ubuntu 14.04。我是 Studio/IntelliJ 和 Gradle 的新手。当我通过单击 Studio 中的调试图标来调试应用程序时:

但是 none 用于单步执行或越过代码等的调试器图标已启用,并且调试器不会在任何断点处停止。

我没有在我的清单中设置 android:debuggable="true",因为它现在似乎已被弃用。

我已经尝试按照建议删除除一个 JDK 之外的所有内容 here 但我仍然遇到这个问题。

奇怪的是,有时调试器确实按预期运行,但是,10 次中有 8 或 9 次,它就是不起作用。这非常令人沮丧!我在另一台机器上使用相同的代码和 Studio 版本也得到了相同的行为。关于如何让 Studio 的调试器可靠运行有什么想法吗?

1 月 23 日更新: Studio 的同一个实例能够很好地调试新创建的 'Hello World' 应用程序,所以这可能与我的应用程序项目有关是问题,但我不知道是什么。也许它只发生在从 Eclipse 迁移的某些项目中——例如,合并清单时;但这是一个完整的猜测。

2 月 7 日更新: 如果我将调试器设置为在遇到任何异常时挂起,那么我会首先看到抛出的异常:libcore.io.ErrnoException: access failed: ENOENT (No such file or directory)。主线程的堆栈跟踪是:

<1> main@830017070344, prio=5, in group 'main', status: 'RUNNING'
  at libcore.io.ForwardingOs.access(ForwardingOs.java:38)
  at java.io.File.doAccess(File.java:283)
  at java.io.File.exists(File.java:363)
  at dalvik.system.DexPathList.splitAndAdd(DexPathList.java:168)
  at dalvik.system.DexPathList.splitPaths(DexPathList.java:149)
  at dalvik.system.DexPathList.splitLibraryPath(DexPathList.java:130)
  at dalvik.system.DexPathList.<init>(DexPathList.java:98)
  at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:52)
  at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:65)
  at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:57)
  at android.app.LoadedApk.getClassLoader(LoadedApk.java:317)
  at android.app.LoadedApk.makeApplication(LoadedApk.java:493)
  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4170)
  at android.app.ActivityThread.access00(ActivityThread.java:134)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4867)
  at java.lang.reflect.Method.invokeNative(Method.java:-1)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
  at dalvik.system.NativeStart.main(NativeStart.java:-1)

这之后是加载 BootClassLoader 异常,因为类加载器尝试加载我的应用程序中的 类 和 Google 的 类,但失败了。在我的设备上,我只看到操作栏 - 没有别的:(。我看到其他人有类似的问题 here。有趣的是,他们也从 Eclipse 迁移到 IntelliJ,但与他们不同,我没有遇到问题在 Eclipse 中已经 AFAIK。他们似乎从来没有深入了解它。有什么想法吗?我仍然不明白是什么触发了这个,因为有时调试器确实按预期工作。

简短回答: Google Play Services v6.5.87 中存在一个已知错误,这意味着 Google Analytics (GA) 极有可能出现死锁当 GoogleAnalytics.getInstance() tries to load the XML tracker file defined in your manifest. You can work around it by configuring your GA tracker programatically, as I did, or by downgrading the version of Google Play Services you're using (or waiting for a fix in a later release!). See here, here and here 了解更多信息。

我的 'Hello World' 应用程序可以运行,因为它没有使用 GA。我注意到 Android Studio 中我的应用 build.gradle 文件的依赖项部分是这样说的:

compile 'com.google.android.gms:play-services:+'

我猜我的应用程序的原始 Eclipse 版本引用了旧版本的 Google Play 服务,它没有这个问题,当应用程序迁移到 Android Studio 时它巧合的是 v6.5.87 有这个错误。非常感谢Google!我已经将上面的行更改为

compile 'com.google.android.gms:play-services:6.5.87'

所以至少我清楚地知道我得到了什么,并且可以自己决定何时升级!

至于 class-loading 错误,它们似乎无关(并且无害?)但我仍然不知道是什么导致了它们。

长答案: 我对我的代码进行了分支,并将应用程序剥离到仅剩一个 activity 的基本要素。它在启动时仍然崩溃,但这次我注意到 LogCat:

中的这一行
I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'

我在我的文件系统中使用此命令将跟踪转储从我的 phone 提取到我的计算机:

~/android-sdks/platform-tools$ ./adb pull /data/anr/traces.txt

在traces.txt的开头看到了这个(我的应用包和名字都改了):

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)

"main" prio=5 tid=1 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x41606508 self=0x415f6660
  | sysTid=4925 nice=0 sched=0/0 cgrp=[no-cpu-subsys] handle=1074638640
  | schedstat=( 71380610 113708500 297 ) utm=3 stm=4 core=1
  at com.google.android.gms.analytics.ae.getLogger((null):~-1)
  - waiting to lock <0x420608a0>  held by tid=13 (client_id_fetcher)
  at com.google.android.gms.analytics.ae.V((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.a((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.eZ((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.<init>((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.<init>((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.getInstance((null):-1)
  at com.mycompany.mypackage.MyApp.getTracker(MyApp.java:61)
  at com.mycompany.mypackage.MyActivity.onCreate(MyActivity.java:125)
  at android.app.Activity.performCreate(Activity.java:5047)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117)
  at android.app.ActivityThread.access0(ActivityThread.java:134)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218)
  at android.os.Handler.dispatchMessage(Handler.java:99)
  at android.os.Looper.loop(Looper.java:137)
  at android.app.ActivityThread.main(ActivityThread.java:4867)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:511)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
  at dalvik.system.NativeStart.main(Native Method)

"client_id_fetcher" prio=5 tid=13 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x4205e778 self=0x5a51d948
  | sysTid=4941 nice=0 sched=0/0 cgrp=[no-cpu-subsys] handle=1515314584
  | schedstat=( 16052255 21850583 224 ) utm=1 stm=0 core=1
  at com.google.android.gms.analytics.GoogleAnalytics.eY((null):~-1)
  - waiting to lock <0x4205af48>  held by tid=1 (main)
  at com.google.android.gms.analytics.ae.getLogger((null):-1)
  at com.google.android.gms.analytics.ae.V((null):-1)
  at com.google.android.gms.analytics.k.eq((null):-1)
  at com.google.android.gms.analytics.k.run((null):-1)

"GAThread" prio=5 tid=12 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x4205b950 self=0x415e59c8
  | sysTid=4940 nice=10 sched=0/0 cgrp=[no-cpu-subsys] handle=1096703512
  | schedstat=( 15808103 21026609 173 ) utm=1 stm=0 core=1
  at com.google.android.gms.analytics.GoogleAnalytics.getInstance((null):~-1)
  - waiting to lock <0x4205af48>  held by tid=1 (main)
  at com.google.android.gms.analytics.w.<init>((null):-1)
  at com.google.android.gms.analytics.x.init((null):-1)
  at com.google.android.gms.analytics.x.run((null):-1)

您可以看到线程 id (tid) 1,"main",正在调用 GoogleAnalytics.getInstance() 但被阻止等待 tid=13 (client_id_fetcher 持有的锁 <0x420608a0> )

但是线程 13 "client_id_fetcher" 被阻塞,等待 tid=1(主线程)持有的锁 <0x4205af48>。僵局! (线程 12,"GAThread" 也被阻塞等待同一个锁。)看到这个后,我能够 Google 在 GoogleAnalytics.getInstance() 中进行死锁,这让我想到了上面提到的解决方法.希望这对其他人有帮助,因为我花了很长时间才找到这个!