• [项目实践进阶篇] 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
  • 相关阅读:
    [Leetcode] Set Matrix Zeroes
    [Leetcode] Longest Valid Parentheses
    [Leetcode] Interleaving String
    [Leetcode] Surrounded Regions
    [Leetcode] Candy
    用Delphi获取当前系统时间
    Delphi窗体中禁用最大化按钮
    DELPHI关于文件的操作
    Delphi 2010初体验,是时候抛弃Delphi 7了
    双通道内存有什么优点和缺点?
  • 原文地址:https://www.cnblogs.com/youngC/p/3055116.html
Copyright © 2020-2023  润新知