参考博客uniapp Android 原生插件开发(Module 扩展为例·2022)
首先在这里贴上官方文档- uni原生语言插件开发教程,有官方文档了,还要写这篇文章是因为我在根据文档开发插件的过程中,还是碰到了很多问题,在Google,查阅官方论坛之后还是没有解决,最后自己摸索解决了,所以在这里记录一下。
前言
本篇文章重在介绍开发完插件后测试部署的过程,Android Studio的使用不做介绍
准备
根据官方文档下载并导入UniPlugin-Hello-AS工程到Android Studio
插件开发
在官方提供的项目中新建library的Module,复制uniplugin_module
模块的build.gradle
配置到新建module的build.gradle
,可根据实际情况修改compileSdkVersion和targetSdkVersion。接下来创建Module类,写扩展方法。这一步骤官方文档写的也很详细。
插件调试
对于需求明确,有一定专业知识的开发者来说,开发一个插件并不难。关键是要调试,这里官方文档写的就不是很详细了。
首先说明一点:做好的插件最终是要放在uniapp项目中的。其实开发好的插件不经过调试直接放在uniapp也可以,但是谁也不能保证一次就能把插件写的很完美,而每一次修改插件放在uniapp后都需要重新打包自定义插件。而打包自定义插件可能是一个痛苦的过程--可能需要等待的时间很长,打包次数也有限制
所以要在UniPlugin-Hello-AS工程下进行调试,这个工程相当于App离线打包,只是官方配置号了一个必要的环境
离线打包调试
离线打包调试的必要条件是要有Appkey,而申请AppKey需要有Android 签名文件,如果没有可以自己百度搜索创建Android 签名文件或者在Dcloud开发者后台创建签名文件,可参考官方文档申请Appkey
在Android Studio中修改配置文件
有了AppKey之后,修改UniPlugin-Hello-AS工程app模块的配置文件
- 修改namespace和applicationId为自己的包名-要和开发者后台中的一致
- 修改签名文件配置(signingConfigs),其中keyAlias、keyPassword、storeFile都要使用自己申请AppKey时使用的签名文件信息
- 修改清单文件(AndroidManifest)里的dcloud_appkey的value--就是申请的之前申请的AppKey
- 在assets资源目录下的
dcloud_uniplugins.json
配置文件增加自己的插件配置,参考官方文档,其中name属性要记住,之后用得到 - 再修改assets/data/dcloud_control.xml中的appid的值,是自己的uniapp应用对应的AppID
至此UniPlugin-Hello-AS工程app模块的配置文件修改完成
引入插件
通过使用uni.requireNativePlugin获取插件对象。
const pluginImpl = uni.requireNativePlugin('插件 name')//这里的插件name就是刚才在dcloud_uniplugins.json文件里配置的插件的name
生成本地App打包资源
在自己的uniapp项目里选择 发行--->APP-本地打包--->生成本地打包App资源 等待资源生成
等待资源生成后复制生成的资源,要复制www文件夹上一层的文件夹,即__UNI__878995A
这个格式的文件夹,复制这个文件夹到UniPlugin-Hello-AS工程app模块的assets\apps目录下
至此测试准别工作完成,可以在Android Studio里运行UniPlugin-Hello-AS项目进行测试了,测试没问题后就可以生成uniapp插件了
生成uniapp插件
网上的文档都是选择Android Studio的可视化编译命令进行生成aar文件的,好多同学说找不到assembleRelease,也有同学给出了处理方案,这其实就是一个命令,完全可以自己执行命令,如下图,其中uniapp-ext
是自己编写插件是新建的module名称
构建成功之后就可以在build/outputs/arr目录下找到编译好的插件
引入插件到uniapp项目
创建目录:在uniapp项目中创建nativeplugins目录(如有可忽略这一步),然后准备相关文件,官方示例如下
|-- DCloud-RichAlert --->插件id命名的文件夹(个人认为这里是一插件库id命名的文件夹,就是这个插件库里可以有很多个插件,这些很多个插件公用这个插件库id)
|-- android --->安卓插件目录
|--libs
- xxx.jar --->依赖的jar
- libxxx.so --->依赖的so文件
- vendor.aar --->依赖的aar
- unipluginRichAlert.aar --->插件module的aar
创建package.json文件并填写必要的信息。放入到android目录下,这里对package.json做一下说明,因为我在这个文件上吃了大坑。package.json里有一些可选配置,如果在编写插件时使用了,就一定要加上,否则也有可能提示当前运行的基座不包含原生插件
的提示,比如dependencies
、permissions
、useAndroidX
,因为我的插件使用了这些配置,可能导致生成自定义基座时,其实插件是没有生成成功的,最后导致使用requireNativePlugin的时候一致提示当前运行的基座不包含原生插件
,<u>所以你的插件使用的一些额外的配置一定要在package.json里都配置上</u>
{
"name": "插件名称",
"id": "DCloud-RichAlert", // 插件库标识(这里一定要和上面创建的文件夹名称一致,即插件库的id)
"version": "插件版本号",
"description": "插件描述信息",
"_dp_type":"nativeplugin",
"_dp_nativeplugin":{
"android": {
"plugins": [
{
"type": "module",
//这个name就是dcloud_uniplugins.json文件里配置的插件的name,也是使用requireNativePlugin时的参数
"name": "DCloud-RichAlert_TestModule", //id为前缀 这里的name也可以和插件库标识一致,也可以一插件库标识为前缀
"class": "uni.dcloud.io.uniplugin_richalert.TestModule"
},
{
"type": "component",
"name": "DCloud-RichAlert_TestComponent",
"class": "uni.dcloud.io.uniplugin_richalert.TestComponent"
}
]
}
}
...
...
<u>在uniapp项目的manifest.json文件中添加配置好的插件</u>,这一步也很重要。