Android Gradle多渠道打包构建不同代码与依赖

1、首先我们使用Idea(AndroidStudio或者Eclipse也行)写一个Java类,简单地返回一个字符串标识:
Main.java

package com.wushaohong.jar;

public class Main {

    public static void main(String[] args) {
    }

    public String getTag() {
        return "Release";
    }
}

2、打包成一个jar(不知道如何打包jar移步搜索引擎),命名为jarRelease.jar;再将代码的getTag方法return "Release"改成return "Debug",再打包成一个jar,命名为jarDebug.jar。得到两个jar包,jarRelease.jar与jarDebug.jar。


jar包

3、AndroidStudio创建新的项目,将两个jar包,拷贝到app/libs目录下。
***注意事项看注释解释

4、配置多渠道与渠道加载依赖
app.gradle文件

    defaultConfig {
        ...

        flavorDimensions "versionCode"
    }

    buildTypes {
        ...
    }

    // 多渠道打包方式
    productFlavors {

        // 线下(测试环境)
        offline {
            versionName "offline"
            // 配置不同的String,key:config_file,value:offline.properties
            resValue("string", "config_file", "offline.properties")
        }

        // 准线上(生产环境,比如带日志等)
        beforeOnline {
            versionName "beforeonline"
            resValue("string", "config_file", "beforeonline.properties")
        }

        // 线上(发布版本)
        online {
            versionName "online"
            resValue("string", "config_file", "online.properties")
        }
    }
    
dependencies {
    // 此处是创建项目默认生成,需要注释掉,如果不注释,每次打包都会把libs目录下所有的jar包打包到apk;
    // 再者,因为我们开始生成的jar的源代码包名是一样的,会出现jar重复冲突等多种问题。
//    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ...
    // 渠道名+Implementation,指定某个渠道包引入某个依赖;
    // 这里我们线下引用Debug.jar,线上引用Release.jar。
    offlineImplementation(files('libs/JarDebug.jar'))
    beforeOnlineImplementation(files('libs/JarRelease.jar'))
    onlineImplementation(files('libs/JarRelease.jar'))
}

5、创建渠道代码(资源等),在src(main同级)目录下,分别创建与渠道名相同的文件夹,offline、beforeOnline、online。各个目录下创建与main相同的子目录/文件,java/包名(与main一致),res(资源文件夹),AndroidManifest.xml。
***当然这些不一定都要创建,具体根据实际需要就好,比如需要区分代码的,则需要java目录,区分资源则需要res目录,涉及到配置AndroidManifest.xml则需要创建。这些文件目录,在实际编译打包引用会与main进行合并。


Android Gradle多渠道打包构建不同代码与依赖_第1张图片
渠道代码/资源

创建渠道测试代码,为了使每个渠道包在main当中都能够调用PushUtils,所有这里,每个渠道都写一个结构一致的PushUtils类,实际的getToken(业务方法)可以不一样,本文为了验证渠道依赖,所以这里每个渠道都写成一样,都是调用jar包返回一个字符串标识(验证实际调用的是否为gradle配置指定的jar)。
PushUtils.java

package com.wushaohong.productflavorsapp;

import com.wushaohong.jar.*;

public class PushUtils {

    public String getToken() {
        Main t = new Main();
        return t.getTag();
    }
}

6、验证

在MainActivity当中验证结果

// 将PushUtils返回的字符串显示在文本当中
textView.setText(new PushUtils().getToken());

运行,Build Variants选择offlineDebug,文本显示Debug。这是jarDebug.jar返回的,因为我们之前gradle配置了offlineImplementation(files('libs/JarDebug.jar'));同理,选择onlineDebug运行,则文本显示Release。

Android Gradle多渠道打包构建不同代码与依赖_第2张图片
选择渠道构建

验证apk,使用assembleRelease生成各个apk,在AndroidStudio里,双击apk查看,找到对应代码,查看编译后的ByteCode。


Android Gradle多渠道打包构建不同代码与依赖_第3张图片
编译打包所有渠道

Android Gradle多渠道打包构建不同代码与依赖_第4张图片
查看apk

Android Gradle多渠道打包构建不同代码与依赖_第5张图片
查看ByteCode

7、最后,本文当中,使用assembleRelease构建出来的各个渠道包是未加签名的,如需了解配置签名打包,请移步我的另一篇文章:
https://blog.csdn.net/c_3822/article/details/95058358

你可能感兴趣的:(Android Gradle多渠道打包构建不同代码与依赖)