1.原因
我是一个粗心的人,常常要上线了然后即将发上上线环境的时候,发现app采用的是app测试地址(内网),吓得一头汗。
为了避免这个问题,打算使用gradle工具设置我的apk名。当apk名有测试二字的时候,自然是测试环境,看一眼就知道错了,避免上线版本发错。
步骤如下:
1.根据不同环境,选择不同网址,此处采用enum形式:
public class UrlConfig {
public static String getMainUrl(){
MainUrlEnum mainUrlEnum = MainUrlEnum.getMainUrlByType(getDevelopType());
return mainUrlEnum.getUrl();
}
private static int kDevelopType;
public static int getDevelopType() {
if (kDevelopType == 0) {
try {
ApplicationInfo appInfo = SuperApp.getApp().getPackageManager().getApplicationInfo(SuperApp.getApp().getPackageName(), PackageManager.GET_META_DATA);
this.kDevelopType = appInfo.metaData.getInt("urlType");
} catch (PackageManager.NameNotFoundException e) {
// TODO Auto-generated catch block
ToastUtil.shorts("错误,请设置urlType!");
}
}
return
public SuperApp extends Application{
private static SuperApp app;
@Overriade
public void onCreate() {
app = this;
}
public static void getSuperApp(){
return
public enum MainUrlEnum {
TEST(1, "测试环境网址");//此处填入测试网址
REAL(2, "正式环境网址");//此处填入正式网址
//可继续追加
private int urlType;
private String url;
MainUrlEnum(int urlType, String url) {
this.urlType = urlType;
this.url = url;
}
public String getUrl() {
return url;
}
public int getUrlType() {
return urlType;
}
public static MainUrlEnum getMainUrlByType(int urlType) {
if (urlType == TEST.urlType)
return TEST;
else if (urlType == REAL.urlType)
return REAL;
return
2.在manifest进行设置,因为gradle也要设置,用${xx}形式代替
data
android:name="urlType"
android:value="${urlType}"
3.新建一个config.gradle用于设置urlType版本号信息:
ext {
android = [
versionCode: 1,
versionName: "1.0",
urlType: 1
4.在工程的build.gradle中配置config.gradle,开头加入以下代码:
apply from: "config.gradle"
5.在运行的module里面配置manifest的holder和版本:
android{
compileSdkVersion SDK版本如22
buildToolsVersion SDK版本如22.0.1
defaultConfig {
applicationId 你的包名如com.xx.xx
minSdkVersion 最低版本如9
targetSdkVersion 目标版本如22
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
manifestPlaceholders = [
"urlType":rootProject.ext.android.urlType
]
}
debug{
minifyEnabled false
manifestPlaceholders = [
"urlType":rootProject.ext.android.urlType
]
}
}
}
6.在运行的module里面配置apk信息:
android{
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
if(rootProject.ext.android.urlType == 1){
fileName = "测试项目名称${defaultConfig.versionName}.apk"
}elseif(rootProject.ext.android.urlType == 2){
fileName = "项目名称${defaultConfig.versionName}.apk"
}//可继续追加
} else if (variant.buildType.name.equals('debug')) {
fileName = "${defaultConfig.versionName}.apk"
}
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
这样,签名后(variant.buildType.name.equals(‘release’)),如果测试环境生成apk就叫做”测试项目名称1.0.apk”,正式环境叫做”项目名称1.0.apk”,一眼就看出请求地址环境了;没签名的不显示项目名称【不签名肯定不会发布的,而且没有项目名称已经很明显了】成为“1.0.apk”。而且以后别人接手也可以马上根据gradle判断出urlType含义,当环境或者渠道越多的时候,这个方式的优势越明显。
gradle 3.0不兼容问题
改动后格式如下:
android{
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = outputFileName
def fileName
if (outputFile != null && outputFile.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
if(rootProject.ext.android.urlType == 1){
fileName = "测试项目名称${defaultConfig.versionName}.apk"
outputFileName=fileName
}elseif(rootProject.ext.android.urlType == 2){
fileName = "项目名称${defaultConfig.versionName}.apk"
outputFileName=fileName
}//可继续追加
} else if (variant.buildType.name.equals('debug')) {
fileName = "项目名称.apk"//注意此处做好固定,否则aapt打包的时候容易报错
outputFileName=fileName
}
}
}
}
}
最主要是外边的variant.outputs.each改为variant.outputs.all
output.outputFile改为outputFileName
output.outputFile = new File(outputFile.parent, fileName)改为outputFileName=fileName
一下网址为Android Studio官网,如果要看请自己想办法。
参考:https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?hl=zh-cn
需选择左边菜单Configure Your Build->Migrate to Plugin 3.0.0,搜索API Changes(API变更)可以看到。