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

项目需求

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

Demo项目

工程结构

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

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 闭包下配置):

//签名配置
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输入一下命令进行打包:

> gradle build

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

Gradle命令行打出多个apk包

业务分离及资源共享

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

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

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

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

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

src\wechat\res\values\strings.xml

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

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

配置app.build的sourceSets

//资源配置
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 闭包下配置:

//打包后应用名称
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'
    }
}

打包构建

> gradle build

输出文件:

alipay_1.0_debug.apk
alipay_1.0_release.apk
wechat_1.0_debug.apk
wechat_1.0_release.apk

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/26/gradle-command-line-print-multiple-apk-packages-and-share-a-set-of-resources/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Gradle命令行打出多个apk包+共用一套资源
项目需求 因为公司的客户比较多,但是很多代码是共用的,总不能一个客户一个工程吧,这就想到,利用一套资源分别打出不同的包。 Demo项目 工程结构 需求分析……
<<上一篇
下一篇>>
文章目录
关闭
目 录