- Gradle 之Groovy基本语法(一)
- Gradle 之Groovy文件操作(二)
- Gradle 之详解Project(三)
- Gradle 之详解Task(四)
- Gradle 之初识插件(五)
- Gradle 之常用配置(六)
- Gradle 之扩展Extension类 (七)
一、resValue
在不同的模式下,生成不同的资源XML。这相当于在res / values中指定资源。这样可以在不同的版本环境下,有不同的资源值。
下面是resValue的方法:
/**
* Adds a new generated resource.
*
* This is equivalent to specifying a resource in res/values.
*
*
See Resource Types.
*
* @param type the type of the resource
* @param name the name of the resource
* @param value the value of the resource
*/
public void resValue(
@NonNull String type,
@NonNull String name,
@NonNull String value) {
ClassField alreadyPresent = getResValues().get(name);
if (alreadyPresent != null) {
String message =
String.format(
"BuildType(%s): resValue '%s' value is being replaced: %s -> %s",
getName(), name, alreadyPresent.getValue(), value);
errorReporter.handleSyncWarning(null, SyncIssue.TYPE_GENERIC, message);
}
addResValue(new ClassFieldImpl(type, name, value));
}
从源码中可以看到,resValue中需要三个参数,他们分别是如下意思:
- type : 表示资源的类型,可配置以下:
| format | 描述 | 例子|
| ------------- |:-------------:|:-------------:|
|reference|某一个资源的引用|使用 :android:background = "@drawable/back"|
|color|颜色值||
|boolean|布尔值||
|dimension|尺寸大小|使用 : android:layout_width = "1dp"|
|float|浮点值| |
|integer|整型||
|string|字符串||
|fraction|百分数|使用 : android:pivotX = "200%"|
|enum|枚举值|
|flag|按位或| - name : 表示资源名称
- value : 表示资源的值
例子:
buildTypes {
debug {
resValue "integer", "AppName", "0x23"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
在这里设置了一个integer型的资源,相应的在build/generated/res/resValues/debug/values该目录下有个generated.xml文件。
内容:
0x23
对该资源的引用和android中设置的一致。
二、buildConfigField
在BuildConfig文件生成对应的静态变量,可以根据该静态变量决定当前采用何种模式。
如:系统提供的public static final boolean DEBUG = Boolean.parseBoolean("true");
可通过BuildConfig.DEBUG 来判断当前是否是debug模式,这样就可以在debug代码中做些定制的任务。最常见的debug下log模式.
/**
* Adds a new field to the generated BuildConfig class.
*
* The field is generated as: {@code = ;}
*
* This means each of these must have valid Java content. If the type is a String, then the
* value should include quotes.
*
* @param type the type of the field
* @param name the name of the field
* @param value the value of the field
*/
public void buildConfigField(
@NonNull String type,
@NonNull String name,
@NonNull String value) {
ClassField alreadyPresent = getBuildConfigFields().get(name);
if (alreadyPresent != null) {
String message =
String.format(
"BuildType(%s): buildConfigField '%s' value is being replaced: %s -> %s",
getName(), name, alreadyPresent.getValue(), value);
errorReporter.handleSyncWarning(null, SyncIssue.TYPE_GENERIC, message);
}
addBuildConfigField(new ClassFieldImpl(type, name, value));
}
除了系统提供的默认的键值对以外,用户还可以自定义增加相应的键值对。
用法:
buildTypes {
debug {
buildConfigField "int", "CUSTOM_VERSION", "0"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
这样在debug模式下,当前module下面就会有对应的数值。
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.szyd.myapplication";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final int CUSTOM_VERSION = 0;
}
三、manifestPlaceholders和meta-data
manifestPlaceholders中文是占位符,在build脚本中设置相应的键值对,在AndroidManifest.xml中的meta-data中引用key。所以meta-data中的value在不同的模式下,value不一样。
1)、编写build中manifestPlaceholders
manifestPlaceholders的方法如下,可以看到参数接收的是Map对象。
/**
* Sets a new set of manifest placeholders.
*
* See
* Inject Build Variables into the Manifest.
*/
public void setManifestPlaceholders(@NonNull Map manifestPlaceholders) {
mManifestPlaceholders.clear();
this.mManifestPlaceholders.putAll(manifestPlaceholders);
}
所以第一步设置不同的manifestPlaceholders值:在debug和release两个模式下同一个key设置了不同的值。
buildTypes {
debug {
manifestPlaceholders = [key: "value1"]
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
manifestPlaceholders = [key: "value2"]
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
2)、AndroidManifest.xml中设置meta-data
meta-data中标签可在Application、Activity等下面设置,意味着meta-data标签是附属在该对象下。
如下:在Activity中设置了meta-data
通过${key}来获取到当前模式下的值,name意味着唯一的id,最终通过name来访问。
先看meta-data下可以设置哪些内容:
- android:name : 相当于meta-data的id,外界通过该name访问
- android:resource : meta-data的资源,类型为int
- android:value : meta-data中存储的值
3)、代码使用
因为meta-data中在Activity设置的,所以生成的是ActivityInfo。
ActivityInfo activityInfo = null;
try {
activityInfo = getPackageManager().getActivityInfo(MainActivity.this.getComponentName(), PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (activityInfo == null || activityInfo.metaData == null)
return;
String value = activityInfo.metaData.getString("myValue");
int resource = activityInfo.metaData.getInt("myValue");
源码中activityInfo.metaData是Bundle类对象。android:value是String类型,android:resource作为资源便是int类型的资源id。