背景
公司业务需要使用安卓插件,本人无java与安卓开发基础的前端,慢慢踩坑摸索完成,小小插件耗时近一个月,感谢领导不杀之恩。由于uniapp插件官方文档对于纯前端开发相对不友善,因此汇总此攻略,方便大家上手原生开发。
目标
快速稳定的开发安卓插件,让uniapp的前端项目也能使用安卓功能
适用群体
前端开发,熟悉uniapp,不熟悉安卓开发的人群。
基础要求
初级java水平,初级Android Studio使用水平,若身边有android小伙伴,可以多咨询,解决问题速度max+。本人0安卓开发经验,赶项目选用的是极速版教程,学习视频为: java教程:https://www.bilibili.com/video/BV1o841187iP/?p=8&vd_source=80c581e5012f72b772296748ea6d6e6
环境准备
根据官网 要求进行下载:
备注:关于环境方面内容,跟着官网做即可,官网已经很齐全。
项目创建
在android studio中导入项目
按照官网文档进行导入即可,文档已经很清楚,不再赘述。
第一章:启动uniapp官方示例
这一章的核心是配置权限参数就是appKey,签名证书(Android平台常用的)。整完这两个基本就能启动,难度很小,放心食用。
对于初学者,建议先把官方示例运行起来先。 理由1(最核心):官方代码是不会错的,出现问题只需排查配置问题即可,相当于将一步分解成了两步走,更容易上手。理由2:有官方示例当做对照,排查问题与调用API会更简单。
题外话:我个人由于第一次写android studio,在创建项目时很难判断是代码问题还是操作问题,在创建项目折腾了很久。建议第一次使用android studio的小伙伴也整一下官方示例,若是android大佬,那当我没说。
appKey与Android平台签名证书关系
从3.1.10版本开始使用App离线SDK(即Android Studio上的项目,如下)需要申请Appkey。签名证书是用于表明开发者身份,uniapp为了知道开发者开发的哪个插件用于哪个项目,于是让开发者把签名证书和uniapp项目绑定在一起,这样就能追踪到插件用于哪个项目。
具体操作就是让uniappid(如__UNI__3860B42)和插件标识(签名证书)相互绑定,一个uniappid锁定一个签名证书。我们下面配置的目的,也是如此。(以上是个人理解,若有错误,望大佬指出)
下面4个操作步骤,总结就是本地生成个签名证书,然后根据签名证书的信息在uniapp后台申请个appidKey。然后将已经相互绑定的签名证书和appidKey一起配置到安卓项目中,就大功告成了。
第一步:导入官方示例
获取APPID
第二步:申请离线appKey和Android平台签名证书。
目前安卓插件新版本项目都需要这个,否则无法在Android Studio运行项目,无法进行调试。
1.在本地生成 Android平台签名证书
根据官方文档进行操作 Android平台签名证书(.keystore)生成指南
备注:若发现秘钥中少了MD5,SHA1,SHA256中的一个,那请将java版本和官方指南版本保持一致,太高本版会没有的。
2. 申请离线appKey
官方文档教程:创建以及查看离线AppKey教程
官方文档写得不是很详细,这里重新整理一下步骤。
- 1.登录开发者中心 =》在应用管理 =》 点击应用 =》 各平台信息 创建以及查看离线AppKey
- 2.将步骤1生成的Android平台签名证书生成的密钥填写进去
第三步:配置项目签名(将上一步的离线appKey和Android平台签名证书加进去)
- 将生成的Android平台签名证书复制到Android studio的UniPlugin-Hello-AS/app/目录下,然后打开app/build.grale,将签名证书引入,keyPassword密码就是生成证书设置的密码。
2.将appkey填写到AndroidManifest.xml的标签,meta-date中。(meta-date的name不能改)
到此,权限的配置就完成了。
第四步:将uniapp项目导入到Android studio,启动项目!
1.将上面《第一步》生成的官方示例进行本地打包
2.将打包好的文件复制到Android studio项目app/src/main/assps/目录下,配置好appid。appid要与文件命名一致。
3.同步好打包配置,启动!
启动!
成功!
此阶段常见问题与bug
其实上面运行并没有成功(手动狗头),眼睛亮的小伙伴可以找一找。不过问题不大,世上哪有第一次就能调通的代码,跟着步骤排查问题即可。
1.排除签名证书问题(keystroe)
如果是签名证书问题,比如密码,证书地址,证书别名等,那么打包的时候就会校验,出错就会报错。根据报错提示进行修改即可。
2.签名证书和appid对不上问题
如果出现提示"未配置AppKey或配置错误",证明已经打包成功了,但认证出了问题。这种情况不用怀疑,肯定是appid+签名证书+应用包名的信息填写有误,没有统一。根据官方文档逐一进行排查即可,未配置AppKey或配置错误排查步骤,一次排查不出就排查两次,两次不行就让眼睛雪亮的小伙伴帮忙看看,这真不是技术问题,就一个“找不同”游戏而已。
第二章 在官方示例创建新项目
这一章核心有两,一是创建项目,二个是将项目导入进去,仅此而已
第一步 在uniapp项目中创建自己项目
将官方uniapp项目的index.vue文件删除(作者本人是改成index1111.vue,以方便后面测试别的API),自己再新增一个。代码如图所示:
<template>
<view>
<view>
<text>{{title}}</text>
</view>
<button @click="test">测试</button>
</view>
</template>
<script>
const ceshiMethodPlugin = uni.requireNativePlugin('ceshi-method');
export default {
data() {
return {
title: 'Hello'
}
},
onLoad() {
console.log('ceshiMethodPlugin', ceshiMethodPlugin);
},
methods: {
/**
* 测试原生插件
*/
test() {
ceshiMethodPlugin.ceshiStart('搞起来', (res) => {
console.log('res', res);
this.title = res.msg;
})
}
}
}
</script>
然后和第一章第四步一样,重新打包,重新放到Android studio项目app/src/main/assps/目录下。重新启动run,项目启动成功。
第二步 创建自己的插件项目
这步主要参考# uniapp开发安卓原生插件,不能说一模一样,只能说一毛一样,谢谢大佬文章@fly_dream。
操作:File =》 New =》 New Module =》 Android Library
新建完毕后,开始移花接木,把官方示例uniplugin_module的配置复制过去。
在当前ceshi目录下,打开proguard-rules.pro文件,加入以下代码
-keep public class * extends io.dcloud.feature.uniapp.common.UniModule{*;}
先将java文件进行转换为 Sources Root(如果已经是了,就不用转了),操作如下图
创建Module类
填写插件代码
- uniapp的Module拓展,必须继承UniModule类。
- 扩展方法必须加上@UniJSMethod (uiThread = false or true) 注解。UniApp 会根据注解来判断当前方法是否要运行在 UI 线程,和当前方法是否是扩展方法。
uiThread = true 表示 运行在UI线程;
uiThread = false 表示 运行在JS线程 - UniApp是根据反射来进行调用 Module 扩展方法,所以Module中的扩展方法必须是 public 类型 例子:
package com.example.ceshi;
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 CeshiMethod extends UniModule {
@UniJSMethod(uiThread = true)
public void ceshiStart (String name, UniJSCallback callback) {
if (callback != null) {
JSONObject data = new JSONObject();
data.put("msg", name + ":你小子,真棒");
callback.invoke(data);
}
}
}
在AndroidManifest.xml填写包入口,package="uni.dcloud.io.ceshi"
测试插件代码完毕。
第三步 将插件导入到项目中
在APP目录的burild.gradle中引入插件包。跟着官方示例照葫芦画瓢。
implementation project(':插件包名')
在src/main/assets/dcloud_uniplugins.json文件中声明类名称。也是跟着官方示例照葫芦画瓢。
配置完成,Sync now 同步完后重新启动。插件流程自此结束。
备注:插件的开发与调试建议在Android studio中进行,若前端项目代码需要改动重新本地打包一下,再进入到Android studio即可。这个过程是很快的。而若是将插件进行打包,放到uniapp上进行调试,当插件需要更改,需要重新制作自定义调试基座,这个是需要云打包的,是非常慢的。总代来说,就是在Android studio中调试,uniapp前端项目可以本地打包,而在uniapp中调试,需要云打包,速度是很慢的,贼耽误时间。
第四步 打包插件,在uniapp中启动
打包插件
备注:有些 Android Studio 中右侧的 gradle 只有dependens,没有tasks任务栏。 此时点击左上角 File =》 Settings,再同步一下配置即可,按下图操作即可
此步骤引用至# uniapp开发安卓原生插件,再次感谢@fly_dream。此文中表示打包可能出会出版本问题,由于个人并非出现,并不了解,有此问题的小伙伴可参考大佬的文章。
将插件包配置到前端项目
在uniapp项目中新建unipluginDemo文件夹=》新建插件包ceshi文件夹=》新建android文件夹与package.js配置文件。将插件压缩包放到android文件夹中。uniapp会加载android文件夹中的插件,你只需在package.js中配置好文件参数即可。
配置package.js文件,更多配置可参考uniapp官网插件参数配置进行配置。
"name": "ceshi",
"id": "ceShi",
"version": "1.0.0",
"description": "测试用",
"_dp_type": "nativeplugin",
"_dp_nativeplugin": {
"android": {
"plugins": [
{
"type": "module",
"name": "ceshi-method",
"class": "com.example.ceshi.CeshiMethod"
}
],
"integrateType": "aar",
"parameters": {},
"dependencies": [
"io.mx51:spi-client-java:2.9.5"
]
}
}
}
前端项目调用API的时候,调用的是就是配置里的name
在uniapp项目中添加插件
制定自定义基座
android证书就用本地生产的那个,与android Studio保持一致。测试的话,可以直接使用公共测试证书,更简单一些。
启动项目
错误排查
console 插件对象,若是undefined,则证明无此插件,检查name名称是否对应得上。
若是空数组,证明插件已经引入,可能是类名填写错误