这次android的壁纸软件1.0版本终于可以上线了,软件的功能基本上实现了,但是用户体验不太好。在整个开发阶段和测试阶段,出现了很多预料之外的事情,比如size是1M多的json文件解析、高清图片导致OOM、莫名其妙的崩溃等。这些意外无一不影响开发计划,增大压力,最直接的表现是晚上加班和周末加班。

写代码和修改代码远比想象中的难控制。用户体验增加了代码的细节处理难度、逻辑处理难度,android莫名的崩溃增加解决bug的难度。就这次开发,总结了一些经验。

测试人员经常会报告小米1手机运行壁纸软件时会崩溃的问题,崩溃日志是:

java.lang.RuntimeException: Failed to register input channel.  Check logs for details.
at android.view.InputQueue.nativeRegisterInputChannel(Native Method)
at android.view.InputQueue.registerInputChannel(InputQueue.java:92)
at android.view.ViewRoot.setView(ViewRoot.java:570)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
at android.widget.Toast$TN.handleShow(Toast.java:411)
at android.widget.Toast$TN$1.run(Toast.java:337)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)

根据日志推测该崩溃是和Toast有关。可是问题就奇怪了,我在代码中只调用Toast.makeTest(...).show(),为什么会引起这个崩溃。然后根据测试人员的反馈,当设置壁纸成功后,会引起这个崩溃,而且测试人员是在频繁的操作下报出来这个问题的。根据这个现象,推断有可能以下两个原因引起的,一是,设置壁纸引起桌面发生变化,桌面发生变化时弹出toast会导致崩溃;二是,频繁不间断的弹出toast会引起这个问题。而之后测试人员反馈了一个新的现象,当进行新浪微博分享失败后(前提是该新浪微博帐号是有问题的),再去浏览壁纸图片也导致了该崩溃,而且此现象仅出现了一次再也不复现。该bug最终是遗留解决。

针对这种问题,在以后的版本开发中肯定也会出现,怎么避免它再次出现。我总结了从几个方面做努力。先借来小米1手机来玩,学习手机发烧友的习惯和测试人员的思维,然后体验小米1手机,对小米1要有更深入的认识;和小米进行沟通,还没有认识牛逼的朋友在小米做开发,所以可以先在小米论坛上做活跃用户,主动和对方和网友沟通;了解input channel是什么功能,什么机制,研究 anroid2.3的关于这块的native代码。

刚开始进入测试阶段时,测试人员每天都会报告壁纸软件频繁崩溃的问题。对于一些简单的崩溃问题,一般是空指针而且还复现,就不在这里说了。测试报告说,浏览壁纸图片保存壁纸,预览壁纸和设置壁纸时经常的崩溃,这种崩溃没有规律可复现但是很频繁出现。这种问题的原因是OOM,比如,在MX2手机上,桌面预览要使用的位图大小是1280  X 800 X 2 X 4字节 约等于8M,软件中的位图各种处理(缩放、剪切、渲染、多个activity同时存在等)会导致内存使用量飙升到50多M,当超过64M左右时,软件会报OOM错误。没有彻底解决OOM的方法,网上有很多避免OOM的方法,比如延迟加载图片、及时回收内存、弱引用等。另外在生成bitmap的地方要使用try catch捕获OutOfMemoryError。除了这些方法外,要去研究ImageView如何操作Drawable的,BitmapDrawable、ColorDrawable、NinepatchDrawable的内存使用量,ImageView的scaleType对内存的使用量等。

解决了这些崩溃问题后,还会有新的导致崩溃的原因。测试人员说中午吃完饭回来,打开壁纸软件突然崩溃。分析这个现象后,找到原因是,长期待机情况下android杀掉了壁纸软件的进程。但是疑问出现了,此时进程被杀掉了之后点击app的icon,不是又重新打开了进程,重新运行了吗,怎么会崩溃呢。经过分析,发现有个诡异的地方是,android待机后把壁纸进程给杀掉了,但是该软件的activity并没有从task中删除掉,所以当再点击app的icon时,会执行task顶层的activity的onCreate,而onCreate里边的一些东西还未初始化,会因为空指针而崩溃。

后来,测试人员报告了一个诡异的bug,安装软件后第一次打开软件,欢迎界面的图片显示不出来,以后每次打开软件欢迎界面的图片都能打开出来。图片是一个jpg文件,在raw中。最后找到原因是,在decode bitmap,scale bitmap时,其中要操作的一个变量imagewidth在第一次时是0,没有赋值,之后再操作就不是0,赋值了。但是为什么会这样,最后找到原因了,imagewidth是一个全局静态变量,该全局静态变量在另外一个线程中会被赋值(赋上屏幕的宽度)。由于线程的异步问题而导致第一次imagewidth是0。后来每次打开软件,并不是进程重启,而是activity重启,imagewidth赋的值还在。得出结论,如果碰到第一次打开软件出问题,后来没有问题的bug时,先看是否有要操作的全局静态变量在异步线程中被赋值。

如何在android上去控制开发进度的更多相关文章

  1. Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍

    原文 Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS,Xamarin 在Visual Studio中针对Android,可以直接设 ...

  2. 如何在Android上编写高效的Java代码

    转自:http://www.ituring.com.cn/article/177180 作者/ Erik Hellman Factor10咨询公司资深移动开发顾问,曾任索尼公司Android团队首席架 ...

  3. Android H5混合开发(5):封装Cordova View, 让Fragment、弹框、Activity自由使用Cordova

    近期,有同事咨询如何在Fragment中使用Cordova,看了下Cordova源码,官方并没有提供包含Cordova Webview的Fragment,以供我们继承. 上网查询了一下,也有几篇文章讲 ...

  4. 教你如何在 Android 使用多线程下载文件

    # 教你如何在 Android 使用多线程下载文件 前言 在 Android 日常开发中,我们会经常遇到下载文件需求,这里我们也可以用系统自带的 api DownloadManager 来解决这个问题 ...

  5. Android(Linux)控制GPIO方法二

    前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

  6. [转]Android样式的开发:shape篇

    转载自Keegan小钢原文链接:http://keeganlee.me/post/android/20150830 Android样式的开发:shape篇Android样式的开发:selector篇A ...

  7. Android之NDK开发(转)

    Android之NDK开发 一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第 ...

  8. android实现控制视频播放次数

    android实现控制视频播放次数,实质就是每个视频片段播放完后,通过MediaPlayer设置监听器setOnCompletionListener监听视频播放完毕,用Handler发送消息再次激活视 ...

  9. android 底层入门开发(二)

    LED将为我闪烁:控制发光二极管 对于大多数Linux驱动来说,需要直接与硬件交互,本章主要介绍用Linux驱动来控制二极管的明暗,即通过Linux驱动发送数据控制开发板上LED灯的开关. 第一节介绍 ...

随机推荐

  1. [React] React Router: setRouteWillLeaveHook

    setRouteWillLeaveHook provides a method for us to intercept a route change before leaving the curren ...

  2. android离线下载的相关知识

    离线下载的功能点如下:      1.下载管理(开始.取消下载).      2.网络判断(Wi-Fi,3G).      3.独立进程.      4.定时和手机催醒.      5.自启动. 选择 ...

  3. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

    最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件抖动窗口功能 服务端: using System; using System.Collec ...

  4. Redis配置不当可导致服务器被控制,已有多个网站受到影响 #通用程序安全预警#

    文章出自:http://news.wooyun.org/6e6c384f2f613661377257644b346c6f75446f4c77413d3d 符合预警中“Redis服务配置不当”条件的服务 ...

  5. java优势

    跨平台,只要有JVM(Java虚拟机)的操作系统就可以运行JAVA程序: 安全: 弃用危险的指针: 自动内在管理机制,垃圾回收机制,由垃圾回收器回收,减轻程序负担,也避免了手动回收的危险性: 完全面向 ...

  6. alter database open resetlogs

    使用resetlogs选项,会把当前的日志序号(log sequence number)重设为1,并抛弃所有日志信息.在以下条件时需要使用resetlogs选项: 在不完全恢复(介质恢复): 使用备份 ...

  7. 关于vis标记

    原来写题目的时候对vis标记都是先memset在标记,今天看见一个只要每次对T值修改,然后看看等不等于T就可以了,真好!

  8. uva 10167 - Birthday Cake

    题解:由于解太多,随机抓 A.B, 只要有符合就行了: (首先,Ax+By=0必须表示直线,即A.B不能同时为0:另外,要注意到直线不能过输入中的2N个点:检测点在直线的哪一侧,只需要简单的线性规划的 ...

  9. sql 查找数据库中某字符串所在的表及字段

    declare   @str   varchar(100)     set   @str='是否严格控制'     --要搜索的字符串         declare   @s   varchar(8 ...

  10. [Mugeda HTML5技术教程之9]使用元件

    元件是一个可以在舞台上实例化和再利用的预先生成的独立动画.一个元件有它自己的时间轴(层,单位等),可以独立显示的动画.元件提高了动画的重用性和灵活性,是个强大的存在.元件可用于创建复杂的动画效果. 所 ...