Gradle命令行打出多个apk包+共用一套资源

项目需求

因为公司的客户比较多,但是很多代码是共用的,总不能一个客户一个工程吧,这就想到,利用一套资源分别打出不同的包。

Demo项目

工程结构

需求分析:现在有两个公司分别是:alipay 和 wechat,项目工程结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
src\main\AndroidManifest.xml
src\main\java\cn\appblog\MultiApk\MainActivity.java
src\main\res\layout\activity_home.xml
src\main\res\layout\activity_main.xml
src\main\res\mipmap-hdpi\ic_launcher.png
src\main\res\mipmap-mdpi\ic_launcher.png
src\main\res\mipmap-xhdpi\ic_launcher.png
src\main\res\mipmap-xxhdpi\ic_launcher.png
src\main\res\mipmap-xxxhdpi\ic_launcher.png
src\main\res\values\colors.xml
src\main\res\values\strings.xml
src\main\res\values\styles.xml

src\alipay\java\cn\appblog\MultiApk\HomeActivity.java
src\alipay\res\mipmap-hdpi\ic_launcher.png
src\alipay\res\mipmap-mdpi\ic_launcher.png
src\alipay\res\mipmap-xhdpi\ic_launcher.png
src\alipay\res\mipmap-xxhdpi\ic_launcher.png
src\alipay\res\mipmap-xxxhdpi\ic_launcher.png
src\alipay\res\values\strings.xml

src\wechat\java\cn\appblog\MultiApk\HomeActivity.java
src\wechat\res\mipmap-hdpi\ic_launcher.png
src\wechat\res\mipmap-mdpi\ic_launcher.png
src\wechat\res\mipmap-xhdpi\ic_launcher.png
src\wechat\res\mipmap-xxhdpi\ic_launcher.png
src\wechat\res\mipmap-xxxhdpi\ic_launcher.png
src\wechat\res\values\strings.xml

项目中的main是基本资源,也就是两个公司共用的资源,在src目录下新建alipay 和 wechat目录,然后建立和mian目录下相同的文件夹,暂且不放资源(xml,string)

Flavor配置

在app.bulid中进行如下配置(android 闭包下配置):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//签名配置
signingConfigs {
alipay {
keyAlias 'alipay'
keyPassword '******'
storeFile file('D:\\keyStore\\alipay.jks')
storePassword '******'
}
wechat {
keyAlias 'wechat'
keyPassword '******'
storeFile file('D:\\keyStore\\wechat.jks')
storePassword '******'
}
}

//翻译成中文就是做出不同的口味
flavorDimensions "app"
productFlavors {
alipay {
dimension "app"
applicationId "cn.appblog.MultiApk.alipay"
versionCode 1
versionName "1.0"
signingConfig signingConfigs.alipay
}
wechat {
dimension "app"
applicationId "cn.appblog.MultiApk.wechat"
versionCode 1
versionName "1.0"
signingConfig signingConfigs.wechat
}
}

lintOptions {
abortOnError false
}

可以看到我,我们为两个公司分别打包成不同的口味,然后分别配置不同的keystore,然后我在Terminal输入一下命令进行打包:

1
> gradle build

然后查看build中生成的apk包:

Gradle命令行打出多个apk包

业务分离及资源共享

1、实现不同样式的需求,在mian的MainActivity里面写一个点击跳转到HomeActivity界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package cn.appblog.MultiApk;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void toHome(View view) {
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
}
}

2、分别在alipay 和wechat 相同包下创建 HomeActivity,分别写上不同的代码:

src\alipay\java\cn\appblog\MultiApk\HomeActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package cn.appblog.MultiApk;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class HomeActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
((TextView) findViewById(R.id.tv)).setText("支付宝公司");
}
}

src\wechat\java\cn\appblog\MultiApk\HomeActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package cn.appblog.MultiApk;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class HomeActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
((TextView) findViewById(R.id.tv)).setText("微信公司");
}
}

3、在alipay 和wechat 的values目录下,创建string文件,然后分别添加

src\main\res\values\strings.xml

1
<string name="app_name">支付宝</string>

src\wechat\res\values\strings.xml

1
<string name="app_name">微信</string>

4、分别在两个目录的res/mipmap中放入两个公司的不同logo图片,命名都是相同,和main目录下的图标logo命名同样,目的就是达到替换作用

配置app.build的sourceSets

1
2
3
4
5
6
7
8
9
10
11
//资源配置
sourceSets {
alipay {
java.srcDir('src/alipay/java')
res.srcDir('src/alipay/res')
}
wechat {
java.srcDir('src/wechat/java')
res.srcDir('src/wechat/res')
}
}

配置app.build的apk输出目录及文件名

在android 闭包下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//打包后应用名称
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
if (variant.buildType.name.equals('release')) {
fileName = "${variant.productFlavors[0].name}_${variant.productFlavors[0].versionName}_release.apk"
} else if (variant.buildType.name.equals('debug')) {
fileName = "${variant.productFlavors[0].name}_${variant.productFlavors[0].versionName}_debug.apk"
}
//output.outputFile = new File(outputFile.parent, fileName)
//println fileName
outputFileName = new File('../../', fileName)
println outputFileName
}
}
}

//将打包后的apk复制到某个地方
tasks.getByName("build")<<{
copy {
from "build/outputs/apk"
into "C:\\Users\\yezhou\\Desktop\\apks"
include '*.apk'
}
}

打包构建

1
> gradle build

输出文件:

1
2
3
4
alipay_1.0_debug.apk
alipay_1.0_release.apk
wechat_1.0_debug.apk
wechat_1.0_release.apk

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :