android (多moudle集成aar的另一种思路)app集成第3方app的方案记录

                                
        对于第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
}
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值