[项目实践-进阶篇] Android 项目中使用Ant + Groovy能干什么?

提出问题:

使用Ant + Groovy 编译生成不同环境的APK包 (例如,prod、uat、qa、dev)

问题描述:默 认情况下,项目的package为 ”com.vmn.app.crm”,我们需要在编译的时候同时生成package 为”com.vmn.app.crm.uat”、”com.vmn.app.crm.qa”、”com.vmn.app.crm.dev”的APK,如此 我们在同一个测试机器上就能同时安装prod、uat、qa、dev四个环境的APK。

问题分析:要实 现上面提出的问题,我们需要在编译前,需要动态修改AndroidManifest.xml里面的package值,由于package值改变了,那么编 译后生成的R的路径也就随之改变了,因此我们还需要动态修改*.java文件中R的package路径,与此同时,为了便于区分不同环境的APK,我们还 需要动态修改res/values/strings.xml中的app_name值。

注意:此处实际上 我们只是动态修改了AndroidManifest.xml里面的package值,而实际上项目工程中的package没有变动,因此在 AndroidManifest.xml文件里面,我们指定application、activity、provider、service等时,不能使用 相对路径(相对AndroidManifest.xml里面的package值),而需要使用绝对路径。

使用 Ant + Groovy 编译时根据项目配置文件信息确定应用日志显示等级以及是否Debug

问题描述:项 目中,我们可能有引入config.xml文件,该文件中包含了一些项目相关的配置信息,比如,该项目的log level、运行环境env (prod/uat/qa/dev)、supported features等信息,编译时我们根据log level信息确定应用日志显示等级,根据env确定应用是否能够Debug。

问题分析:我们可以自定 义一个Logger类,config.xml中的log level用于控制Logger显示等级。根据env我们可以在编译前动态修改AndroidManifest.xml的 <application>的android:debuggable属性值。

使用Ant + Groovy 编译时根据不同的环境,动态引入library

问题描述:项目中我们使用到的Chart使用到了Adobe AIR技术,由于Adobe AIR运行需要而外的运行环境,即在运行我们项目的Chart时,需要该设备上存在Adobe AIR运行环境。

问题分析:如 此我们提供了两种方案:一、将Adobe AIR的运行环境包在我们项目中;二、不将Adobe AIR的运行环境包在我们的项目中,提示用户去下载安装Adobe AIR运行环境。第二种方案的提出原因有很多,比如Adobe AIR包在我们项目中后,项目从size上变得很庞大,另一方面可以涉及到版权问题。

项目实践:

根据上面提出的问题,下面我将从代码角度出发,具体展示Ant + Groovy是如何实现的。这篇文章中没有涉及到Ant和Groovy细节的讲解,如果有不明白的地方,可以从官网上获取帮助。

项目准备:

ACRM
|- res
  |- values
    |- strings.xml
  |- xml
    |- config.xml
|- AndroidManifest.xml
|- build.xml
|- env-process.groovy

各文件内容清单如下:

strings.xml

<string name="app_name">ACRM</string>

config.xml

<vmness>
    <!-- VERBOSE|DEBUG|INFO|WARN|ERROR|FATAL -->
    <log level="DEBUG"/>
    <env type="prod"/>

    <supported-features>
        <feature name="chart"/>
    </supported-features>
</vmness>

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.vmn.app.crm"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="17" />
    <application
        android:name="com.vmn.app.crm.CrmAPP"
        android:debuggable="true"
        android:icon="@drawable/crm_app_icon"
        android:label="@string/crm_app_title" >
        <activity
            android:name="com.vmn.app.crm.activity.MainViewActivity"
                android:label="@string/cv_string_app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

代码展示(核心代码)

在build.xml脚本中调用env-process.groovy脚本

<target name="replace-android-resources" depends="resolve">
  <groovy src="${basedir}/env-process.groovy"></groovy>
</target>

env-process.groovy

View Code

 

你可能感兴趣的:(android)