如何在不访问硬件的情况下使用我的Android应用程序调试看似硬件相关的问题?

时间:2010-08-18 03:48:34

标签: android debugging remote-debugging

我在Android市场上有一个开源应用程序。它似乎对我来说很好(有超过1,000个有效安装,我必须假设它适用于大多数人)。

我最近得到一个bug report,表明三星手机上至少有三个用户存在问题(Intercept和Captivate)。我无法在ADP2和模拟器上重现问题。

为了获得足够的数据来诊断问题,我首先尝试添加日志记录,然后我要求用户通过Log Collector提交日志。每次用户尝试发送日志时(有四次尝试),它都被截断,我没有得到任何有用的数据。

然后我将ACRA添加到项目中以尝试获取信息,但我似乎无法自动检测错误以便发送报告。

由于我没有三星手机而且我无法在可以与调试器连接的任何地方重现它,我主要是出于想法。我留下的唯一想法是在UI中添加一个按钮来生成报告。

还有其他方法可以提出建议吗?

更新:因为人们要求更多细节:基本上,应用程序从资源中读取文本文件并将它们(带有一些预处理)放入ScrollView中的TextView中。 (数据被强行添加到SpannableStringBuffer,然后传递给TextView的setText()函数。)根据所选的选项,显示的文本介于15k-115k之间。在出现此问题的手机上,仅显示部分文本。截止点取决于选项,但似乎介于17k-18k之间。

ACRA会针对所有未捕获的异常发送报告,并将其放入Google表单/电子表格中。我从我的模拟器和手机上得到了报告,所以我知道最终会有效。 (实际上,我经常发现从报告中的堆栈跟踪调试比将调试器附加到进程更快。)

手机规格:我已经在运行1.5,1.6,2.1和2.2的模拟器上运行了应用程序。我的手机是ADP2(MyTouch的开发者版本),但我已经安装了third-party ROM来跳转到Froyo(2.2)。我不知道专门为三星OS构建的模拟器,虽然这在这里会非常有用。

由于预期的文本长度是恒定的,因此我能够检测它是否被正确读取。我在文本处理结束时添加了检查,但那些从未触发过,表明问题不在于读取文件。然后我尝试将检查添加到onPostCreate和onPostResume,但那些也没有失败。但是,似乎UI线程实际上还没有在那一点上运行。

我现在已经完成了6个私有APK版本附加到错误跟踪器中的错误。坦率地说,我很惊讶任何用户仍在尝试它们。这个最新版本有一个强制错误报告的按钮 - 只有在UI线程布局后才会调用。希望这会给我足够的可变信息,指出我正确的方向。

2 个答案:

答案 0 :(得分:2)

我们需要更多地了解问题的本质。这是崩溃吗?有什么看起来不对劲?等

如果是崩溃,你可以添加一个崩溃处理程序(Thread.setUncaughtExceptionHandler,IIRC)并创建一个格式更好的日志,可以选择发送给你。

此外,尝试收集有关手机规格(操作系统,分辨率等)的信息,并在调试器中重新生成。那些三星手机有Android 2.1 - 你的Nexus可能有2.2?您是否尝试将模拟器设置为使用2.1?

每当我遇到这些问题时,我礼貌地问那些写信给我的人是否有兴趣帮助我 - 而且通常有几个人渴望自愿参加。我发送了一个带有特殊测试版本的APK文件,该文件具有额外的调试输出,这有助于我缩小问题范围。

答案 1 :(得分:2)

这个bug在(某些?)三星手机上是一个未记录的默认值,它将TextView小部件的maxLength属性限制为9,000个字符。显式添加一个“android:maxLength”属性,其值足够大,可以包含TextView小部件的最大文本长度,从而解决了这个问题。

顺便说一下,我认为同样的问题是导致初始记者的LogCollector日志被截断的原因。