本章节继续讲解APP的Gradle文件的相关配置。
一.buildConfigField属性
1.作用
用于解决不同版本的APK不同的一些配置。比如Release包禁止打印Log,但是DeBug包就可以打印Log。当然我们可以在Java代码中控制。但是我们也可以使用Gradle的buildConfigField来控制。
2.语法
buildConfigField("boolean", "LOG_DEBUG_B", "true")
参数1:数值类型,这里以布尔值为例。
参数2:变量名 Java代码使用时 BuildConfig.LOG_DEBUG_B
参数3:变量值 “” 包含的一个布尔值true。
注意:如果是String类型 最外层需要设置单引号 '' 具体下面讲解
3.代码使用
APP的Gradle文件
android{
buildTypes {
release {
minifyEnabled false
applicationIdSuffix ''
versionNameSuffix '-Release-'
debuggable false
jniDebuggable false
renderscriptDebuggable false
renderscriptOptimLevel 3
signingConfig signingConfigs.release
multiDexEnabled false
//布尔值变量 LOG_DEBUG_B 变量值 false
buildConfigField("boolean", "LOG_DEBUG_B", "false")
//int变量 LOG_DEBUG_I 变量值 123
buildConfigField("int", "LOG_DEBUG_I", "123")
//String变量 LOG_DEBUG_S 变量值 "这是release包"
buildConfigField("String", "LOG_DEBUG_S", '"这是release包"')
}
debug {
minifyEnabled false
applicationIdSuffix '.debug'
versionNameSuffix '-Debug-'
debuggable true
jniDebuggable true
renderscriptDebuggable false
renderscriptOptimLevel 3
signingConfig signingConfigs.debug
multiDexEnabled false
//布尔值变量 LOG_DEBUG_B 变量值 true
buildConfigField("boolean", "LOG_DEBUG_B", "true")
//int变量 LOG_DEBUG_I 变量值 456
buildConfigField("int", "LOG_DEBUG_I", "456")
//String变量 LOG_DEBUG_S 变量值 "这是debug包"
buildConfigField("String", "LOG_DEBUG_S", '"这是debug包"')
}
}
...
}
Java代码使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
boolean isLOG_DEBUG_B = BuildConfig.LOG_DEBUG_B;
int LOG_DEBUG_I = BuildConfig.LOG_DEBUG_I;
String isLOG_DEBUG_S = BuildConfig.LOG_DEBUG_S;
Log.d("MainActivity", "isLOG_DEBUG_B----:" + isLOG_DEBUG_B);
Log.d("MainActivity", "LOG_DEBUG_I----:" + LOG_DEBUG_I);
Log.d("MainActivity", "isLOG_DEBUG_S----:" + isLOG_DEBUG_S);
}
}
4.结果
<1> Log日志 查看结果
//debug包日志
D/MainActivity: isLOG_DEBUG_B----:true
D/MainActivity: LOG_DEBUG_I----:456
D/MainActivity: isLOG_DEBUG_S----:这是debug包
//release包日志
D/MainActivity: isLOG_DEBUG_B----:false
D/MainActivity: LOG_DEBUG_I----:123
D/MainActivity: isLOG_DEBUG_S----:这是release包
<2> AndroidStudio文件查看结果
Debug包的BuildConfig文件
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.wjn.okhttpmvpdemo.debug";
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-Debug-";
// Fields from build type: debug
public static final boolean LOG_DEBUG_B = true;
public static final int LOG_DEBUG_I = 456;
public static final String LOG_DEBUG_S = "这是debug包";
}
Release包的BuildConfig文件
public final class BuildConfig {
public static final boolean DEBUG = false;
public static final String APPLICATION_ID = "com.wjn.okhttpmvpdemo";
public static final String BUILD_TYPE = "release";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0-Release-";
// Fields from build type: release
public static final boolean LOG_DEBUG_B = false;
public static final int LOG_DEBUG_I = 123;
public static final String LOG_DEBUG_S = "这是release包";
}
二.manifestPlaceholders属性
1.作用
常用于清单文件中的占位符,比如在使用谷歌地图时,可能不同的包使用的谷歌地图的Key-Value不一样。这就需要在清单文件中配置,在打包的时候根据包赋值。具体举例下面讲解。
2.语法
manifestPlaceholders.put("GOOGLE_MAP_KEY", "ADEF632455321432KLIG_Debug")
3.代码使用
清单文件
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="${GOOGLE_MAP_KEY}"/>
APP的Gradle文件
android{
buildTypes {
release {
minifyEnabled false
applicationIdSuffix ''
versionNameSuffix '-Release-'
debuggable false
jniDebuggable false
renderscriptDebuggable false
renderscriptOptimLevel 3
signingConfig signingConfigs.release
multiDexEnabled false
buildConfigField("boolean", "LOG_DEBUG_B", "false")
buildConfigField("int", "LOG_DEBUG_I", "123")
buildConfigField("String", "LOG_DEBUG_S", '"这是release包"')
manifestPlaceholders.put("GOOGLE_MAP_KEY", "ADEF632455321432KLIG_Release")
}
debug {
minifyEnabled false
applicationIdSuffix '.debug'
versionNameSuffix '-Debug-'
debuggable true
jniDebuggable true
renderscriptDebuggable false
renderscriptOptimLevel 3
signingConfig signingConfigs.debug
multiDexEnabled false
buildConfigField("boolean", "LOG_DEBUG_B", "true")
buildConfigField("int", "LOG_DEBUG_I", "456")
buildConfigField("String", "LOG_DEBUG_S", '"这是debug包"')
manifestPlaceholders.put("GOOGLE_MAP_KEY", "ADEF632455321432KLIG_Debug")
}
}
...
}
Java代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApplicationInfo appInfo;
String GOOGLE_MAP_KEY = "";
try {
appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
GOOGLE_MAP_KEY = appInfo.metaData.getString("com.google.android.maps.v2.API_KEY");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Log.d("MainActivity", "GOOGLE_MAP_KEY----:" + GOOGLE_MAP_KEY);
}
}
4.结果
<1> Log日志 查看结果
//debug包
D/MainActivity: GOOGLE_MAP_KEY----:ADEF632455321432KLIG_Debug
//release包
D/MainActivity: GOOGLE_MAP_KEY----:ADEF632455321432KLIG_Release
<2> AndroidStudio文件查看结果
Debug包
Release包
5.注意一
综上,清单文件的占位符是字符串,只不过不同的APK包字符串的内容不一致。有的时候,清单文件中的占位符需要使用ApplicationId的值。也就是说,不同的包,ApplicationId不一样,然后清单文件的占位符需要根据不同的ApplicationId赋值,那么如何实现呢?
清单文件
<provider
android:name=".MyContentProvider"
android:authorities="${applicationId}.provider"
android:enabled="true"
android:exported="false">
</provider>
APP的Gradle文件
android{
defaultConfig {
//项目默认的ApplicationId
applicationId "com.wjn.okhttpmvpdemo"
...
}
buildTypes {
release {
//release包使用项目默认的ApplicationId
applicationIdSuffix ''
...
}
debug {
//debug包使用项目默认的ApplicationId+.debug
applicationIdSuffix '.debug'
...
}
}
...
}
dubug包
release包
6.注意二
上述使用manifestPlaceholders占位符时,仅仅设置了一个值GOOGLE_MAP_KEY。其实也可以设置多个值,下面讲解。
manifestPlaceholders.put("GOOGLE_MAP_KEY", "ADEF632455321432KLIG_Debug")
清单文件
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="${GOOGLE_MAP_KEY}" />
<meta-data
android:name="MY_KEY1"
android:value="${MY_KEY1}" />
<meta-data
android:name="MY_KEY2"
android:value="${MY_KEY2}" />
<meta-data
android:name="MY_KEY3"
android:value="${MY_KEY3}" />
APP的Gradle文件
android{
buildTypes {
release {
minifyEnabled false
applicationIdSuffix ''
versionNameSuffix '-Release-'
debuggable false
jniDebuggable false
renderscriptDebuggable false
renderscriptOptimLevel 3
signingConfig signingConfigs.release
multiDexEnabled false
buildConfigField("boolean", "LOG_DEBUG_B", "false")
buildConfigField("int", "LOG_DEBUG_I", "123")
buildConfigField("String", "LOG_DEBUG_S", '"这是release包"')
manifestPlaceholders = [
MY_KEY1 : "MY_KEY1_Release",
MY_KEY2 : "MY_KEY2_Release",
MY_KEY3 : "MY_KEY3_Release",
GOOGLE_MAP_KEY: "ADEF632455321432KLIG_Release"
]
}
debug {
minifyEnabled false
applicationIdSuffix '.debug'
versionNameSuffix '-Debug-'
debuggable true
jniDebuggable true
renderscriptDebuggable false
renderscriptOptimLevel 3
signingConfig signingConfigs.debug
multiDexEnabled false
buildConfigField("boolean", "LOG_DEBUG_B", "true")
buildConfigField("int", "LOG_DEBUG_I", "456")
buildConfigField("String", "LOG_DEBUG_S", '"这是debug包"')
manifestPlaceholders = [
MY_KEY1 : "MY_KEY1_Debug",
MY_KEY2 : "MY_KEY2_Debug",
MY_KEY3 : "MY_KEY3_Debug",
GOOGLE_MAP_KEY: "ADEF632455321432KLIG_Debug"
]
}
}
...
}
Java代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ApplicationInfo appInfo;
String GOOGLE_MAP_KEY = "";
String MY_KEY1 = "";
String MY_KEY2 = "";
String MY_KEY3 = "";
try {
appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
GOOGLE_MAP_KEY = appInfo.metaData.getString("com.google.android.maps.v2.API_KEY");
MY_KEY1 = appInfo.metaData.getString("MY_KEY1");
MY_KEY2 = appInfo.metaData.getString("MY_KEY2");
MY_KEY3 = appInfo.metaData.getString("MY_KEY3");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Log.d("MainActivity", "GOOGLE_MAP_KEY----:" + GOOGLE_MAP_KEY);
Log.d("MainActivity", "MY_KEY1----:" + MY_KEY1);
Log.d("MainActivity", "MY_KEY2----:" + MY_KEY2);
Log.d("MainActivity", "MY_KEY3----:" + MY_KEY3);
}
}
结果
<1> Log日志 查看结果
//Debug包打印
D/MainActivity: GOOGLE_MAP_KEY----:ADEF632455321432KLIG_Debug
D/MainActivity: MY_KEY1----:MY_KEY1_Debug
D/MainActivity: MY_KEY2----:MY_KEY2_Debug
D/MainActivity: MY_KEY3----:MY_KEY3_Debug
//Release包打印
D/MainActivity: GOOGLE_MAP_KEY----:ADEF632455321432KLIG_Release
D/MainActivity: MY_KEY1----:MY_KEY1_Release
D/MainActivity: MY_KEY2----:MY_KEY2_Release
D/MainActivity: MY_KEY3----:MY_KEY3_Release
<2> AndroidStudio文件查看结果
Debug包
Release包