Cordova安卓工程插件实现远程依赖

177 阅读3分钟

一、背景

  在H5plus项目中,主要使用Cordova技术栈。在Cordova-Android项目中,默认的插件安装方式是在Terminal中执行以下指令:

cd <cordova项目名称>
cordova plugin add <cordova插件名称>

  如果需要加载自定义插件,需要先把插件代码拷贝到项目目录中,通过执行cordova plugin add <插件名称> 把插件加载到项目当中。整个过程需要手动操作,比较繁琐,而且不符合插件远程依赖的要求,存在优化空间。而在安卓工程中,通常使用gradle这一工具来进行三方依赖库的下载和上传。如何将gradle与cordova插件安装结合在一起,优化插件安装流程,成为了一个重要的课题。

二、相关技术介绍

  1. Gradle

  Gradle属于任务驱动型构建工具,它的构建过程是基于Task的。同时Gradle也是基于DSL(领域特定语言)语法的自动化构建工具。

以下是Gradle官方的介绍:

我们只需要关注两点:
  • Gradle支持已有的Maven仓库和Ivy仓库。现阶段安卓开发主要依赖Maven仓库。
  • Gradle基于Groovy的构建脚本。Gradle是以 Groovy 语言为基础,面向Java应用为主。Gradle构建的逻辑主要位于build.gradle文件中。
  1. Cordova插件

  先带大家回顾一下Cordova。Cordova的特点可以概括为以下几点:

  • 它是一个Hybrid App开发框架
  • 本质是 HTML、CSS、JavaScript 外面包装个原生的壳
  • 出自于 Adobe 11 年收购的 PhoneGap,是驱动 PhoneGap 的核心引擎
  • 是 Apache 的顶级开源项目

上图是Cordova的一个结构图。而插件是Cordova框架中的重要组成部分,插件是一个注入代码包,它是Cordova Webview与原生APP进行通信的桥梁。插件提供了对设备和平台功能的访问,而这些功能通常是H5程序无法直接获得的。所有主要的Cordova API特性都是通过插件实现的。

三、具体实现方案

image.png

上图为改造之后的插件库结构。Android模块为Android壳工程 -> Android Library -> 插件源码的一个嵌套结构。Android壳工程为Android Library提供打包的环境,Android Library主要负责源码的打包和maven的发布。下图为cordova-plugin-mediacapture的项目结构:

image.png

mediacapture中的build.gradle内容如下:
//引入插件
plugins {
    id 'com.android.library' //library插件,我们以library为整体进行打包
    id 'maven-publish'  //把jar文件发布到maven仓库的插件,取代过时的android-maven-gradle-plugin开源库
}

//android相关配置
android {
    namespace 'org.apache.cordova.mediacapture'
    compileSdk 31

    defaultConfig {
        minSdk 23
        targetSdk 31
        consumerProguardFiles "consumer-rules.pro"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

//插件依赖项
dependencies {
        implementation 'androidx.appcompat:appcompat:1.3.0'
        implementation 'androidx.core:core-ktx:1.6.0'
        implementation 'org.apache.cordova:cordovalib:6.0.0-fix.0'
        implementation "org.apache.cordova:file:7.0.0-fix.1"
}

def aarVersion = "4.0.0-fix.0"

//maven发布配置
afterEvaluate {
    publishing {
        publications {
            maven(MavenPublication) {
                groupId = 'org.apache.cordova'
                artifactId = 'mediacapture'
                version = aarVersion
                def projectName = project.getName()
                artifact "build/outputs/aar/${projectName}-release.aar" //得上传通过gradle assemble方法生成的aar,否则无法引用具体文件
            }
        }

        // 添加仓库地址
        repositories {
            // 本地仓库
//            mavenLocal()
            // 上传到用nexus repository manager构建的私有maven仓库
            maven {
                url("https://repo.ekuaibao.com/repository/hose-cordova-plugin/")
                credentials {
                    username = ""
                    password = ""
                }
            }
        }
    }
}

同时在android目录中的settings.gradle中要添加maven地址:

四、Maven发布和远程依赖步骤

  1. Maven发布(以cordova-plugin-camera插件为例)

git clone git@git.ekuaibao.com:fe-core/2nd-library/cordova-plugin-camera.git

cd cordova-plugin-camera

cd camera

gradle assemble

更新build.gradle中的aarVersion,不更新版本号无法进行maven发布

gradle publish
  1. 添加插件远程依赖

  • 在app/build.gradle中添加依赖

  • 在app/repositories.gradle中添加maven地址

  • 在app/src/res/xml/config.xml中添加配置