开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天
场景
使用uniapp进行安卓设备的串口通讯调试。
当前HBuilder X中的能力无法满足App功能需求,因此需要通过开发uni原生插件来拓展功能,采用的module模式。类似于前端里的 js sdk。
这也是我首次进行原生插件的开发,过程确实不大容易,再次记录一下,巩固自己的记忆,同时希望对其他人也有所帮助。
本文适合人群
- 前端开发人员,熟悉uniapp开发
- 想要用uniapp开发App,并且拓展功能
- 想要了解uni原生插件开发过程,但是对Android 开发并不熟悉
功能需求
采用购买回来的安卓屏,在使用uniapp开发的App中可以读取串口数据,并进行通讯。
环境
- HBuilder X 3.6.5
- 采购的安卓屏,迈冲科技 K7G10,版本V6.0.1;
初始购买回来屏为 V4.4,该版本 uniapp项目无法正常运行,因此与厂家沟通,烧录为V6.0.1版本。 - Android Studio 2021.3.1;Java sdk 1.8
准备工作
进行uni原生插件开发,所需开发环境;文档链接:nativesupport.dcloud.net.cn/NativePlugi…
第一步:配置
打开下载的App离线SDK =》 UniPlugin-Hello-AS工程;
在 Android Studio中导入该工程:File =》 Open =》 UniPlugin-Hello-AS,如图:
本文中要开发的串口原生插件属于非UI特定功能,因此需要采用Module模式,大家可以参照源码中
uniplugin_module
模块。
创建module模块
操作:File =》 New =》 New Module =》 Android Library
修改当前模块的 build.gradle
加入下面的配置,初始配置进行删除,然后点击右上角的 Try Again
//导入aar需要的配置
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
//必须添加的依赖
compileOnly 'androidx.recyclerview:recyclerview:1.0.0'
compileOnly 'androidx.legacy:legacy-support-v4:1.0.0'
compileOnly 'androidx.appcompat:appcompat:1.0.0'
compileOnly 'com.alibaba:fastjson:1.1.46.android'
compileOnly fileTree(include: ['uniapp-v8-release.aar'], dir: '../app/libs')
}
配置混淆文件
在当前Jy-test目录下,打开proguard-rules.pro文件,加入一下代码
-keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}
第二步:创建Module类 JyTest
如果您创建出来的module目录如下图:
先将java文件进行转换为 Sources Root,操作如下图
创建Module类
注意:uniapp的Module拓展,必须继承UniModule类
第三步:功能开发
在当前Module类中,根据所需功能定义方法,注意事项:
- 扩展方法必须加上@UniJSMethod (uiThread = false or true) 注解。UniApp 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。
uiThread = true 表示 运行在UI线程;
uiThread = false 表示 运行在JS线程 - UniApp是根据反射来进行调用 Module 扩展方法,所以Module中的扩展方法必须是 public 类型 例子:
package com.example.jy_test;
import com.alibaba.fastjson.JSONObject;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;
public class JyTest extends UniModule {
@UniJSMethod(uiThread = true)
public void test (String name,UniJSCallback callback) {
if (callback != null) {
JSONObject data = new JSONObject();
data.put("msg", name + ":你小子,真棒");
callback.invoke(data);
}
}
}
有可能当前,Android Studio下面报着错,请不要担心,继续往下看!!!
第四步:插件调试
1、注册插件
注意plugins
配置中name
插件名,开头要大写
点击当前工程 app => src => main => assets => dcloud_uniplugins.json
然后入下图进行插件注册
2、引入插件
在当前工程中引入插件: 点击 app => build.gradle
3、打包插件
注意:
有些 Android Studio 中右侧的 gradle 只有dependens,没有tasks任务栏。
此时点击左上角 File =》 Settings,按下图操作即可
问题:
有些伙伴,目前Android Studio中下方的 build 还报错,比如
解决方法:有可能是当前的项目的版本配置不对:
将其修改为
此时项目 BUILD SUCCESSFUL。
注意:
如果您当前的环境与我的不同,有可能 该Android Gradle Plugin Version
对你当前的项目并不适用;
最近由于公司破电脑又出问题,导致重装了一下;环境发生了变化,因此之前打包好的项目再次运行出现了问题;
新环境用的 Android Studio 2022
最新版,当我按照之前的步骤进行操作的时候,报错,试了很多方法,怀疑因为环境变了,少了些配置;
我修改了一下 Gradle Plugin 版本,又诡异的好了?
这个时候,我们就完成插件开发了,下一步将当前插件引入我们的项目中。
gradle plugin 无法正常下载
24.01.25 更新:
在拓展功能制作新插件的时候,由于之前科学上网的工具不给力了,当修改了 gradle
版本后,Android Studio
下载对应的版本超时,无法进行调试。
解决方法
第一步: 下载对应的离线包,镜像网址。下载完毕后放到自定义的一个文件目录下。例如:D:\gradle
第二步: 配置当前项目
distributionUrl
值
回到 Android Studio
工具中,打开当前 gradle-wrapper.properties
进行配置
建议: 不要直接去删除现有的distributionUrl,而是屏蔽掉,防止出问题以后没有办法复原
配置如下:
distributionBase=GRADLE_USER_HOME
#distributionUrl=https://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionUrl=file:///D:/gradle/gradle-7.0.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
配置完毕后,点击同步即可。
第五步:项目中引入插件,使用并调试
1、创建uni-app项目
打开HBuilder X工具,然后创建一个项目 JyTest。
2. 项目配置插件目录:
首先我们在打开HBuilder X中的项目,并在根目录下创建 nativeplugins 文件夹,将我们的插件放入,并进行相关信息的填写,如下图:
3. App原生插件本地引入,如下图:
4. 将插件导入项目中
<template>
<view>
<view>
<text>{{title}}</text>
</view>
<button @click="test">测试</button>
</view>
</template>
<script>
const JyTestPlugin = uni.requireNativePlugin('Jy-test');
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
console.log('JyTestPlugin', JyTestPlugin);
},
methods: {
/**
* 测试原生插件
*/
test() {
JyTestPlugin.test('优弧', (res) => {
console.log('res', res);
this.title = res.msg;
})
}
}
}
</script>
5. 自定义基座
为了防止我们制定自定义调试基座出错,我们应当先将项目与插件的 minSdkVersion 与 targetSdkVersion调成一致的状态。
因为我们采用了原生插件,如果要进行调试的话,需要自定义基座,将我们的原生插件导入基座中。
见证奇迹的时刻
安卓屏显示效果图:
拓展:我们也可以采用离线打包,将本地打包的资源放到Android Studio 中进行调试,这个网上以及官网有相关资料,在此就不讨论了。
番外: 本地打包
上述讲解的是打包自定义基座后,在本地运行项目;如果我们要将项目打包,分为:云打包、本地打包。
在进行开发过程中,由于云打包针对个人开发者每日有限额,因此我们需要使用本地打包联合Android Studio 进行调试。
下面我介绍一下本地打包的流程,在我们已创建的项目基础上,我们开展下面的工作。
1、获取当前项目证书
我们通过DCloud 获取当前应用的信息以及创建相关的证书。 根据当前项目的应用标识(APPID),然后进入DCloud开发者后台。
找到对应的应用,点击进入“应用信息” 页面。
在应用信息页面中,选择“Android 云端证书”,然后点击 “创建证书”。
2、根据当前证书,进行配置
1.打开之前准备工作下载的 App离线sdk
**注:之前开发原生插件我们使用的是 UniPlugin-Hello-AS;本地离线打包我们需要使用 HBuilder-Integrate-AS **
- 下载证书放入 Android Studio 项目,app 目录下
2.对 app 目录下的 build.gradle 进行配置
3、将生成的离线资源放置到 main\assets\apps 下
4、进行其他的配置
配置现有的插件
并且将打包好的插件放到 lib下,引入
配置 App 名
配置包资源以及 key
总结
至此uniapp原生插件的开发流程,我们已经学会了;在本次工作中,针对该安卓屏开发的串口调试工具,也是这样的流程。
二者的些许不同就是,针对厂家提供的串口 原生demo,进行了一步封装,将原生调试用的方法,采用uniapp也可以使用,该插件第一版已完成,串口基本功能已实现,目前已发布到插件市场上。
链接:ext.dcloud.net.cn/plugin?id=1…
希望大家读完这篇文章能有所收获,也希望我们彼此在技术的路上走的更远,更宽。加油,与君共勉!
补充
本人是一位前端打工人,对于 安卓相关开发仅限于一知半解,因此本文哪里理解错了,欢迎大佬指正!如果其他人遇到新的问题,评论区指出,我们共同精进!!!