当前位置: 代码迷 >> Android >> Android-Tips(适用Android开发技巧)
  详细解决方案

Android-Tips(适用Android开发技巧)

热度:268   发布时间:2016-04-24 11:31:15.0
Android-Tips(实用Android开发技巧)

整理本人实际开发中遇到的一些问题以及解决办法和一些开发技巧,以后会不定时更新。

tips:利用“目录”可快速导航

1.追溯sdk中某一个类随sdk版本升高导致的历史变迁。(find API changes)

问题来源:SwipeRefreshLayout源码:判断子View是否能向上滚动(或者是否滚动到顶部):

    /**     * @return Whether it is possible for the child view of this layout to     *         scroll up. Override this if the child view is a custom view.     */    public boolean canChildScrollUp() {        if (android.os.Build.VERSION.SDK_INT < 14) {            if (mTarget instanceof AbsListView) {                final AbsListView absListView = (AbsListView) mTarget;                return absListView.getChildCount() > 0                        && (absListView.getFirstVisiblePosition() > 0 || absListView.getChildAt(0)                                .getTop() < absListView.getPaddingTop());            } else {                return ViewCompat.canScrollVertically(mTarget, -1) || mTarget.getScrollY() > 0;            }        } else {            return ViewCompat.canScrollVertically(mTarget, -1);        }    }

进入Android开发官网,假如要查看View API的变化,输入View,选择android.view.View,如图:

搜索View

进入View的API参考页面(文档页),如图:

参考

从图中可以看到三个主要信息:

  • View是在API level 1添加的
  • View的类层次
  • 通过左侧的API level choose button 可以查看不同API level下的View API,进行纵向的查看,同时可以将不同API level下的View API进行横向对比。

追溯API 变化就是通过上述第三条实现的。比如我们想看看API level 13和 API level 14之间有什么变化,将左侧API level设置为13,查看方法列表:

gray methods

我们会发现一些API 是灰色的,当鼠标hover过方法名时,会显示出一个提示,如图:
这里写图片描述

这个提示告诉我们:View中的canScrollVertically(int direction) 方法是在API level 14以后才添加的,另外canScrollHorizontally(int direction) 也是API level 14以后才添加的方法。当我把API level 切换到14时,发现上述两个方法的颜色变为蓝色了,说明他们的确是在API level 14添加的:

这里写图片描述

总结:

使用这种方法的好处是不用下载每一个api 版本的源代码,也可以很方便的对比他们之间的变化。开发参考除了可以对比方法的变化以外,还可以对比内部类,接口等变化,当前选中的API level 为9,结果如图:
这里写图片描述

2.使用device monitor 中的method profiling 工具寻找app卡顿的元凶

问题来源:使用RxJava时,出现莫名的卡顿,方法嵌套过深,或类关系过于复杂,难以定位问题。

进入sdk->tools文件夹。双击运行monitor.bat 打开device monitor:

这里写图片描述
左侧Device tab下是当前的设备名以及待调试应用的包名。在要测试某个操作(方法调用)之前,点击method profiling 按钮,弹出对话框:
这里写图片描述

输入采样间隔:

这里写图片描述

输入采样间隔,间隔越大,采集到某个方法调用栈的可能性就越小,可能漏掉某个调用栈,越小,采样精度越高(或者说覆盖率越高)但是采样间隔太小,会导致卡顿。所以需要输入一个合适的采样间隔。输入后点确认,然后在app上执行你的操作,执行完后点stop method profiling,会生成一个名为“ddms+时间戳+.trace”的文件,这个文件记录了方法的调用栈信息,这个文件是我们分析的重点:
这里写图片描述

视图中上一栏,展示了在method profile过程中并行执行的所有线程或进程。下一栏的表格展示了方法的调用信息,如方法名,所耗时间,cpu占用等。可参考:http://blog.csdn.net/androiddevelop/article/details/8223805
这里写图片描述
表格中相关列名的说明:

这里写图片描述
点击表格每一栏的名字可以进行排序,根据Name找到上述操作调用的方法,如fetchData:

这里写图片描述

Parents值得是fetchData的调用入口,而Children指的是fetchData方法中的子调用。
可以看出每个子调用或父调用的耗时情况,可以看出fetchData中的子调用fetchDataImpl耗时22.777ms,继续点击fetchDataImpl可以进入fetchDataImpl的调用栈,分析方式就同fetchData了,通过这种方式可以定位耗时操作的源头:
这里写图片描述

总结:

使用method profiling可以分析方法的调用栈,找出app的性能瓶颈。android device monitor的功能很强大,是一个工具的合集,还可以分析Heap Dump,Allocation,Network,查看Device的文件等。好的工具可以提升开发效率,科学使用工具可以事半功倍。另外推荐一款在线APP 冷启动性能分析工具:Nimbledroid 可以分析APP 冷启动的调用栈,通过他可以优化APP的启动速度,并能通过学习别的app加快启动速度的方式,提高自己app的启动速度。

以后会不定时更新,未完待续。

  相关解决方案