Android Studio Gradle的配置及打包多个不同特性的应用

Android开发中有时候会碰到打包不同特性App的需求,一般只有一些特性不同,比如App名字,App图标,App的包名,App主色调,还有一些第三方的SDK配置等。这种需求通过Gradle配置可以快速的实现。

先介绍一些Gradle的常用配置:

android {

        compileSdkVersion 24
        buildToolsVersion "24.0.1"

        //默认的一些设置
        defaultConfig {     
            applicationId "com.example.demo"    //应用包名
            minSdkVersion 15    //支持的最低版本,低于此版本的设备无法安装应用
            targetSdkVersion 19     //目标版本
            multiDexEnabled true

            ndk {   //ndk相关设置
                moduleName = "core"     //对应的C/C++文件名
                abiFilters "armeabi", "armeabi-v7a", "x86"      //支持的平台
            }

        }

        //编译的版本的一些设置,默认生成debug和release,也可以自定义
        buildTypes {    

            release {   //release版本的一些默认设置
    //            signingConfig signingConfigs.config
                minifyEnabled true      //是否进行混淆
                zipAlignEnabled true    //安装包中的资源按4字节对齐,减少应用在运行时的内存消耗
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            }

            debug {  //debug版本的设置
                applicationIdSuffix ".debug"  //包名加后缀,即生成的包名是com.example.demo.debug
            }

            //创建一个新的BuildType,名字是jnidebug,同时配置它是复制自debug Build Type;
            jnidebug.initWith(buildTypes.debug)  
            jnidebug {  
                packageNameSuffix ".jnidebug"  //添加一个不同的包名后缀
                jniDebuggable true              //配置jnidebug开启debug版本的JNI组件
            }    
        }

        //签名的一些设置
        signingConfigs {    //不同的版本可以配置不同的签名

            demo1 {
                keyAlias 'demo'
                keyPassword '111111'
                storeFile file('C:\\Desktop\\apps\\demo1.jks')
                storePassword '111111'
            }

        }
    }

下面是打包两个版本的App的配置,分别是demo1,demo2

//除了默认的配置以外还要配置不同版本的签名
signingConfigs {    //不同的版本可以配置不同的签名

     demo1 {        //版本1
         keyAlias 'demo1'
         keyPassword '111111'
         storeFile file('C:\\Desktop\\apps\\demo1.jks')
         storePassword '111111'
     }

     demo2 {        //版本2
         keyAlias 'demo2'
         keyPassword '111111'
         storeFile file('C:\\Desktop\\apps\\demo2.jks')
         storePassword '111111'
     }

}


//利用productFlavors配置不同特性的App

flavorDimensions "flavor"

 productFlavors {
     //App1
     demo1 {
         dimension "flavor"
         applicationId "com.example.demo1"  //不同的包名
         versionCode 10
         versionName "1.0"
         signingConfig signingConfigs.demo1         //demo1的签名配置

         buildConfigField "String", "App_Name", "\"我的Demo1\""   //配置一些常量,用以代码中做版本判断
         buildConfigField "String", "App_Name_En", "\"demo1\""
         buildConfigField "String", "App_Version", "\"1.0\""
     }

     //App2
     demo2 {
         dimension "flavor"
         applicationId "com.example.demo2"
         versionCode 10
         versionName "1.0"
         signingConfig signingConfigs.demo2

         buildConfigField "String", "App_Name", "\"我的Demo2\""
         buildConfigField "String", "App_Name_En", "\"demo2\""
         buildConfigField "String", "App_Version", "\"1.0\""
     }
 }

经过以上的配置以后,点击Android Studio左下角的Build Variant,可以看到一共有四个版本的App可以编译,分别是:demo1Debug、demo1Release、demo2Debug、demo2Release;而且demo1和demo2的包名不同,可以安装在同一部手机里。

不同的特性的应用往往很多东西需要改,比如名字,图标,启动图,主题色,及其他一些功能,比如推送、更新的一些设置等,而且这些都需要在AndroidManifest.xml文件中修改,一个个修改很麻烦。在Gradle中可以通过manifestPlaceholders设置,编译时动态修改AndroidManifest.xml文件配置:

//根据不同的版本配置AndroidManifest.xml文件,同productFlavors的manifestPlaceholders属性
productFlavors {
      //App1
      demo1 {
          ......

          manifestPlaceholders = ["app_name":"demo1", "app_icon":"@mipmap/icon","umeng_app_key": "111111"]

          ......

      //App2
      demo2 {
          ......

          manifestPlaceholders = ["app_name":"demo2", "app_icon":"@mipmap/icon", "umeng_app_key": "1123211"]

          .....
      }
}

//在AndroidManifest.xml文件中更改对应的属性,格式为 “${变量名}”
<application
    android:name="com.caibo_inc.happyshopping.application.HSApplication"
    android:allowBackup="true"
    android:icon="${app_icon}"
    android:label="${app_name}"

    android:theme="@style/AppTheme"
    android:windowIsTranslucent="true"
    tools:replace="android:icon,android:allowBackup">

    ......

    <meta-data
        tools:replace="android:value"   //在需要替换的属性处加tools:replace="属性名",否则会报冲突错误
        android:name="UMENG_APPKEY"
        android:value="${umeng_app_key}" />

    ......

</applocation>

除了以上的简单配置以外,还可以根据需要更改其他的一些特性,比如不同版本的App需要不同的启动图,以及更改主色等。方法是直接再Src目录下,建立一个与main同级的结构和main一样的目录,去除所有的Java代码和资源等,在需要更改的地方,比如需要修改字符串或者颜色,就重写values下的colors,或是strings文件,编译的时候同样的属性会合并替换,layout下的同名xml文件会替换。这样不同版本的App只要建立不同的目录,修改对应的资源文件即可。然后在代码中根据不同的版本做相应处理即可。

所建立的目录不能有和main中一样的类,否则会报同名冲突错误;但是可以增加类, 也就是可以增加功能。



欢迎关注我的公众号,和我一起每天进步一点点!
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值