Archive for the 'Android' Category

用 Ant 编译 Android 工程及定制的方法

2012-3-5 04:06 | by 2ndboy

  通常开发和编译 Android 程序都在 Eclipse 里完成,但是这样不太方便对工程做持续集成,而且也不方便对编译过程做些自定义的控制。当然可以在了解 Android 程序完整的编译、打包和签名过程后全部自己用 script 搞定,但更好的方法是用类似 Ant 或者 Maven 这类编译工具来做,Android 对 Ant 支持的不错,官方文档可以参考“Managing Projects from the Command Line”和“Building and Running from the Command Line”。另外还有这篇“Using Ant to Automate Building Android Applications”也非常值得一看,不过由于 Android SDK 的持续更新,里面有些内容已经不再适用,下面就 share 一下我用 Ant 编译 Android 工程的一些过程和心得。

  我的工程使用了 ActionBarSherlockViewPagerTabs(和工程文件夹位于同级目录中。鉴于这两个库实现的效果和质量,他们被使用在同一个工程中的几率还是很高的),已经可以在 Eclipse 里正常编译和运行,为了用 Ant 编译,首先要产生 build.xml 文件,但是在这之前还要做一件事。ViewPagerTabs 引用了 Support Package,而 ActionBarSherlock 自己内含了一份 Support Package 的源码,用 Eclipse 是可以顺利编译的,但是如果不做任何处理的话,用 Ant 编译时就会遇到某 class 已经存在之类的问题。

  首先需要删除位于 ViewPagerTabs 的 libs 目录下的 android-support-v4.jar,然后让 ViewPagerTabs 引用 ActionBarSherlock 即可,看起来简单,但是这个问题让我这个从没用过 Ant 的菜鸟折腾了一天才搞定,惭愧惭愧。

  生成 build.xml 的步骤如下:

  • 进入 ActionBarSherlock 文件夹,执行 android update lib-project –path .
  • 进入 ViewPagerTabs 文件夹,执行 android update lib-project –path .
  • 进入工程主文件夹,执行 android update project –path .

  由于先期已经在 Eclipse 里面做了编译,所以主工程目录中的 project.properties 里已经添加过了对其它库的引用,所以为主工程生成 build.xml 时不需要再加 –package 来添加引用库的位置了。上述命令执行以后,工程目录里多了两个文件:build.xml 和 local.properties。前者对于刚刚接触 Ant 的人来说,信息量比较大,而 local.properties 里面只是简单的记录了 Android SDK 的位置,而且由于这个文件是工具自动生成的,所以不要把它 check in 到版本控制系统里去。

  接下来到主工程所在目录执行 ant debug 或者 ant release 就可以顺利编译了。

  接下来看看定制 build.xml,上面提到的那篇“Using Ant to Automate Building Android Applications”里面提到的方法其实太过复杂,我们不用把系统 build.xml 里面的内容都复制到本地 build.xml,而是只需要在本地 build.xml 里增加一个 pre-compile 就可以了,增加的内容如下:

  1. <property file="build.properties" />
  2.  <target name="-pre-compile">
  3.      <copy file="config/Config.java" todir="${source.dir}/com/2ndboy/App" overwrite="true" encoding="utf-8">
  4.          <filterset>
  5.              <filter token="CONFIG.FOO" value="${config.foo}"/>
  6.          </filterset>
  7.      </copy>
  8.  </target>

在主工程目录下新建一个名为 config 的目录,里面有个名为 Config.java 的文件,内容如下:

  1. public class Config
  2.  {
  3.      public final static boolean freeVersion = @CONFIG.FOO@;
  4.  }

这个 Java 源文件里的 CONFIG.FOO 会被 build.xml 里的新增部分在编译期间用 ${config.foo} 的内容替换掉,而 ${config.foo} 的定义在 build.properties 里面:

  1. config.foo=false

Ant 的深入使用又牵扯到一大堆东西,这里只是浅尝辄止而已,学无止境!

从 Android 手机上获取 apk 文件

2012-1-19 06:00 | by 2ndboy

  由于某些原因,需要把某 app 的 apk 拿到,装在 PC 上的模拟器里,然后对其网络通讯进行嗅探。开始的想法是在模拟器里装 Android market,然后就可以把 app 下载到模拟器里了,但是跟着网上的 step by step 指南做了 n 遍都未能成功。也许是版本问题?又或许 Google 对这招进行了封堵?此招不成后在用 Google search 过程中找到了另外一种方法,现记录如下:

  这个方法需要你有个真机,这里以我手上的 Samsung Galaxy S II(SGH-I777)为例进行说明。首先在真机上打开 market,下载 AppInstaller 这个 app,需要注意的是 market 里有另外一款名字相同,图标也差不多的 app,所以你需要下载由 FunTrigger 出品的 AppInstaller。

  然后需要确认你手机的 USB debugging 模式处于关闭状态。具体设置在:Setting、Application、Development。

  打开 AppInstaller,切换到 Manage App 页,找到你要扒的 app,长按之,在弹出的菜单里选择 Export 就可以了。

  最后用 mini USB 线把 Samsung Galaxy S II 连上 PC 机,我的电脑里会出现一个 SGH-I777 的图标,双击之,在 Phone 下面就会找到刚才导出的那个 app 的 apk 文件了。

  拿到 apk 以后,你可以打开模拟器,在命令行下用 adb install foo.apk 把这个 app 安装到模拟器里面。

Support Package 和 ActionBarSherlock 使用心得

2011-12-16 14:09 | by 2ndboy

  Action BarViewPager 出现以后,使得 Android 程序 cool 了很多。简单的说,ViewPager 使得实现手指横向划过屏幕来切换场景变得简单,这种切换方式在触摸屏上非常符合直觉,远胜 button 跟 tab 的体验。Action Bar 则提供了更为直接快捷的常用功能访问途径,在没有实体 menu 按键或者屏幕尺寸比较大的时候可以有更好的使用体验。

  在没有 ViewPager 之前,各路神仙使用了各种办法来尝试实现平滑的视图切换,目前 ViewPager 已经进入 Support Package,得到了 Google 的官方支持。当然,Support Package 里的好东西还有大把,比如为使用 Honeycomb(Android 3.0.x;API Level 11)之前的开发者准备的 Fragment 等等。不过 Support Package 里目前并不包含 Action Bar,于是网上也出现了一些开源的 Action Bar 实现,比如 android-actionbarGreenDroid 以及 今天要写的 ActionBarSherlock

  ActionBarSherlock 其实内置了一份 Support Package,所以并不需要在你自己的程序中再次引用 Support Package,如果已经做了引用,则需要去掉。ActionBarSherlock 需要使用 Android 3.2 SDK(API Level 13)进行编译,你的程序也需要至少 API Level 13 进行编译,但是编译出来的程序可以跑在 2.3 的系统上,并在低版本的系统上实现 Action Bar 和 ViewPager。

  ActionBarSherlock 目前的最新版本是 v3.4.2,假设我们下载后把它释放在 E:\2ndboy\Android\ActionBarSherlock。ActionBarSherlock 不提供 jar 包下载,因为它内含的资源无法以 jar 的形式使用,所以要单独编译成 library 后被需要使用的程序引用。

  释放后打开 Eclipse,菜单 File,New,Project…。选中 Android 下的 Android Project,Next。接着在 New Android Project 对话框里选中 Create project from existing source。Project Name 填 ActionBarSherlock。Location 使用 E:\2ndboy\Android\ActionBarSherlock\library,Next。在 Select Build Target 对话框中选中 Android 3.2(API Level 13),Finish。

  如果遇到找不到 AndroidManifest.xml 的错误,可以尝试把 E:\2ndboy\Android\ActionBarSherlock 改名,出错原因是 Eclipse 其实是尝试在 ActionBarSherlock 下创建 project(因为我们指定的 Project Name 也叫 ActionBarSherlock),而不是 ActionBarSherlock\library。

  如果看到很多类似“Description Resource Path Location Type
The method add(CharSequence) of type Menu must override a superclass method Menu.java /ActionBarSherlock/src/android/support/v4/view line 5 Java Problem”的错误,可能需要在 Project Properties 里面,把 Java Compiler 的 Compiler compliance level 改成 1.6。

  以上就准备好了 ActionBarSherlock 库。接下来新建一个 Android Project,Select Build Target 时选 Android 3.2 或者更新的版本,Application Info 里面,Minimum SDK 指定一个你需要的最低版本,比如 4(Android 1.6)。

  建好新工程以后我们把 ActionBarSherlock 引入这个 project 里,让这个 app 可以支持 Support Package 和 Action Bar。Project Properties,Android。在 Library 里点 Add…,选中 ActionBarSherlock(这时 ActionBarsherlock 需要在 workspace 里面,并处于打开状态),Ok。

  加好以后如果发现 R class 没有生成(提示 R cannot be resolved to a variable),同时注意到新工程里引用的 Android SDK 低于 Android 3.2 的话,要进入 Project Properties,Android,在 Project Build Target 里选择 Android 3.2 或者更高版本,修改完成后最好 Close Project 后重新打开。

  以上就是编译 ActionBarSherlock 并集成到自己 project 的全过程,我这个 Android 菜鸟摸索了半天才搞定,不容易啊:D 下面简单介绍下 code 部分。

  使用 Action Bar 的 Activity 需要继承自 FragmentActivity,并且在 AndroidManifast.xml 里要指定 Activity 的 theme,示例如下:

  1. <activity
  2.      android:label="@string/app_name"
  3.      android:name=".2ndboy"
  4.      android:theme="@style/Theme.Sherlock" >

  获取 Action Bar 实例要用 getSupportActionBar(),而不是 getActionBar()。由于 ActionBarSherlock 已经自带了一份 Support Package,所以我们不需要再去引入就可以直接使用 ViewPager 和 Fragment 了。Action Bar 上可以加 tab,跟 ViewPager 的 swipe 实现联动,此外 Android-ViewPagerIndicator 也是一个可参考的不错的开源库,用来实现 ViewPager 的各种指示器效果。

Android 应用程序的生命周期

2007-11-18 11:41 | by 2ndboy

【译自:http://code.google.com/android/intro/lifecycle.html

  大多数情况下,每个 Android 程序都运行在自己的 Linux 进程空间里。当程序代码需要运行的时候进程就被创建出来,在程序已不在被使用或者系统需要回收其所占内存再分配给其它程序使用之前,这个进程一直存在。

  Android 的一个非常重要且不同寻常的特性就在于应用程序进程的的生命期由不得它自己直接控制。应用程序生命期由系统通过对如下几个条件的组合来裁决:系统知道应用程序的一部分正在运行,应用程序正在处理的事情对用户有多重要,系统中的可用内存还有多少。

  对应用程序开发者来说,理解各个组件(特别是Activity,Service 和 IntentReceiver)对应用程序生命期的不同影响是非常重要的。对组件不正确的使用可能会导致应用正在处理重要事务时被系统干掉。

  对进程生命期处理不当的一个常见例子是一个 IntentReceiver 在其 onReceiveIntent() 方法中接收到一个 intent 时启动了一个线程,接着就从 onReceiveIntent() 中返回了。一旦这个函数返回,系统就会认为这个 IntentReceiver 不再活动,因此它的宿主进程也就不会再被用到了(除非其内部的其它应用程序组件处于激活状态)。这时系统可能随时干掉这个进程,终止运行于其中的线程以回收内存。对这个问题的解决方案是在这个进程中启动一个 Service,这样系统就知道这个进程中仍然有些工作在做。

  为了在内存不足时裁决哪个进程应该被干掉,Android 会根据运行在进程中的组件和和组件的状态给进程们排出一个重要级别来。这些重要级别按重要性来排列依次是:

1. 前台进程就是在屏幕顶层,持有 Activity 正在跟用户进行交互的(其 onResume() 已经被调用过),或者是一个正在运行的 IntentReceiver(其 onReceiveIntent() 方法正在执行)进程。这样的进程在系统中非常少,只有当内存非常短缺,短缺到了连这些进程都无法继续运行的时候这类进程才会被干掉。通常此时移动设备已经到达了内存极限,这样做才能让用户界面不停止响应。

2. 可见进程就是持有 Activity,在屏幕上可见但又不是前台进程的那个进程(他的 onPause() 方法被调用过)。……

3. 服务进程……

4. 后台进程……

5. 空进程……

未完……