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月31日

    本月文章收录

    分类:

    Activity横竖屏切换时生命周期变化

    Android架构纵横谈之——软件自愈能力 123

    随笔之如何判断Android应用进程是否为单线程及闲扯多核并行编程

    Android中的单元测试

    SNMP协议实现系统监控

    tcpdump使用实例——基于ip统计流量

    使用c#制作网络爬虫,检查站点可访问性

    Python 代码性能优化技巧

    hadoop安装参考

    How Google Tests Software 系列

  • 2012年07月25日

    更改Android 系统区域

    分类:

    CustomLocale(位于platform/development/apps/CustomLocale)里提供了设置Android区域的方法(不需重启系统):

    1.adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es com.android.intent.extra.LOCALE en_US

    []黄色部分是你想设置的区域码

    2. 编程调用系统函数

    获取系统当前所支持的区域:getAssets().getLocales();

    IActivityManager am = ActivityManagerNative.getDefault();

    Configuration config = am.getConfiguration();

    Locale loc = null;

    ... //略去loc赋值

    config.locale = loc;

    config.userSetLocale = true;

    am.updateConfiguration(config);

    当然,这个生效需要两个权限:

     

    APK自适应系统区域改变,可参考文如何在程序中获取系统语言及修改Value-的语言Force Locale on Android

  • 2012年07月22日

    Ubuntu 12.04 配置 Android 开发环境

    分类:

    安装Java 6(可用OpenJDK替代):

    wget https://raw.github.com/flexiondotorg/oab-java6/master/oab-java6.sh -O oab-java.sh

    chmod +x oab-java.sh

    sudo ./oab-java.sh

    完成后,sudo aptitude search jdk显示“sun-java6-jdk

    sudo apt-get install sun-java6-jdk

     

    配置Java 6

    安装完成后,首先设置默认的java程序

    sudo update-alternatives --config java

    指定为java-6-sun

     

    为了编译Android Build,要求64位版本的UbuntuUbuntu 12.04上安装需要的包

    sudo apt-get install git-core gnupg flex bison gperf build-essential \

    zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \

    libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \

    libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos \

    python-markdown libxml2-utils xsltproc zlib1g-dev:i386

    sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

     

    设置Android系统可访问USB,先下载51-android.rules,然后操作即可。

     

    下载Linux版的Android SDK之后解压到一个路径,参照AndroidSDKUbuntu 下设置adb环境变量设置Android SDK环境变量:

    sudo gedit ~/.bashrc 编辑.bashrc文件,在里面加入

    #AndroidDev PATH

    export PATH=${PATH}:~/android-sdk-linux/tools

    export PATH=${PATH}:~/android-sdk-linux/platform-tools

    这样在终端输入android就可以使用Android SDKAVD Manager了。

     

    下载NDK,然后解压到一个路径,设置环境变量以便使用ndk-build程序:

    sudo gedit ~/.bashrc 编辑.bashrc文件,在里面加入

    export PATH=${PATH}:~/android-ndk-r8b

     

    下载Linux版的Eclipse,解压之后,安装插件CDTADT

    启动Eclipse,在菜单Preferences -> Android 里设置SDKNDK路径。

  • 2012年07月22日

    Ubuntu 12.04 安装

    分类:

    Ubuntu 12.04中文界面很占资源,推荐默认英文界面。

     

    VMware安装ubuntu-12.04之后,更换软件源

    1、在关机菜单处下拉,选择“有可用更新...

    2"更新管理器"中点击按钮“设置;

    3、在出来的软件源面板“下载自”,点击“中国的服务器”下拉列表,选择“其他站点”;

    4、在出来的服务器列表中的“中国”下拉列表中,选择163,然后点右下角的“选择服务器”按钮返回;

    5、关闭窗口后,出来身份验证,输入自己的登录密码后点“授权”。

     

    安装Vmware tools

    1、鼠标右键中没有“在终端中打开”,首先快捷键“Ctrl + Alt + T”打开终端,输入“sudo apt-get install nautilus-open-terminal”安装包,然后重启系统就能用鼠标右键打开终端了;

    2、安装完好ubuntu-12.04VMware Workstation菜单:VM-->Install Vmware tools...

    3、将VMwareTools-tar.gz文件解压到某个目录,如当前用户Desktop下;

    4、进入该目录,直接执行 sudo ./vmtoolsinstall.pl,所有的问题都回车。

     

    创建系统更新脚本并运行:

    1、右键打开终端,输入“gedit

    2、创建系统更新脚本:

    #!/bin/bash

    sudo apt-get update

    sudo apt-get upgrade

    sudo apt-get install ubuntu-restricted-extras

    sudo apt-get install aptitude

    sudo apt-get install synaptic

    sudo apt-get install samba

    sudo apt-get install smbfs

    sudo apt-get install gnome-session-fallback //登陆时就可选择“GNOME Classic”了

    sudo apt-get install stardict

    sudo apt-get install gconf-editor

    保存到桌面文件Update

    3、在终端中运行: sh ./Update

    说明:如果在sudo apt-get install xxx 时发生中断,再次运行此命令时可能会提示:E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    输入下面的命令:

    sudo killall apt-get

    sudo rm /var/cache/apt/archives/lock

    sudo rm /var/lib/dpkg/lock

    4、清理安装/卸载后产生的拉圾

    sudo apt-get autoremove //自动删除系统不再使用的孤立软件

    sudo apt-get autoclean //自动清理,但不会删除用于安装而下载的临时文件

    sudo apt-get clean //清理下载的临时文件

    5参照ubuntuboot分区空间不足解决办法,卸载内核:

    sudo apt-get remove --purge linux-image-2.6.24-19-generic

    --purge表示彻底删除。

    6Ubuntu 12.04下为火狐浏览器安装flash插件

  • 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倍。