素白年代
素白年代
  • 发布:2021-02-01 15:01
  • 更新:2021-02-01 15:01
  • 阅读:1328

5+APP安卓原生插件开发全流程个人总结

分类:HTML5+

1、离线打包

Hbuilder官方路径:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android

为什么要用离线打包呢,因为是开发安卓第三方插件,主要用的是Android Stuido,所以把5+APP项目导到Android studio里来,方便开发和测试。

其实还有一个原因,涉及到的第三方插件用到了系统级权限,要用platform.pk8来签名打包,才能运行。所以用离线打包会方便点。

Hbuilder(X)用不了pk8签名,当然,你可以把pk8转换成keystore文件,这样就可以签名了。

这里有大佬介绍转换,不过我还没试。(https://blog.csdn.net/langlitaojin/article/details/108045709)

2、添加第三方插件文件及支持
将第三方插件的jar包,so文件拷贝到Android studio相应的目录(app-libs)下,然后在gradle最外层配置:
repositories {
flatDir {
dirs 'libs'
}
}
在dependencies层加入:

implementation fileTree(dir: 'libs', include: ['.aar', '.jar', '*.so'], exclude: [])
注意:有so文件的话,需要在gradle的android层配置ndk支持。

ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' ,'x86', 'armeabi-v7a'
}

3、创建java类封装第三方插件所要用到的功能,封装成一个个独立的方法。数据传递到js端:广播,或者用接口类回调。

这个有个地方要注意,如果注册了广播监听者,没有注销的话,应用退出再重新打开之后,会报:

IllegalArgumentException: Receiver not registered。

我用5+的方法去注销在java里注册的广播,但是没起到效果,不得其解。

然后我转而在java层封装了一个注销监听器的方法,然后在js层调用,问题就没再出现了。

所以呢,我觉得原生的方法就尽量在java层里写好,由js层调用,避免用5+来写。

这里呢,我觉得还是少用广播吧,注销是个麻烦事,在java里可以在专门的生命周期里注销,但是在js里,就麻烦了,要在各种事件(页面上的返回键或关闭键,手机上的虚拟或物理返回)上去监听做注销处理。

4、创建一个js类,用5+API来封装上面封装好的java类的方法。

用java封装完第三方库,接着就是在js也封装一个相应的api,方便前端开发人员使用,也方便维护。


注意:如果是系统级应用,那么要hook一下webview(因为webview存在安全漏洞,从安卓5.1开始,谷歌禁止系统应用使用webview)。

提示:Caused by: java.lang.UnsupportedOperationException: For security reasons, WebView is not allowed in privileged processes

解决方法:

1、首先呢,创建一个Application继承自DCloudApplication,然后在AndroidManifest.xml里,引用自己的Application,且加上tools:replace="android:name",避免与Hbuilder的lib里的DCloudApplication冲突

2、在application的onCreate方法的super方法前,调用hook webview的方法,来绕过谷歌的禁用。

具体hook的方法:https://www.52pojie.cn/thread-992014-1-1.html

2 关注 分享
OlyLis s***@yeah.net

要回复文章请先登录注册