对于第3方应用接入到自己的应用,采取什么形式,做到方便接入,又方便维护和升级,自己想的一个解决方案如下:
现采用的是将第3方app对外的所有功能打成aar包上传到maven服务器,然后宿主app进行依赖第3方App的aar。
此方案实现步骤如下,
step 1.因为要打成aar提供给宿主app使用,第3方app在分支代码需要去掉application和入口Activity配置,在App的application生命周操作需,第3方
app需要依赖改模块,在主moudle模块的buidl.gradle文件中引用 compile 'com.xuebang.android.xhapp.thridapppublic:AppBridge:1.0.3')实现
IThirdApp的接口类。里面就有appLication的生命周期和启动第3方app的方法。完成所有方法实现之后,到这一步这就完成了对接代码的部分。
step 2.第2步就是将第3方app的所有需要提供给宿主app用到的功能moudle打包成aar上传到服务器了。将uploadaar.gradle放在整个项目的根目录下(既和settings.gradle在同一级),
将所有的需要提供给宿主App的moudle的build.gradle文件下添加如下代码apply from: '../uploadaar.gradle' 既完成了要上传moudle的aar的配置。
step 3.将如下代码写到主moudle下面build.gradle最下面(也可以是其他moudle下面)
/****************************************代码保护线************************************************/
task uploadAllAar(dependsOn:getAllUploadAarTask()){
println "上传所有的aar完成"
}
def getAllUploadAarTask(){
Set<Task> allUploadAarTasks=new HashSet<Task>();
Set<Project> allProjects= getRootProject().getAllprojects()
allProjects.each{
Project project->
Set<Task> uploadAarTasks= project.getTasksByName("uploadArchives",true)
if (uploadAarTasks!=null&&uploadAarTasks.size()>0){
allUploadAarTasks.addAll(uploadAarTasks)
}
}
return allUploadAarTasks
}
/***********************************代码保护线*****************************************************/
这脚本是用于批量执行上传aar到maven的。
step 4.到此集成完毕,只要运行一下主moudle的getAllUploadAarTask方法,就可以将你的需要提供给宿主app的arr上传到maven服务器,这样对于2方都方便维护和管理向宿主app提供的信息如下: a:将实现了IThirdApp的接口类的这个类名(需要该类的全类名,例如:com.x.x.IThirdAppImlp) b:主moudle的名字和整个工程的名字告诉宿主app的开发者
说明:1.文中的主moudle这里的主表示需要提供给宿主app的根moudle,可能工程有多个moudle 。但是像登陆的moudle这个不必要提供给宿主app,因为用不到
2.compile 'com.xuebang.android.xhapp.thridapppublic:AppBridge:1.0.3' 其实我做的一个公共模块,其实只有IThirdApp这个接口,用于app与app之间的对接代码(由第3方的app的实现,然后由宿主App来调用,其实就使用反射拿到第3方App的那个实现类在宿主App中的实现功能),代码如下:
package com.xuebang.android.xhapp.thridapppublic;
import android.content.Context;
/**
* Created by yich
*<p>
* 第3方的app实现该接口之后,把实现该接口的类名(要全路径)发给要接入的宿主app的开发者
*</p>
* Remeark:第3方app实现的接口
*/
public interface IThirdApp {
/**
* application的AttachBaseContext生命周期接口的代理
* @param base application的上下文
*/
void applicationAttachBaseContext(Context base);
/**
* application的OnCreate生命周期接口的代理
*/
void applicationOnCreate();
/**
* 用于整个App销毁时的操作
*/
void onApplicationDestory();
/***启动第3方app的方法
* @param context 上下文
* @param startParams 启动参数(理论上可以为null,第3方的App的启动方法,有些启动需要一些参数,则需第3方app与宿主app协商参数)
*/
void startMoudle(Context context, String... startParams);
}
特殊说明:由于app的buildtool和一些公用库等的引用冲突和不协调,需要双方来协调哈哈
最后uploadaar.gradle的代码如下
import org.w3c.dom.Node
apply plugin: 'maven'
//要发布的aar的版本,每次更新这里
def VERSION_NAME="1.0.0"
def maven_user_name="XXX"
def maven_user_pass="XXX"
def XML_NAME_SPACE="{http://maven.apache.org/POM/4.0.0}"
def RELEASE_REPOSITORY_URL="XXX"
uploadArchives {
repositories {
mavenDeployer {
pom.version = VERSION_NAME
pom.packaging = 'aar'
pom.withXml {
println "ARR的version的值为"+VERSION_NAME
List depens= asNode().children()
depens.each{
Node singleNode->
if (singleNode.name().toString().equals(XML_NAME_SPACE+"dependencies")){
singleNode.children().each{
Node dependNode->
if (dependNode.name().toString().equals(XML_NAME_SPACE+"dependency")){
dependNode.children().each{
Node dependChildNode->
if (dependChildNode.name().toString().equals(XML_NAME_SPACE+"version")&&dependChildNode.value().toString().equals("[unspecified]")){
dependChildNode.setValue(VERSION_NAME)
// println "version的值为"+dependChildNode.value()
}
}
}
}
}
}
}
repository(url: RELEASE_REPOSITORY_URL) {
authentication(userName: maven_user_name, password: maven_user_pass)
}
}
}
}
/**********************************************上传所有需要的上传的moudle的aar包**********************************************
* 同时执行所有上传aar的任务的project
* ****************************************************/
/*
task uploadAllAar(dependsOn:getAllUploadAarTask()){
println "上传所有的aar完成"
}
def getAllUploadAarTask(){
Set<Task> allUploadAarTasks=new HashSet<Task>();
Set<Project> allProjects= getRootProject().getAllprojects()
allProjects.each{
Project project->
Set<Task> uploadAarTasks= project.getTasksByName("uploadArchives",true)
if (uploadAarTasks!=null&&uploadAarTasks.size()>0){
allUploadAarTasks.addAll(uploadAarTasks)
}
}
return allUploadAarTasks
}
*/