对于多种类型的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
2.为每个Flavor创建对应的sourceset文件夹,目录结构同main
在build.gradle中,使用Flavor名+Compile来规定特定Flavor所需依赖:
三、不同的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需求
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中的规则文件。