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

来源:互联网 发布:mac 系统重装 编辑:程序博客网 时间:2024/05/21 15:45
                                        对于第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.Nodeapply 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} */

原创粉丝点击