uni-app和原生App混合开发问题
首先务必确认uni-app和原生代码,谁是主谁是从的问题。
1、如果你的应用是uni-app开发的,需要扩展一些原生能力,那么首先去插件市场看看有没有现成的插件,如果没有,就自己开发,开发文档请参考原生插件开发教程https://nativesupport.dcloud.net.cn/NativePlugin/course/android。
2、如果你的App是原生开发的,部分功能栏目想通过uni-app实现,有2种方式:
- 在原生App里集成uni小程序sdk,参考:https://nativesupport.dcloud.net.cn/README,相当于原生app拥有了小程序能力。
- 如果不想集成原生sdk,那就把uni-app代码发布成H5方式,在原生App里通过webview打开。
原生插件开发
现在我们只讨论第一种情况,应用是uni-app开发的,需要扩展一些原生能力,即原生插件开发。
开发者须知
- 已经具备了相应Android应用开发经验,使用Android Studio开发过Android原生。
- 也应该对HTML,JavaScript,CSS等有一定的了解, 能开发uni-app。
开发环境
- JAVA环境 jdk1.8
- Android Studio
- App离线SDK下载:请下载2.9.8+版本的android平台SDK
注意
- 插件目前暂时不支持Kotlin
- gradle版本注意事项
HX3.0.0+版本云打包及相应版本SDK都将gradle版本4.6-all升级到6.5-all,tools.build:gradle版本3.2.1升级到4.1.1。
步骤
一、uni-app端
既然以uni-app开发主体,首先要有一个uni-app项目,新建项目testApp。
扩展 Module
Module 扩展 非 UI 的特定功能
创建Android Studio的Module模块
- 在现有Android项目中创建library的Module。例如uniplugin_module
- 配置刚创建的Module的build.gradle信息。
示例:
//导入aar需要的配置
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
//必须添加的依赖
compileOnly 'com.android.support:recyclerview-v7:28.0.0'
compileOnly 'com.android.support:support-v4:28.0.0'
compileOnly 'com.android.support:appcompat-v7:28.0.0'
compileOnly 'com.alibaba:fastjson:1.1.46.android'
compileOnly fileTree(include: ['uniapp-v8-release.aar'], dir: '../app/libs')
}
Tips:
uniapp-v8-release.aar是扩展module主要依赖库,必须导入此依赖库!
创建TestModule类
Module 扩展必须继承 UniModule 类
示例:
public class TestModule extends UniModule
- 扩展方法必须加上@UniJSMethod (uiThread = false or true) 注解。UniApp 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。
- UniApp是根据反射来进行调用 Module 扩展方法,所以Module中的扩展方法必须是 public 类型。
示例:
//run ui thread
@UniJSMethod(uiThread = true)
public void testAsyncFunc(JSONObject options, UniJSCallback callback) {
Log.e(TAG, "testAsyncFunc--"+options);
if(callback != null) {
JSONObject data = new JSONObject();
data.put("code", "success");
callback.invoke(data);
}
}
//run JS thread
@UniJSMethod (uiThread = false)
public JSONObject testSyncFunc(){
JSONObject data = new JSONObject();
data.put("code", "success");
return data;
}
同样因为是通过反射调用,Module 不能被混淆。请在混淆文件中添加代码:
-keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}
Module 扩展的方法可以使用 int, double, float, String, Map, List ,com.alibaba.fastjson.JSONObject 类型的参数
二、原生android端
同样新建一个项目
插件调试
本地注册插件
以上两种方式选一即可
- 第一种方式
在UniPlugin-Hello-AS工程下 “app” Module根目录assets/dcloud_uniplugins.json文件。 在moudles节点下 添加你要注册的Module 或 Component - 第二种方式
创建一个实体类并实现UniAppHookProxy接口,在onCreate函数中添加组件注册相关参数 或 填写插件需要在启动时初始化的逻辑。
在UniPlugin-Hello-AS工程下 “app” Module根目录assets/dcloud_uniplugins.json文件,在hooksClass节点添加你创建实现UniAppHookProxy接口的实体类完整名称填入其中即可 (有些需要初始化操作的需求可以在此处添加逻辑,无特殊操作仅使用第一种方式注册即可无需集成UniAppHookProxy接口)
public class RichAlert_AppProxy implements UniAppHookProxy {
@Override
public void onCreate(Application application) {
//当前uni应用进程回调 仅触发一次 多进程不会触发
//可通过UniSDKEngine注册UniModule或者UniComponent
}
@Override
public void onSubProcessCreate(Application application) {
//其他子进程初始化回调 可用于初始化需要子进程初始化需要的逻辑
}
}
dcloud_uniplugins.json说明
nativePlugins: 插件跟节点 可存放多个插件
hooksClass: 生命周期代理(实现AppHookProxy接口类)格式(完整包名加类名)
plugins: 插件数组
name : 注册名称
class : module 或 component 实体类完整名称
type : module 或 component类型。
{
"nativePlugins": [
{
"hooksClass": "uni.dcloud.io.uniplugin_richalert.apphooks",
"plugins": [
{
"type": "module",
"name": "DCloud-RichAlert",
"class": "uni.dcloud.io.uniplugin_richalert.RichAlertModule"
}
]
}
]
}
集成uni-app项目测试插件
-
安装最新HbuilderX 大于等于1.4.0+
-
创建uni-app工程或在已有的uni-app工程编写相关的.nvue 和.vue文件。使用uni-app插件中的module 或 component。
-
xxx.vue 示例代码(源码请参考UniPlugin-Hello-AS项目中uniapp示例工程源码文件夹的unipluginDemo工程)
-
选择 发行—>原生APP-本地打包—>生成本地打包App资源 等待资源生成!
-
在控制台会输出编译日志,编译成功会给出App资源路径
-
把APP资源文件放入到UniPlugin-Hello-AS工程下 app Module根目录assets/apps/测试工程appid/www对应目录下,再修改assets/data/dcloud_control.xml!修改其中appid=“测试工程appid”!,测试工程UniPlugin-Hello-AS 已有相关配置可参考。具体可查看App离线打包。
-
appid注意 一定要统一否则会导致应用无法正常运行!
-
配置"app"Module下的 build.gradle. 在dependencies节点添加插件project引用 (以uniplugin_richalert为例)
// 添加uni-app插件
implementation project(':uniplugin_richalert')
- 运行测试。测试运行时一切要以真机运行为主