您的位置:首页 > 其它

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

2017-09-01 14:10 337 查看
一、需求分析:

有三个渠道,分别为华为,小米,豌豆荚,要求三个渠道打包生成的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
ce14
.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 }
}
}


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

参照二,多渠道打包,运行程序,即可达到需求的要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: