[项目实践-进阶篇] 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