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' }
扩展
在根project下新建原生Android Module工程pkg_name
(参考“原生组件-开发”章节)得到输出物pkg_name.aar并置于project/libs/hundsun下
在根project下dependence.gradle中声明pkg_name的依赖,如上一节依赖本地化所说,自定义module的依赖也必须先本地化,例如:
ext { pkg_name=[['../libs/dependence1.jar'],['../libs/dependence2.jar']] }
在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,使用方式如下:
原生使用
原生组件B的build.gradle中添加对组件A的依赖
组件B的原生代码中调用组件A暴露的接口
前端使用
原生组件B的build.gradle中添加对组件A的依赖
组件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目录下的每一个子目录都对应一个原生组件包。用户可以在该目录下新增自定义原生组件包,新增的组件包需要符合如下规范:
组件包目录下的文件类型
<pkg_name>.framework
: 静态framework
lib<pkg_name>.a
: 静态.a库
include
: .a库的头文件
resources
: 该文件夹下的所有资源会被拷贝到app bundle的根目录
<pkg_name>.spec
: 组件依赖描述文件
组件包目录结构
A/ A.framework/ resources/ a.png b.bundle/ A.spec B/ libB.a include/ resources/ B.spec
在spec文件中声明组件包的依赖项
用户可以在spec文件中声明三种类型的依赖,每一种类型的依赖项如果有多个,用空格分隔。
在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,使用方式如下:
原生使用
B.spec中声明组件B对组件A的依赖
组件B的原生代码中引入组件A的头文件
组件B的原生代码中调用组件A提供的接口
前端使用
B.spec中声明组件B对组件A的依赖
组件B的前端页面中直接调用组件A提供的a.getInfo