var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2012年07月21日

    Hierarchy Viewer 揭秘

    分类:

    关于Android SDK里面自带的工具Hierarchy Viewer在前面的两篇文章Robotium 使用Android 基于屏幕坐标的录制回放工具中都有过介绍,下面就其原理做些补充。

     

    其能获取View上的层级和层里的元素属性,来自于/platform/sdk/hierarchyviewer/src/com/android/hierarchyviewer/scene源文件目录,其最最核心在文件ViewHierarchyLoader.java中的函数loadScene,它连接到本地设备向其发送“DUMP”命令,而支持“DUMP”命令的函数又来自于哪呢?搜索整个Android 4.1.1源码发现/platform/frameworks/base/core/java/android/view/ViewDebug.java中有一系列相关的定义:

    private static final String REMOTE_COMMAND_CAPTURE = "CAPTURE";

    private static final String REMOTE_COMMAND_DUMP = "DUMP";

    private static final String REMOTE_COMMAND_REQUEST_LAYOUT = "REQUEST_LAYOUT";

    private static final String REMOTE_PROFILE = "PROFILE";

    private static final String REMOTE_COMMAND_CAPTURE_LAYERS = "CAPTURE_LAYERS";

    同样在此文件函数dispatchCommand接到REMOTE_COMMAND_DUMP后调用函数dump(view, clientStream)进行处理,dump函数又调用dumpViewHierarchyWithProperties对每个View中元素属性进行列举,dumpViewHierarchyWithProperties函数调用dumpViewWithProperties进行递归,至此整个过程结束。

     

    此外,文件ViewDebug.java我们找到了一个废弃的变量TRACE_HIERARCHY,它初始值为false,为了找到其真正的作用我们向前回溯查看上个版本4.0.4源码,发现其还没被废弃其在函数startHierarchyTracingstopHierarchyTracing(这两个函数连同startRecyclerTracingstopRecyclerTracingtrace4.1.1同被弃用)中被使用,当其为false时这两函数什么也不做立即返回,阅读同一版本中的ViewDebugTest.java中的使用不难发现这个变量就是启用hierarchy跟踪的开关,再而对比4.1.1上的ViewDebugTest.java就更加坚定了我们的信心。但Hierarchy Viewer需要启动View Server以加载窗口在文件ViewServer,它需要ro.secure=0(表示root用户运行,见ppt ADB(Android Debug Bridge): How it works?), ro.debuggable=1(能用adb root重启adb;如果不是虚拟机、secure1并且service.adb.rootadb root设置为1,表示adbd可以root用户运行)Manifest.permission.DUMP权限(如果不是自己在调用)才能启用,逻辑见WindowManagerService.java中的函数startViewServer。对此,Android工程师Romain解释ViewServer不是一个公开的API并且不会在生产设备上启用,它并不设计用来交互并且它是很慢的。为了解决这个很慢的问题(实际使用Hierarchy Viewer工具”Load View Hierarchy”就能感觉到速度较慢),android-app-testing-patches为其做了补丁,其wiki上说引入了一个新命令” DUMPQ”,它不再获取每个ViewDebug标记而用成员方法” dumpClass”,比原有命令快20~40倍。

  • 2012年07月17日

    Activity启动时间

    分类:

    DDMSLogcat日志中过滤TAGActivityManager,启动应用程序即可获得其启动时间,如下:

    07-17 13:40:10.715: I/ActivityManager(146): Displayed com.android.browser/.BrowserActivity: +3s247ms

     

    其对应源码实现位于Activity Manager Service(platform/frameworks/base/services/java/com/android/server/am/ActivityRecord.java内的windowsDrawn函数),当然这种方法不能得到widget的启动时间。与之相关的文章有Android ActivityManagerService 源码分析----Activity管理()()

  • 2012年07月12日

    Android 浏览器网页加载时间测试

    分类:

    如果是自己开发的浏览器,自然是WebViewClient:计算onPageStartedonPageFinished之间的差值,WebChromeClientonReceivedTitle,具体实现见Android ---webview网页加载时间Browser.java

     

    如果浏览器不是自己开发的,则我想可以可以打开DebugFlags.WEB_VIEW_CORE,其具体定义见android webkit 打开debug调试信息,这样webcore就可以在logcat中输出相应的调试信息。而实现这需要修改一下该Android平台对应ROMframework,编译APK时倒入修改好的android.jar包就行了。

  • 2012年04月17日

    开源Android logcat保存APK

    分类:

    主要用做长时间抓取android日志时电脑同设备usb连接中断导致日志不完整,于是要从手机端保存日志到sdcard上。

    1. aLogcat

    2. KyoroHelloAndroid

    3. android-log-collector

     

    经过实验证实以上安装在android设备中的APK都不能彻底解决问题,最后还是通过PC端控制解决此问题。另外*nix上运行不容易断,如Ubuntu。

  • 2012年03月26日

    Android SDK直接下载

    分类:

    官方Android SDK for windows通常可以从http://dl.google.com/android/android-sdk_r*-windows.zip下载,但这个地址下载的sdk中不包括platform-toolsplatform等关键性文件夹,这些文件通常是从下载的android-sdk-windows中启动AVD Manager.exe进行下载的,而国内访问Google站点速度等时常得不到保证,导致下载时间无限期延长。通过观察Android SDK Manager窗口,点击其上的Log窗口,可以发现各个组件的名字,组件的名字可以从addon.xmlrepository.xml两个文件中得出;https://dl-ssl.google.com/android/repository/addons_list-1.xmlhttps://dl-ssl.google.com/android/repository/repository-5.xml,其中xml其前的数字是变化的,具体可以在启动AVD Manager窗口之后查看其日志窗口得到。

     

    Android sdk组件都位于同一目录下,即:http://dl-ssl.google.com/android/repository/,从上面获取各个组件的名字,就可以知道组件的下载地址,然后就可以直接通过下载工具下载了。

     

    最新的android-sdk_r17-windowsWin7 X64系统下运行时提示错误

    Failed to convert path to a short DOS path: C:\Windows\system32\java.exe

     

    ERROR: No suitable Java found. In order to properly use the Android Developer

    Tools, you need a suitable version of Java JDK installed on your system.”这是由于r17重写了find_java.bat,临时解决方案是用r16find_java.bat替换这个版本,就可以成功运行了。Google的产品质量啊!