Gradle篇_构建不同的app

对于多种类型的apk包构建,通常有以下需求:


1、各版本有不同的代码、资源
2、上述代码中各版本有不同的依赖
3、各版本有不同的Manifest中元素需求
4、各版本有不同的proGuard


Android Studio中使用Gradle编译多种apk包需要靠productFlavors或者buildTypes实现,如果有两种product flavor和两种build type,则他们可以生成2*2=4种不同类型的apk包。下文主要使用productFlavors自定义apk内容,而buildTypes使用默认配置用于处理debug版本和release版本。
一、不同的代码和资源
要实现build时使用不同的代码和资源:


在build文件中定义productFlavors
为每个Flavor创建对应的文件夹
将每个Flavor特有的文件放入文件夹
1.在build文件中定义productFlavors
android {
    ...
    defaultConfig { ... }
    signingConfigs { ... }
    buildTypes { ... }
    productFlavors {
        dev {
		    minSdkVersion 21
            applicationId "com.study.gradle.dev"
			versionNameSuffix 'dev'
        }
        prod {
		    minSdkVersion 14
            applicationId "com.study.gradle"

        }
    }
}
其中defaultConfig{}中为默认值,productFlavors{}会覆写所有可以覆写的值。

2.为每个Flavor创建对应的sourceset文件夹,目录结构同main


调试的时候请选择不同的BuildVariants,否则文件夹为普通文件夹样式,和main的资源目录不一样。


二、不同的依赖
在build.gradle中,使用Flavor名+Compile来规定特定Flavor所需依赖:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
	//devCompile 就包括了devDebugCompile和devReleaseCompile,也可以单独指定
    devCompile 'com.android.support:design:22.2.0'
    prodCompile 'com.jakewharton:butterknife:6.1.0'
}

三、不同的Manifest需求
Manifest可以通过Merge的方式合并多个Manifest源。通常来说,有三种类型manifest文件需要被merge到最终的结果apk,下面是按照优先权排序:
1、productFlavors和buildTypes中所指定的manifest文件
2、应用主manifest文件
3、库manifest文件
简单来说,manifest的merge会将每个元素及其子元素的节点和属性进行合并。
例如:
<activity
   android:name=”com.foo.bar.ActivityOne”
 android:theme=”@theme1”/>

<activity
   android:name=”com.foo.bar.ActivityOne”
 android:screenOrientation=”landscape/>
合并会成为
<activity
   android:name=”com.foo.bar.ActivityOne”
 android:theme=”@theme1”
 android:screenOrientation=”landscape/>
 
不过
<activity
   android:name=”com.foo.bar.ActivityOne”
 android:theme=”@theme1”/>

 <activity
   android:name=”com.foo.bar.ActivityOne”
 android:theme=”@theme2”
 android:screenOrientation=”landscape/>
合并会产生一个冲突,因为都有theme,而theme的属性不同。
要了解manifest合并的更高级应用,查看 Manifest Merger

四、不同ProGuard需求
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFile getDefaultProguardFile('proguard-android.txt')
        }
    }

    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'some-other-rules.txt'
        }
    }
}

Android Studio将使用所有的定义在相应buildTypes和相应productFlavors中的规则文件。

参考:
使用gradle打包多个变体
Gradle配置最佳实践
Manifest合并规则

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值