精心整理:移动应用常见的Bug汇总及预防方法

没有Bug是任何产品上线前都无法达到的一个目标,包括拥有资深的测试工程师也不能保证上线后100%没问题,因为我们谁也不能把所有功能的操作、运用场景想周全,做周全。

虽然不能做到完全零缺陷,但是每次发布的产品,我们需要追求缺陷越来越少,产品投诉越来越少。

下面为大家总了一些App常见Bug以及解决处理方法,希望可以帮助到大家。

#No1.

UI界面方面

录入界面

1.1 输入字段要完整,且要与列表字段相符合(参照数据库进行检查)

1.2 必填项一律在后面用*表示(必填项为空在处理之前要有相关的提示信息)

1.3 字段需要做校验,如果校验不对需要在处理之前要有相关的提示信息

(1) 长度校验

(2) 数字、字母、日期等等的校验

(3) 范围的校验

1.4 录入字段的排序按照流程或使用习惯,字段特别多的时候需要进行分组显示

1.5 下拉框不选值的时候应该提供默认值

1.6 相同字段的录入方式应该统一(手动输入 、点选 、下拉选择、参照)

1.7 录入后自动计算的字段要随着别的字段修改更新(如单价变后,金额也变)

1.8 日期参照应该既能输入,又能从文本框选择

界面格式

2.1 字体颜色、大小、对齐方式(根据字段的性质确定)、加粗的一致性

2.2 文本框、按钮、滚动条、列表等控件的大小、对齐、位置的一致性

2.5 界面按钮显示要求(查询、新增、删除顺序)

2.6 列表的顺序排列应该统一(按照某些特定条件排序)

2.7 下拉框中的排列顺序需要符合使用习惯或者是按照特定的规则排定

2.8 所有弹出窗口居中显示或者最大化显示

2.9 信息列表中如果某个字段显示过长用“…”或者分行显示

2.10 人员、时间的缺省值一般取当前登录人员和时间

2.11 对于带有单位的字段,需要字段的标签后面添加如下内容:“(单位)”

功能问题

3.1 按钮功能的实现(如返回按钮能否返回)

3.2 信息保存提交后系统给出“保存/提交成功”提示信息,并自动更新显示

3.3 所有有提交按钮的页面都要有保存按钮(每个界面风格一致)

3.4 凡是点选或者下拉选择的界面,如果一旦选择完了无法回到不选择的情况,需要加上“清除选择”功能按钮

3.5 没有选择记录点击删除/修改按钮要提示“请先选择记录”

3.6 选择记录后点击删除按钮要提示“确实要删除吗?”

3.7 需要考虑删除的关联性,即删除某一个内容需要同时删除其关联的某些内容

查询问题

4.1 查询条件缺少一些可以查询的字段

4.2 有些查询条件需要支持模糊查询

4.3 需要考虑有些查询条件本身的关联性(即某个查询条件的取值范围是依赖于其它查询条件的取值)

4.5 不同模块相同字段的查询方式应该统一(手动输入 、点选 、下拉选择)

4.6 出 表的时候,查询条件需要显示在 表标题的下面,这样看 表的时候知道数据的依据是什么

4.7 对于范围的查询采用全闭的形式(如 [2006-1-1,2006-12-30])


#No2.

异常 错汇总

1.android.view.WindowManager$BadTokenException: Unable to add window — token null is not for an application

解决方案:将getApplication改成xxxx.this

2.call you are unregister onbrocastRevicer?

解决方案:忘记注销广播

3.Installation error:
INSTALL_FAILED_UPDATE_INCOMPATIBLE表示某个应用没有卸载完成

4.出现launch Activtiy not found ?因为这个Activity没有写main 和luncher参数

5.R.java was removed! Recreating R.java!

6.com.process.acore 表示的是这个应用程序有电话拨 进程


7.android.database.CursorIndexOutOfBoundsException解决方案:原因是应该先调用cursor.moveToFirst();。

数据库查询得到的cursor里面只有1个结果,你却查找第-1个,肯定不对

8.launcher.apk启动程序在启动动画页面卡住,原因是开机动画很暂用cpu,如果luancher里面的某部分代码阻塞了,或者某个自定义view中部分代码太占用CPU导致的。

9.java.lang.IllegalStateException: The specified child al

ready has a parent. You must call removeView() on the child’s parent first,表示是缺少对象,

解决方法:查找对象是否还在,要么就是多次事例化了

10.java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131230732, class android.widget.ListView) with Adapter(class com.cardroid.sdhc.medialist.SDMediaListAdapter)]

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.widget.ListView.layoutChildren(ListView.java:1492)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.widget.AbsListView.onTouchEvent(AbsListView.java:2124)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.widget.ListView.onTouchEvent(ListView.java:3315)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.View.dispatchTouchEvent(View.java:3918)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:898)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:937)

01-01 00:51:06.320: ERROR/AndroidRuntime(4035): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:937)

解决方案:放入主线程中运行,因为此时这个LISTVIEW 加载ADAPTER是放入AsyTask里面运行的

11.Database( 2284): sqlite returned: error code = 14, msg = prepared

> statement aborts at 4: [DELETE FROM android_metadata]

> Database( 2284): DELETE failed setting locale

> Database( 2284): Failed to setLocale() when constructing, closing the

> database

> Database( 2284): android.database.sqlite.SQLiteException: unable to open

> database file

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)

> Database( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)

> Database( 2284): at

> android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:542)

> Database( 2284): at

> android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

> Database( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

> Database( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)

> Database( 2284): at

> com.android.providers.media.MediaProvider.query(MediaProvider.java:1287)

> Database( 2284): at

> com.android.providers.media.MediaProvider.attachVolume(MediaProvider.java:3045)

> Database( 2284): at

> com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:1945)

> Database( 2284): at

> com.android.providers.media.MediaProvider.insert(MediaProvider.java:1665)

> Database( 2284): at android.content.ContentProvider

> $Transport.insert(ContentProvider.java:174)

> Database( 2284): at

> android.content.ContentResolver.insert(ContentResolver.java:587)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.openDatabase(MediaScannerService.java:65)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.scan(MediaScannerService.java:113)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.access

> $400(MediaScannerService.java:53)

> Database( 2284): at com.android.providers.media.MediaScannerService

> $ServiceHandler.handleMessage(MediaScannerService.java:283)

> Database( 2284): at

> android.os.Handler.dispatchMessage(Handler.java:99)

> Database( 2284): at android.os.Looper.loop(Looper.java:123)

> Database( 2284): at

> com.android.providers.media.MediaScannerService.run(MediaScannerService.java:197)

> Database( 2284): at java.lang.Thread.run(Thread.java:1096)

> SQLiteOpenHelper( 2284): Couldn’t open external.db for writing (will try

> read-only):

> SQLiteOpenHelper( 2284): android.database.sqlite.SQLiteException: unable

> to open database file

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)

> SQLiteOpenHelper( 2284): at

> android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:542)

> SQLiteOpenHelper( 2284): at

> android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)

> SQLiteOpenHelper( 2284): at

> android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.query(MediaProvider.java:1287)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.attachVolume(MediaProvider.java:3045)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:1945)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaProvider.insert(MediaProvider.java:1665)

> SQLiteOpenHelper( 2284): at android.content.ContentProvider

> $Transport.insert(ContentProvider.java:174)

> SQLiteOpenHelper( 2284): at

> android.content.ContentResolver.insert(ContentResolver.java:587)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.openDatabase(MediaScannerService.java:65)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.scan(MediaScannerService.java:113)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.access

> $400(MediaScannerService.java:53)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService

> $ServiceHandler.handleMessage(MediaScannerService.java:283)

> SQLiteOpenHelper( 2284): at

> android.os.Handler.dispatchMessage(Handler.java:99)

> SQLiteOpenHelper( 2284): at android.os.Looper.loop(Looper.java:123)

> SQLiteOpenHelper( 2284): at

> com.android.providers.media.MediaScannerService.run(MediaScannerService.java:197)

> SQLiteOpenHelper( 2284): at java.lang.Thread.run(Thread.java:1096)

解决方案:DBHELPER打开数据库的链接后,没有关闭,导致下次进入有问题,同时有的把数据库放入SDCARD,要加SDCARD的权限。

12.在LINUX下面出现R。JAVA文件不生成的时候,是因为SDK下面的platforms/android-8/tools要加权限,为了方便常用

platforms/android-8/tools$ chmod a+x *

13: 问题描述:E/WindowManager( 5523):
android.view.WindowLeaked: Activity
com.cardroid.sdhc.medialist.SDMediaListActivity has leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView@30c45e38 that was originally added here

解决方案:即未能及时销毁某个PhoneWindow。当前Activity被关闭。而在关闭的同时,却没能及时的调用dismiss来解除对ProgressDialog等的引用,从而系统抛出了标题中的错误,而掩盖了真正导致这个错误的异常信息。需要在ONDESTORY方法时候关闭一些DIALOG。

14:问题描述,在拨打电话的时候配置文件中已经添加了权限,但是提示还需要添加权限requires
android.permission.CALL_PHONE

W/dalvikvm( 5709): threadid=1: thread exiting with uncaught exception (group=0x40015568)

W/ActivityManager( 201): Permission Denial: starting Intent {

act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx cmp=com.android.phone/.OutgoingCall

Broadcaster } from ProcessRecord{408c2550 5709:com.um.mplus/10072} (pid=5709, uid=10072)

requires android.permission.CALL_PHONE

E/AndroidRuntime( 5709): FATAL EXCEPTION: main

E/AndroidRuntime( 5709): java.lang.SecurityException: Permission Denial: starting Intent {

act=android.intent.action.CALL dat=tel:xxx-xxx-xxxx cmp=com

.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{408c2550

5709:com.um.mplus/10072} (pid=5709, uid=10072) requires android.permission.CALL_PHONE

解决问题:因为这个权限,有的系统级别作了限制,所以,添加抓取异常就可以了。


#No3.

开发类常见问题汇总

1. 如果你的项目的R文件不见的话,可以试下改版本 在保存,R文件不见一般都是布局文本出错导致.

2. 布局文件不可以有大写字母

3. 抛出如下错误WARNING: Application does not specify an API level requirement!,

是由于没有指定users sdk的缘故,修改AndroidManifest.xml文件.

加入:<
uses-sdkandroid:minSdkVersion=”8″></uses-sdk>

4. 机器内存的瓶颈,当apk大于我们的机器内存时,模拟器无情的抛出

Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE Please check logcat output for more details. Launch canceled!

让我们无法调试,现在我们来根治这个问题,解决方法有两种

第一种(仅限apk小于机器内存,并且已安装上当前apk,只是无法再次debug)

启动模拟器,然后进入菜单

settings->applications->mange

applications-> select the application->select “unistall”.

这样就能彻底删除了,然后再重新安装这个apk就没问题了

第二种(通用)

-partition-size 128

Eclipse中在项目Target的Options中添加。

5. 启动android模拟器时候如果提示:Failed to install on device ‘emulator-5554′: timeout

这是可能因为卡的原因导致启动超时,解决办法:eclipse -> window -> Preferences -> Android -> DDMS -> ADB connection time out(ms).把这个时间设置的长一些,默认是5秒即5000ms, 我改成10秒就ok了。

这样就不用每次重启模拟器了。具体时间设置根据实际环境需要

6. 在开发的过程中经常在安装apk到模拟器上时会 出

ActivityManager: Error: Activity class {..} does not exist.

这样的错误,这里总结两种解决方式:

在AndroidManifest.xml文件中查看主Activity的名字前是否有’.’符

7.运行Eclipse时出现了这个错误

No Launcher activity found!

The launch will only sync the application package on the device!

解决办法

在AndroidManifest.xml 中添加

<category android_name=”android.intent.category.LAUNCHER” />

8.出现如下错误,没有写入sd卡权限
java.io.FileNotFoundException: /mnt/sdcard/update.zip (Permission denied)

解决办法,资源文件写入如下权限

<uses-permissionandroid:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>


Testin云测送大家一波超级福利!

① 价值5000元的Testin专属测试大礼包(包含120分钟自动化测试、120分钟远程真机调试、每日免费使用1次标准兼容测试、每日免费使用1次安全测试);

② 原51testing产品总监陈霁老师16年测试工作总结精华 -《软件测试入门必读》课程。

如何获取福利?

登陆或者注册您的Testin账 进行企业认证,完成认证自动获得福利大礼包,认证请戳——> http://www.testin.cn

更多精彩内容:

为什么程序员找不出自己的BUG?

9个因Bug引发的巨大灾难

如何组建一支高效的测试团队

测试员=背锅侠?测试员:这个锅我不背

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年1月8日
下一篇 2018年1月8日

相关推荐