实现多渠道打包并根据渠道不同而依赖于不同的Maven项目

一、需求分析:

有三个渠道,分别为华为,小米,豌豆荚,要求三个渠道打包生成的apk项目,启动MainActivity后,点击按钮,打开同一个名称的Activity,页面分别显示为,华为,小米,豌豆荚。

二、多渠道打包:

在app的build gradle的android{}中添加以下配置:其中flavorDimensions后面的名称可以自己设置;

flavorDimensions "watchbar"
/**
 *  多渠道打包:
 *  Flavors名是以数字开头的必须加双引号,其他不需要:
 */
productFlavors {
    huawei {
        dimension "watchbar"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei"]
    }
    wandoujia {
        dimension "watchbar"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
    }
    xiaomi {
        dimension "watchbar"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
    }
    "360" {
        dimension "watchbar"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
    }
}

配置好以后,在打包签名的页面就会有选择要打包的渠道的选项。

如果不想每次都手动为每个打包好的apk改名字,也可以通过如下配置来自动改名:

app的build gradle的android{}中:

//修改apk名称
android.applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            if (variant.buildType.name.equals('release') || variant.buildType.name.equals('debug')) {
                def fileName = outputFile.name.replace(outputFile.name, "${variant.productFlavors[0].name}_${defaultConfig.applicationId}_v${defaultConfig.versionName}_${releaseTime()}.apk")
                outputFileName = new File("", fileName)
            }
        }
    }
}
android{}外:

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
三、Maven仓库的搭建:

1.搭建Nexus

下载地址:https://www.sonatype.com/download-oss-sonatype

以Mac版为例开启Nexus:

进入Nexus的bin目录并执行打开启动命令:

cd nexus-3.3.0-01/bin
./nexus start
启动后打开网址: http://localhost:8081/   

打开管理界面,默认用户名和密码分别为:admin   admin123


上述两个地址后面会用到;

2.lib项目发布到maven仓库:

gradle.properties文件中添加如下内容:

#maven仓库地址
MAVEN_REPO_RELEASE_URL=http://localhost:8081/repository/maven-releases/
MAVEN_REPO_SNAPSHOT_URL=http://localhost:8081/repository/maven-snapshots/
#登录nexus ossde的用户名
NEXUS_USERNAME=admin
#登录nexus oss的密码
NEXUS_PASSWORD=admin123
# groupid
GROUP_ID=com.evo
# type jar或aar
TYPE=jar
# 项目描述
DESCRIPTION=Maven Test Lib
maven仓库地址就是步骤一中截图的那两个地址;

在项目根build gradle中添加如下内容:

//对所有项目配置依赖的仓库地址
allprojects {
    repositories {
        jcenter()
        maven { url MAVEN_REPO_SNAPSHOT_URL }
        maven { url MAVEN_REPO_RELEASE_URL }
    }
}

//对所有子项目配置
subprojects {
    apply plugin: 'com.android.library'
    apply plugin: 'maven'
    uploadArchives {
        configuration = configurations.archives
        repositories {
            mavenDeployer {
                //配置发布到的仓库地址
                snapshotRepository(url: MAVEN_REPO_SNAPSHOT_URL) {
                    authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
                }
                repository(url: MAVEN_REPO_RELEASE_URL) {
                    authentication(userName: NEXUS_USERNAME, password: NEXUS_PASSWORD)
                }
                //项目属性
                pom.project {
                    //GROUPID+artifactId在maven中确定唯一位置
                    groupId GROUP_ID
                    //打包方式
                    packaging TYPE
                    //描述
                    description DESCRIPTION
                }
            }
        }
        task androidSourcesJar(type: Jar) {
            classifier = 'sources'
            from android.sourceSets.main.java.sourceFiles
        }
        artifacts {
            archives androidSourcesJar
        }
    }
}
在module的build gradle中添加如下配置:

//在此处复写uploadArchives,用来配置module中不同的脚本
apply plugin: 'maven'
uploadArchives {
    repositories {
        mavenDeployer {
            pom.project {
                //版本号由各个子项目进行独立配置
                //后缀加-SNAPSHOT则为快照版本,去掉为release版本,会发布至不同仓库
                //version '1.0.0-SNAPSHOT'
                version '1.0.0'
                //artifactId使用项目名
                artifactId 'maven'
            }
        }
    }
}
//执行此task,将此module进行发布
task deploy(dependsOn: uploadArchives) {}

在module的java目录中,新建一个LibActivity及对应的布局文件,在1.0.0中布局文件中的TextView上显示为“华为”,华为渠道的要引入1.0.0;


点击deploy上传;

在Nexus管理界面中检查上传成功与否;

根据以上方法(修改version)再上传两个版本分别为1.0.1,1.0.2,将页面改为小米,豌豆荚;

四、引入Maven依赖:

在项目的app build gradle的dependencies{}中添加:

huaweiCompile 'com.evo:maven:1.0.0'
wandoujiaCompile 'com.evo:maven:1.0.2'
xiaomiCompile 'com.evo:maven:1.0.1'

渠道名+Compile这样引入依赖,只会在相应的渠道引入相应的依赖;达到对应渠道依赖对应Module的目的;

并且还要将一下内容去掉:

//这句的作用是自动加载libs里的所有的.jar文件,这一句一定要去掉,否则实现不了不同渠道加载不同的jar的目的
//implementation fileTree(dir: 'libs', include: ['*.jar'])


在项目的Activity页面利用反射启动依赖包中的LibActivity,注意:(应用反射来启动,是因为LibActivity在编译的时候并没有引入程序中,不用反射会有类找不到的异常,而编译过后,程序会将相应渠道的依赖添加到项目中,可以用反射调取)

//利用反射打开activity:
String activityName = "com.evo.mylibrary.LibActivity";
Class clazz = null;
try {
    clazz = Class.forName(activityName);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
Intent intent = new Intent(this, clazz);
startActivity(intent);

在项目的build.properties文件中添加:

MAVEN_REPO_RELEASE_URL=http://localhost:8081/repository/maven-releases/
MAVEN_REPO_SNAPSHOT_URL=http://localhost:8081/repository/maven-snapshots/

项目的根目录的build gradle文件中添加:

//对所有项目配置依赖的仓库地址
allprojects {
    repositories {
        jcenter()
        google()
        maven { url MAVEN_REPO_SNAPSHOT_URL }
        maven { url MAVEN_REPO_RELEASE_URL }
    }
}

五、多渠道打包运行程序:

参照二,多渠道打包,运行程序,即可达到需求的要求。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值