草庐IT

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

coder 2023-12-29 原文

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

我最近得到了一个 bug report这表明三星手机上至少有三个用户存在问题(拦截和吸引)。我无法在我的 ADP2 和模拟器上重现该问题。

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

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

因为我没有三星手机,而且我无法在任何可以连接调试器的地方重现它,所以我几乎没有想法。我剩下的唯一想法是向 UI 添加一个按钮以生成报告。

还有其他方法可以推荐吗?

更新:由于人们要求更多细节:本质上,应用程序从 Assets 中读取文本文件并将它们(经过一些预处理)放入 ScrollView 中的 TextView。 (数据被 prgressively 添加到 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)。我不知道有专门针对 Samsung OS 构建的模拟器,尽管这在这里很有用。

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

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

最佳答案

我们需要更多地了解问题的性质。是车祸吗?看起来不对劲?等等

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

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

每当我遇到这些问题时,我都会礼貌地询问那些给我写信的人是否有兴趣帮助我——通常会有几个人渴望成为志愿者。我向他们发送了一个带有特殊测试版本的 APK 文件,该版本具有额外的调试输出,这有助于我缩小问题范围。

关于android - 如何在不访问硬件的情况下调试我的 Android 应用程序看似与硬件相关的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3508831/

有关android - 如何在不访问硬件的情况下调试我的 Android 应用程序看似与硬件相关的问题?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  3. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  10. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

随机推荐