一.多渠道sdk的验证
1.新增库验证
新建http库工程,仅包含如下一个类NetManager.java
http/src/main/java/com.tobenull.http.NetManager.java
package com.tobenull.http;
import android.util.Log;
/**
* Created by tobenull on 11/27/17.
*/
public class NetManager {
private static NetManager instance = new NetManager();
private NetManager(){}
public static NetManager getInstance() {
return instance;
}
public void init() {
Log.d("null-tobe", "NetManager->init");
}
}
修改各个库之间的依赖关系,如下
sdk->base->http
sdk/build.gradle
...
android {
...
}
dependencies {
if (rootProject.ext.debug) {
compile project(':base')
} else {
embedded project(':base')
embedded project(':http')
}
...
}
base/build.gradle
...
dependencies {
...
compile project(':http')
}
在命令窗口输入以下命令
gradle clean main
解压sdk/build/outputs/aar目录下的sdk-alibaba-release.aar和sdk-baidu-release.aar并反编译其classes.jar,均如下:
v com.tobenull
v base
> BaseManager.class
> BuildConfig.class
> TLog.class
v http
> BuildConfig.class
> NetManager.class
v sdk
> BaseSDK.class
> BuildConfig.class
> SDK.class
而且两个渠道的SDK.class中内容分别为alibaba和baidu两个渠道的源码。
经过以上的步骤,我们只是新增了一个http库并添加了依赖配置,并没有修改合并脚本相关的任何代码,最终构建得到了符合预期的sdk(将新增的http库也合并进来),由此可见,我们的合并脚本是没问题的。
2.新增渠道验证
修改sdk/build.gradle脚本,新增”tencent”渠道,如下
sdk/build.gradle
...
android {
...
productFlavors {
baidu{}
alibaba{}
tencent{}
}
...
}
...
在命令窗口执行gradle clean main命令后,展开sdk/outputs/aar/目录
v sdk
v build
...
v outputs
v aar
...
sdk-alibaba-debug.aar
sdk-alibaba-release.aar
sdk-baidu-debug.aar
sdk-baidu-release.aar
sdk-tencent-debug.aar
sdk-tencent-release.aar
...
解压sdk-tencent-release.aar包并反编译其中的classes.jar,如下
v com.tobenull
v base
> BaseManager.class
> BuildConfig.class
> TLog.class
v http
> BuildConfig.class
> NetManager.class
v sdk
> BaseSDK.class
> BuildConfig.class
因为我们没有在sdk库中新建tencent的渠道,所以打出来的sdk中只有main的内容,如果有兴趣,可以试着仿照baidu或alibaba渠道新建tencent渠道并实现SDK类供第三方调用。
经过上述步骤,我们在没有修改打版脚本的情况下只是新建了一个tencent渠道,执行构建命令就成功地生成了tencent渠道的aar包,说明我们的合并脚本是没有问题的。
二.多渠道sdk的调试
经过前面的文章,我们已经完成了sdk多渠道开发与构建的工作,sdk的调试我们会在app工程中也以多渠道的方式进行。设置{rootProject}/build.gradle中的debug为true、采用正常的库工程依赖方式,当调试没问题时上传代码,服务端设置debug为false进行sdk的多渠道构建。
在将{rootProject}/build.gradle中的debug设为true后,同步后会发现App.java中会报SDK找不到的提示,这是因为我们app工程只是依赖于sdk,没有设置对各个渠道的分别依赖,而SDK.java在sdk库的main中又不存在,需要对多个渠道进行单独依赖,如下:
app/build.gradle
dependencies {
if (rootProject.ext.debug) {
// compile project(':sdk')
baiduCompile project(path: ':sdk', configuration: 'baiduRelease')
alibabaCompile project(path: ':sdk', configuration: 'alibabaRelease')
tencentCompile project(path: ':sdk', configuration: 'tencentRelease')
} else {
...
}
...
}
在com.android.tools.build:gradle 3.0.0以前的版本,依赖默认使用的都是Compile,而多渠道中可以针对特定的渠道设置特定的依赖,如此处的baiduCompile等。
由于sdk中有多个不同的渠道,所以在进行依赖时需要指定configuration,这样当我们切换app工程中的渠道时、其依赖的sdk也会自动切换到对应的渠道上来。
此时如果报以下错:
Error:Project :app declares a dependency from configuration 'alibabaCompile' to configuration 'alibabaRelease' which is not declared in the descriptor for project :sdk.
需要确保sdk库中配置多渠道的位置设置publishNonDefault为true
sdk/build.gradle
android {
...
publishNonDefault true
productFlavors {
...
}
...
}
同步成功后,我们就可以针对不同的渠道通过app工程的调用对各渠道sdk进行调试了。
打开android studio的Build Variants窗口,默认显示如下:
module | Build Variant
app | alibabaDebug
base | debug
http | debug
sdk | alibabaRlease
运行app,打开日志过滤”null-“,demo运行日志如下:
12-16 14:46:14