Android配置build.gradle解锁更高逼格玩法(多版本共存、分服务器打包等)

Android配置build.gradle解锁更高逼格玩法(多版本共存、分服务器打包等)

背景

在日常的AndroidAPP开发过程中,常常需要在同一设备上安装同一APP的多个版本。如在没有测试设备的情况下需要使用到个人设备进行测试,而该设备已安装正式版本且有大量缓存数据。applicationId作为Android对APP的唯一识别,同一applicationId仅能在一个设备上出现一次,这时就需要对APP进行多版本共存处理。

分析

Android在对于APP安装时,会首先校验applicationId是否已在设备上存在。

  1. 若不存在则直接安装;
  2. 若已存在且VersionCode>=当前APP版本,则会提示覆盖安装;
  3. 若已存在且VersionCode<当前APP版本,则会提示安装失败。
    同一项目在同一设备上运行多个版本时,需对applicationId进行处理,在AndroidStudio和Gradle未出现时,在eclipse下的常规操作是新建分支,通过改项目包名实现,此方法改动很大,每个类的package都要去改动。如今有了Gradle,采用Groovy语言,可以更简便地去配置项目。

Gradle是一个基于Apache Ant和Apache
Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。–来自百度百科

我只抓住了一点,“抛弃了基于XML的各种繁琐配置”

代码

1.建版本
首先,我们需要在APP的build.gradle中,buildTypes下建版本。

buildTypes {
        release {
           ...
        }
        debug {
            debuggable true
            ...
        }
        dev {
            ...
        }
        ...
    }

这里的版本,可以建无数多个,但debug下一定要写

debuggable true

这样AndroidStudio才能区分RunApp操作时调试的是哪一个版本。写完之后,在Build–>Generate Signed APK中,BuildType就能去选择对应的版本了。

截图

2.改Id
applicationIdSuffix可以很轻松地执行类似修改包名称的操作,原理是在defaultConfig的applicationId后面拼接内容。例如在debug版本下:

buildTypes {
       ...
        debug {
            applicationIdSuffix ".debug"
            debuggable true
            ...
        }
        ...
    }
}

同理,若需要存在N个版本,则在建立N个版本后,添加applicationIdSuffix属性即可。如:

buildTypes {
       ...
        debug {
            applicationIdSuffix ".debug"
            debuggable true
            ...
        }
        dev {
            applicationIdSuffix ".dev"
            ...
        }
        ...
        dev_n {
            applicationIdSuffix ".dev_n"
            ...
        }
        ...
    }
}

做完以上两步,如果没有配置provider的话,多版本已经可以共存。但Android7.0以后,如果要使用一些权限的话,provider是必须的。

3.provider
provider也是唯一的。这时候强大的Groovy再次登场。

buildTypes {
    release {
        manifestPlaceholders = [PROVIDER: "${defaultConfig.applicationId}.fileprovider"]
    }
    debug {
        applicationIdSuffix ".debug"
        manifestPlaceholders = [PROVIDER: "${defaultConfig.applicationId}.debug.fileprovider"]
        debuggable true
    }
}

注:${defaultConfig.applicationId}就是我们在defaultConfig中配置的,

同时,需要在manifest中替换authorities

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${PROVIDER}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>

4.APP名
我感觉。。。你可能还需要在设备上区分版本

buildTypes {
    release {
        manifestPlaceholders = [APP_NAME: "HelloWorld", PROVIDER: "${defaultConfig.applicationId}.fileprovider"]
    }
    debug {
        applicationIdSuffix ".debug"
        manifestPlaceholders = [APP_NAME: "HelloWorld测试版", PROVIDER: "${defaultConfig.applicationId}.debug.fileprovider"]
        debuggable true
    }
    dev {
        manifestPlaceholders = [APP_NAME: "HelloWorld开发版", PROVIDER: "${defaultConfig.applicationId}.dev.fileprovider"]
    }
    ...
}

同时替换manifest中,application标签下的android:lable

<application
    android:name=".application.MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="${APP_NAME}"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:replace="android:icon,android:label,android:theme">
    ...
<application/>

注:tools:replace这个属性最好加上,我之前没加,编译不通过。

综上所述,如果想替换manifest中的任何配置,则需在manifestPlaceholders中,以key-value形式编写字段,同时在manifest中以

${key-name}

的形式调用就ok了,同理我们还能够替换icon和其他例如阿里云推送的key等等。

5.服务器地址
嗯,是的,这个也是可以替换的。原理是替换BuildConfig中对应字段。 BuildConfig路径

app\build\generated\source\buildConfig\PACKAGE_NAME\android\buildType

//正式环境
def SERVER_URL_RELEASE = "\"http://release.com/\""
//开发环境
def SERVER_URL_DEBUG = "\"http://debug.com/\""

buildTypes {
    release {
        buildConfigField "String", "SERVER_URL", "${SERVER_URL_RELEASE}"
        ...
    }
    debug {
        applicationIdSuffix ".debug"
        buildConfigField "String", "SERVER_URL", "${SERVER_URL_DEBUG}"
        debuggable true
        ...
    }
    ...
}

首先定义服务器地址String,并在对应的位置指明

“字段类型”,“要替换的字段名”,“字段”

在常量文件(通常习惯性为Constants.java)中

public static final String SERVER_URL = BuildConfig.SERVER_URL;

只要字段名和字段类型能够对应,替换这些都是可以实现的。

6.APK自动命名
我们希望在打包时自动命名格式,例如:xxx_v1.2.3.apk,可在android目录下写上

android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "xxx_v${defaultConfig.versionName}.apk"
    }
}

不仅如此,build.gradle文件还有其他玩法供大家解锁,希望能集思广益、不吝分享。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值