Android APP的Gradle详解(二)

本章节继续讲解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包

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值