Uniapp 原生插件开发踩坑之旅

1,264 阅读3分钟

uniapp 原生插件介绍

  1. 官网文档杂而分散,本文会逐一附上相关链接。 uniapp 原生插件介绍

  2. 下载HBuilderX 和 Android 平台离线 SDK,注意版本号必须一致,否则本地运行的 app 会弹框提示版本不一致。 下载链接

插件类型 module vs component

module vs component

总结:
module 适用于绝大多数场景,封装原生 API 给 vue 调用,抑或是直接启动原生界面,android 的 startActivity。
component 适用于封装原生控件给vue调用,大多数为vue内嵌原生控件。

示例工程介绍

  1. 离线 SDK 包下载下来有三个示例工程,这里仅介绍 UniPlugin-Hello-AS 工程

image.png

app 目录下的libs 为 uniapp 平台相关的 aar 包,assets 目录为 HBuilderX vue 工程导出的资源。

image.png

__UNI_7A08102 为系统自动分配的 appId, data 目录下 dcloud_control.xml 需要与资源文件夹保持一致。

<app appid="__UNI__7A08102" appver=""/>

dcloud_uniplugins.json 为本地插件注册文件,app module 除了本地依赖插件module之外,还需要手动编辑此文件完成注册,这样 asseets 下的 js 代码才能成功加载原生插件代码。

譬如BJY-LiveUIBJY-VideoPlayer 为笔者新开发的插件,为了能本地调试需要手动配置。

{
  "nativePlugins": [
    {
      "plugins": [{
        "type": "module",
        "name": "BJY-LiveUI",
        "class": "com.baijiayun.uniplugin.liveui.LiveUiModule"
      }],
      "hooksClass": "com.baijiayun.uniplugin.liveui.LiveUIAppProxy"
    },
    {
      "hooksClass": "com.baijiayun.uniplugin.videoplayer.VideoPlayerAppProxy",
      "plugins": [
        {
          "type": "module",
          "name": "BJY-VideoPlayer",
          "class": "com.baijiayun.uniplugin.videoplayer.VideoPlayerModule"
        }
      ]
    },
    {
      "plugins": [
        {
          "type": "module",
          "name": "TestModule",
          "class": "io.dcloud.uniplugin.TestModule"
        }
      ]
    },
  ]
}

同时需要 implementation 插件module

implementation project(':uniplugin_liveui')
  1. 插件 module 介绍

插件如需在 application里初始化代码,需要继承自 UniAppHookProxy。

public class LiveUIAppProxy implements UniAppHookProxy {
    @Override
    public void onCreate(Application application) {
        // 可写初始化触发逻辑
        LiveSDK.init(application);
    }

    @Override
    public void onSubProcessCreate(Application application) {
        //子进程初始化回调
    }
}

暴露原生 API 给 vue,需要继承自 UniModule,函数必须是 public,并且加此注解

@UniJSMethod(uiThread = true)
public class LiveUiModule extends UniModule {

    /**
     * 三分屏模板-参加码加入
     * @param code 参加码
     * @param userName 用户名
     */
    @UniJSMethod(uiThread = true)
    public void startLiveTripleTemplateWithCode(String code, String userName) {
        if (mUniSDKInstance != null && mUniSDKInstance.getContext() instanceof Activity) {
            LiveSDKWithUI.enterRoom(mUniSDKInstance.getContext(), new LPJoinCodeEnterRoomModel(code, userName));
        }
    }
}
  1. 插件依赖

插件仅支持 jcenter google jitpack 阿里镜像这几个公开仓库,无法配置私有仓库。。
无奈,只能查看依赖树,一个个加到libs目录,对于公开的依赖可以直接在build.gradle里配置。

坑一:文档介绍不支持 kotlin,实际上是支持的。
在 package.json->dependencies下增加

image.png

坑二:最后我的libs 目录有80M之多,超过了云打包40M的限额,得充钱,10 RMB 一次,贵得有点离谱。好在插件上架之后可以申请退费。

坑三:制作自定义基座(把插件代码和依赖打包成apk)或者云打包一天10次,超额付费 2 RMB一次才行,对插件开发非常不友好,改了原生代码或者package.json都要重新打包。

坑四:云打包完全黑盒,本地离线打包能轻松解决的问题却无限卡在制作基座。比如两个 aar中有相同的so库冲突,配置 pickFirst能解决。
需要在manifest.json,注意是manifest.json而不是插件的package.json中,这里浪费了我几个小时的时间。

"packagingOptions": [           //可选,字符串数组类型,Android平台云端打包时build.gradle的packagingOptions配置项
                    "pickFirst 'libs/*/xxx.so'",
                    "merge '**/LICENSE.txt'"
                ],

坑五:viewbinding & databinding 不支持

同样也折腾了几次付费打包,文档藏得太深了。也是在manifest.json开启配置

"buildFeatures" : {
                    "dataBinding" : true,
                    "viewBinding" : true
                }

附上 manifest.json 说明文档

坑六:无法同步build.gradle的配置,我们项目中用到高斯模糊。需要在build.gradle 配置

"android { defaultConfig { renderscriptSupportModeEnabled true }}"

坑四和坑五本质上也是插件module的build.gradle配置无法生效,但好歹官方还是支持配置的。这个就直接回复不支持了,无奈只能删除高斯模糊的逻辑。

这里还是要给论坛里快速回复的工作人员点赞,QQ群都是小广告,论坛可能是为数不多能解决 uniapp相关问题的地方了~

最后附上这次趟坑的插件地址,欢迎使用uniapp开发的有点直播需求的同学尝尝鲜!
百家云点播回放 SDK 插件
百家云直播 UI SDK 插件