原生组件

Android

开发

对于android原生组件,开发者可以使用标准的android Library进行开发,最终编译打成对应的aar文件,完成上述功能需要在build.gradle中添加必要的命令,以开发推送模块示例如下:

apply plugin: 'com.android.library'//声明该工程为android Library

ext{
outputFileName= "${project.name}_V${android.defaultConfig.versionName}.aar"
}

android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion

defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode rootProject.ext.versionCode
versionName rootProject.ext.versionName
}

buildTypes {
release {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

dexOptions {
preDexLibraries = false

}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}

sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}

task makePushGMUJar(type: Copy , dependsOn:build ) {
from('build/intermediates/bundles/release/')
into('../outputs/')
include('classes.jar')
rename ('classes.jar', "pushgmu.jar")
}

//打包输出aar
task makeAllaar(type: Copy , dependsOn:build){
from('build/outputs/aar')
into('../outputs/')
include('pushgmu-release.aar')
rename ('pushgmu-release.aar', "pushgmu.aar")
}

dependencies {
compileOnly files('../libs/jpush-android-3.1.3.jar')
compileOnly files('../libs/jcore-android-1.2.1.jar')
compileOnly 'com.hundsun2:gmubase:latest.integration'
}

扩展

  1. 在根project下新建原生Android Module工程pkg_name
  2. (参考“原生组件-开发”章节)得到输出物pkg_name.aar并置于project/libs/hundsun下
  3. 在根project下dependence.gradle中声明pkg_name的依赖,如上一节依赖本地化所说,自定义module的依赖也必须先本地化,例如:

    ext {
    pkg_name=[['../libs/dependence1.jar'],['../libs/dependence2.jar']]

    }
  4. 在pkglist.json中声明gmu名称和组件包名称的映射关系

    用户在Light平台发起集成时需要上传配置包,集成服务会根据配置包中的gmu文件和模版工程中声明的映射关系来决定app会包含哪些组件包。

    pkglist.json文件格式示例

    "pkg_name":{
    "name":"自定义原生组件",
    "android_pkg":"pkg_name",
    "ios_pkg":"pkg_name",
    "description":"该组件提供自定义原生功能",
    "jsapi" : []
    }

使用

原生组件可供原生和前端(原生组件需要提供JSBridge插件供前端调用)两端使用。

假设现在我们开发了原生组件A,组件A中提供了JSBridge插件a.getInfo。组件库中原生组件B希望在使用组件A,使用方式如下:

原生使用
  1. 原生组件B的build.gradle中添加对组件A的依赖
  2. 组件B的原生代码中调用组件A暴露的接口
前端使用
  1. 原生组件B的build.gradle中添加对组件A的依赖
  2. 组件B的前端页面中直接调用组件A提供的a.getInfo

iOS

开发

原生组件需要基于静态framework或静态.a库格式进行开发,开发者完成组件内容开发后可使用xcodebuild命令编译出包,参考脚本如下:

PROJECT_NAME="TestGMU"
TARGET_NAME="TestGMU"
PRODUCT_NAME="TestGMU"

SYMROOT_DIR="${HOME}/build"
INSTALL_DIR=${SYMROOT_DIR}/${PRODUCT_NAME}/${PRODUCT_NAME}.framework
DEVICE_DIR=${SYMROOT_DIR}/Release-iphoneos/${PRODUCT_NAME}.framework
SIMULATOR_DIR=${SYMROOT_DIR}/Release-iphonesimulator/${PRODUCT_NAME}.framework

BUILD_SETTINGS=("SYMROOT=${SYMROOT_DIR}" "PRODUCT_NAME=${PRODUCT_NAME}" "ONLY_ACTIVE_ARCH=NO")
BUILD_SETTINGS+=("-UseNewBuildSystem=NO")
xcodebuild -configuration "Release" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk iphoneos clean build "${BUILD_SETTINGS[@]}"
xcodebuild -configuration "Release" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk iphonesimulator clean build "${BUILD_SETTINGS[@]}"
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
lipo -create "${DEVICE_DIR}/${PRODUCT_NAME}" "${SIMULATOR_DIR}/${PRODUCT_NAME}" -output "${INSTALL_DIR}/${PRODUCT_NAME}"

open "${INSTALL_DIR}"

扩展

模板工程中Vendors目录下的每一个子目录都对应一个原生组件包。用户可以在该目录下新增自定义原生组件包,新增的组件包需要符合如下规范:

  1. 组件包目录下的文件类型
    • <pkg_name>.framework: 静态framework
    • lib<pkg_name>.a: 静态.a库
    • include: .a库的头文件
    • resources: 该文件夹下的所有资源会被拷贝到app bundle的根目录
    • <pkg_name>.spec: 组件依赖描述文件
  2. 组件包目录结构

    A/
    A.framework/
    resources/
    a.png
    b.bundle/
    A.spec
    B/
    libB.a
    include/
    resources/
    B.spec
  3. 在spec文件中声明组件包的依赖项

    用户可以在spec文件中声明三种类型的依赖,每一种类型的依赖项如果有多个,用空格分隔。

    • frameworks: 组件包依赖的系统库
    • libraries: 组件包依赖的系统库
    • dependencies: 组件包依赖的其它组件包

      spec文件格式示例

      frameworks="CoreTelephony"
      libraries="sqlite3 c++"
      dependencies="A B"
  4. 在pkglist.json中声明gmu名称和组件包名称的映射关系

    用户在Light平台发起集成时需要上传配置包,集成服务会根据配置包中的gmu文件和模版工程中声明的映射关系来决定app会包含哪些组件包。

    pkglist.json文件格式示例

    "web":{
    "name":"web容器",
    "android_pkg":"webgmu",
    "ios_pkg":"WebGMU",
    "description":"该组件提供前端以支持打开H5页面",
    "jsapi" : [
    {
    "module": "native",
    "name": "本地接口"
    },
    {
    "module": "head",
    "name": "导航栏控制接口"
    }
    ]
    }

使用

原生组件可供原生和前端(原生组件需要提供JSBridge插件供前端调用)两端使用。

假设现在我们开发了原生组件A,组件A中提供了JSBridge插件a.getInfo。组件库中原生组件B希望在使用组件A,使用方式如下:

原生使用
  1. B.spec中声明组件B对组件A的依赖
  2. 组件B的原生代码中引入组件A的头文件
  3. 组件B的原生代码中调用组件A提供的接口
前端使用
  1. B.spec中声明组件B对组件A的依赖
  2. 组件B的前端页面中直接调用组件A提供的a.getInfo