实际开发中我们经常需要打一些马甲包,马甲包有不同的icon、appName、启动图等等。每次修改文件再打包费时费力,好在gradle给我们提供了一些替换资源甚至是代码的方法。
1.先看项目结构。可以看到在app目录下面新建了channels文件夹,channels下面新建channel1、channel2文件夹作为我们要打包的马甲包。
项目结构.png
2.再看channel1、channel2下的文件目录。java、res下的文件路径要与main下的路径完全一致。res下放置马甲包所需要改变的资源,如icon、strings里面的app_name,以及其他想要改变的layout、color、shape、mipmap等。
channel1结构.png
重点来了,app目录下的gradle文件配置。添加了productFlavors、sourceSets两个配置。配置好gradle,重新rebuild一下项目。
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "sample.gankers.com.gradlesample"
minSdkVersion 22
targetSdkVersion 26
versionCode 1
versionName "1.0"
flavorDimensions "versionCode"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
channel1 {applicationId "sample.gankers.com.gradlesample.channel1"}
channel2 {applicationId "sample.gankers.com.gradlesample.channel2"}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
}
sourceSets {
channel1 {
res.srcDirs = ['channels/channel1/res']
java.srcDirs = ['channels/channel1/java']
}
channel2 {
res.srcDirs = ['channels/channel2/res']
java.srcDirs = ['channels/channel2/java']
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
rebuild完成后,此时点击Androidstudio右上角gradle按钮进行马甲包打包,如图:
gradle操作.png
由于本例代码没有配置签名文件,所以我只能打debug包。点击assembleChannelDebug,等待带包完成,会在build/output下生成所需马甲包
channel1马甲包.png
把生成的马甲包安装到手机可以看到图标、名字是不同的,并且因为设置了不同的applicationid,所以2个马甲包可以同时存在。
马甲包安装图.jpg
为了验证马甲包能否修改java代码,我让马甲包1和2跳转页面代码、布局有所
不同,如图:
channel1跳转.gif channel2跳转.gif
网友评论