美文网首页
Android Gradle多渠道打包构建不同代码与依赖

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

作者: 逗笔小新 | 来源:发表于2020-07-09 13:38 被阅读0次

    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进行合并。


    渠道代码/资源

    创建渠道测试代码,为了使每个渠道包在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。

    选择渠道构建

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


    编译打包所有渠道
    查看apk
    查看ByteCode

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

    相关文章

      网友评论

          本文标题:Android Gradle多渠道打包构建不同代码与依赖

          本文链接:https://www.haomeiwen.com/subject/tigjcktx.html