uni-app混合原生安卓开发

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工程)
    uni-app混合原生安卓开发

  • 选择 发行—>原生APP-本地打包—>生成本地打包App资源 等待资源生成!
    uni-app混合原生安卓开发

  • 在控制台会输出编译日志,编译成功会给出App资源路径
    uni-app混合原生安卓开发

  • 把APP资源文件放入到UniPlugin-Hello-AS工程下 app Module根目录assets/apps/测试工程appid/www对应目录下,再修改assets/data/dcloud_control.xml!修改其中appid=“测试工程appid”!,测试工程UniPlugin-Hello-AS 已有相关配置可参考。具体可查看App离线打包。

  • appid注意 一定要统一否则会导致应用无法正常运行!
    uni-app混合原生安卓开发

  • 配置"app"Module下的 build.gradle. 在dependencies节点添加插件project引用 (以uniplugin_richalert为例)

// 添加uni-app插件
implementation project(':uniplugin_richalert')
  • 运行测试。测试运行时一切要以真机运行为主
上一篇:uniCloud初体验


下一篇:dcloud wap2app上架应用宝过审方法