Uniapp 引入 Android aar 包 和 Android 离线打包

打印 上一主题 下一主题

主题 1021|帖子 1021|积分 3063

需求:

原生安卓 apk 要求嵌入到 uniapp 中,并通过 uniapp 前端调起 app 的相关组件。
下面手把手教你,从 apk 到 aar,以及打包辩论到怎样运行,期间我所遇到的题目都会 一 一 举行说明,相关版本以我文章内为例子,其他版本如果存在差异请自行解决(不过一般也不会有很大差异啦)
官方文档传送门:uni原生插件开发教程
一、uniapp(这里以新建为主演示)

直接在 HBuilder 中新建即可
新建完成后,uniapp 工作台会创建对应的项目,等会生成 appkey 会用到(没有 dcloud 账号就创建一个)
二、Android环境(离线基座项目)搭建

因为我们是 Android 开发的,所以我们只看 Android 部分就可以了,开发环境如下:

首先下载对应 HBuilderX 对应版本的 SDK
1. 查看我们当前 HBuilder 的版本(发起升级到最新):



2. 点击以下红框部分,跳转到查下 Android sdk 界面,选择对应的版本下载,如果HBuilder 不是最新的,就到历史版本中下载对应的即可



3. 在 Android Studio 中,新建项目(选 java,当前项目是我们离线基座的apk,不是我们的项目的),记录下包名(以下我的相关配置):




4. 添加相关配置:

  1. app 下 build.gradle:
复制代码
  1.     implementation 'androidx.appcompat:appcompat:1.0.0'
  2.     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
  3.     implementation 'com.alibaba:fastjson:1.2.83'
  4.     implementation 'androidx.webkit:webkit:1.3.0'
  5.     implementation 'com.facebook.fresco:fresco:2.5.0'
  6.     implementation "com.facebook.fresco:animated-gif:2.5.0"
  7.     implementation 'androidx.recyclerview:recyclerview:1.0.0'
  8.     implementation 'com.squareup.okio:okio:1.15.0'
  9.     implementation 'com.squareup.okhttp3:okhttp:3.12.12'
  10.     implementation 'com.github.bumptech.glide:glide:4.9.0'
复制代码
下载后的sdk放进来(我们自己的aar包打包后直接放进来,然后同步即可):

可以看到,这个基座是一个 androidX 的项目 ,如果我们要引进来的项目是 support 的也没关系(我的就是 support 的)
5. 搞一个署名,署名网上有很多教程,这里我就不贴出来了,可以自行搜索,这里我贴一下我的配置,这个署名的作用,是为背面我们打包 apk 和申请 appkey 的时候用到的(离线打包自署名,咋搞都可以,只要署名能用):


6. AndroidManifest.xml

留意点:
(1)application 添加:tools:replace=“android:icon,android:allowBackup”
(2)provider 的 authorities必要改成你当前的 包名…dc.fileprovider,比方:android:authorities=“com.android.myapplication2.dc.fileprovider”
(3) 增长 dcloud_appkey,value 就是等会我们要去 uniapp 工作台申请的 appkey
  1. <meta-data
  2.             android:name="dcloud_appkey"
  3.             android:value="xxx" />
复制代码
完备示比方下
  1. <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    package="com.android.myapplication2">    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>    <uses-permission android:name="zy.permission.OUT_ENTER" />    <application        android:allowBackup="true"        android:icon="@drawable/icon"        android:label="@string/app_name"        android:supportsRtl="true"        tools:replace="android:icon,android:allowBackup">        <activity            android:name="io.dcloud.PandoraEntry"            android:configChanges="orientation|keyboardHidden|keyboard|navigation"            android:label="@string/app_name"            android:launchMode="singleTask"            android:hardwareAccelerated="true"            android:theme="@style/TranslucentTheme"            android:screenOrientation="user"            android:windowSoftInputMode="adjustResize" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>            <intent-filter>                <category android:name="android.intent.category.DEFAULT" />                <category android:name="android.intent.category.BROWSABLE" />                <action android:name="android.intent.action.VIEW" />                <data android:scheme=" " />            </intent-filter>        </activity>        <activity            android:name="io.dcloud.PandoraEntryActivity"            android:launchMode="singleTask"            android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize|uiMode"            android:hardwareAccelerated="true"            android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"            android:screenOrientation="user"            android:theme="@style/DCloudTheme"            android:windowSoftInputMode="adjustResize">        </activity>        <provider            android:name="io.dcloud.common.util.DCloud_FileProvider"            android:authorities="com.android.myapplication2.dc.fileprovider"            android:exported="false"            android:grantUriPermissions="true">            <meta-data                android:name="android.support.FILE_PROVIDER_PATHS"                android:resource="@xml/dcloud_file_provider" />        </provider>        <meta-data
  2.             android:name="dcloud_appkey"
  3.             android:value="xxx" />
  4.     </application></manifest>
复制代码
三、申请离线打包的 appkey

1. 登录 dcloud 后,进入工作台,在“应用管理——我的应用”中,找到我们在 HBuilder 中创建的项目


2. 点击 “应用名称” 后,跳转到应用信息,选择 “各平台信息”,点击 “新增” 按钮



3. 将我们刚才创建的基座 Android 项目的包名,输入到 “包名” 文本框中,对于 SHA1 和 SHA256 获取,回到我们的 Android Studio,右键我们的署名,然后选择 Terminal 打开


输入下令:keytool -list -v -keystore 署名文件(留意后缀也必要) -storepass 密码

这样就得到了我们的 sha1 和 sha256
最终平台信息如下

4. 上面平台信息填写完成后,点击提交,平台信息就会变化了


5. 这里我已经创建了离线打包 key,没有创建表现的是创建按钮,点击创建生成我们的 appkey,至此,appkey 创建完成


6. 将 appkey,配置到我们刚才 AndroidManifest.xml 中的 dcloud_appkey


四、基座 Android 项目的完善

1. 回到 HBuilder,打开我们的项目,在项目根下,创建以下目次结构(dir1看package.json 的配置):


其中,package.json 配置结构如下,发起红框中的三个部分和dir1都填写一样(插件名称),避免堕落,而 class 部分,是用于暴露给 uniapp 调用的类路径,该路径是你 aar 下的,不是署名的基座的(关于 aar 文件,参考背面 aar 打包部分
  1. {
  2.     "id": "插件名称",
  3.         "name": "插件名称",
  4.     "version": "1.0.0",
  5.     "description": "",
  6.         "_dp_type": "nativeplugin",
  7.         "_dp_nativeplugin": {
  8.                 "android": {
  9.                         "plugins": [{
  10.                                 "type": "module",
  11.                                 "name": "插件名称",
  12.                                 "class": "aar中提供的类路径"
  13.                         }],
  14.                         "integrateType": "aar"
  15.                 }
  16.         }
  17. }
复制代码

2. 这里配置正确后,打开 manifest.json,找到 App 原生插件配置,选择本地插件


前面配置正确的话,弹出框就能看到我们的插件了


3. 添加调起我们 aar 的方法(必要和 Android 端约定方法名和参数)


插件名称,参考前面 package.json 的配置,里面 dir1 部分,这里 startActivity(obj),是调起 pageckage.json 中配置的 class 对应类的方法,详细可以看背面打包部分,关于该类的创建和方法定义
4. 在 HBuilder 中,将我们的 uniapp 项目打包成静态资源出来


打包完成后,会在项目根下生成 unpackage下,生成 resources 目次,resources 目次下的目次,存放的就是我们必要的静态资源,该目次名称就是我们项目的应用标识,复制该目次,粘贴到基座 app 的 assets/app 下,该资源目次不存在就创建一个

5. 在 assets 资源目次下,创建 data 目次,然后将 sdk 中提供的三个 dcloud_ 文件放进来,打开 dcloud_control.xml,将其改下面的样子,其中,appid 就是你 uniapp 项目的应用标识,留意要给 hbuilder 添加 debug 和 syncDebug

  1. <hbuilder debug="true" syncDebug="true">
  2.     <apps>
  3.         <app appid="__UNI__XXXX" appver="1.0.0"/>
  4.     </apps>
  5. </hbuilder>
复制代码

6. 将我们的的目的 aar 放到基座项目的 libs 下,

前面我们依赖已经配置了 implementation fileTree(dir: ‘libs’, include: [‘.aar’, '.jar’]) ,所以手动同步一下

7. 接下来就可以直接运行得手机了,而安装在手机的,就是离线基座了,大概打包成 apk,放在 uniapp unpackage/debug 目次下,基座apk名称修改成 android_debug.apk (一定要这个名字),Hbuilder 选择运行到设备的时候,选择自定义基座也是可以的


五、AAR 打包

PS:以下打包的过程,都是你自己项目的,跟基座项目没关系

PPS:我的项目是 kotlin ,且是 support,可以正常打包和调起的

1、添加打包工具

在项目的 build.gradle 中添加 fat-aar 打包工具:
classpath ‘com.github.kezong:fat-aar:1.3.8’
2、修改应用 build.gradle配置

将 ‘com.android.application’ 修改成 ‘com.android.library’
添加 apply plugin: ‘com.kezong.fat-aar’
将全部依赖改成 embed 方式,比方:

如果项目有依赖内部的其他 module 模块,那么也是必要修改成 embed,但是,该模块内的依赖的是不会被打包进去的,为了更好的调整,发起将该模块下的全部依赖,搬到当前应用的依赖下,然后修改成 embed,方便背面修改,也不用去修改所依赖内部模块的内容
引入 uniapp 依赖包,用 compileOnly,该模块用于创建我们前面 package.json 中的 class,该 class 依赖 uniapp 包中的类:

以下是我的项目的部分依赖例子(关于我遇到的包辩论部分,在背面):

3、添加 dcloud_uniplugins.json 配置

在 assets 中,创建 dcloud_uniplugins.json,添加如下配置:
其中,name和class 和前面 package.json 中的保持一致,类名可以自己定义
  1. {
  2.   "nativePlugins": [
  3.     {
  4.       "plugins": [
  5.         {
  6.           "type": "module",
  7.           "name": "插件名称",
  8.           "class": "包名.ZyModule"
  9.         }
  10.       ]
  11.     }
  12.   ]
  13. }
复制代码
4、创建我们的入口类 ZyModule

这里我只暴露了一个方法 startActivity,且可以传入一个参数,详细根据自己需求修改,我这里方法用于调起我的 MyActivity,这里定义好后,就可以将方法名和 uniapp 的 package.json 中举行配置和调用了
  1. import io.dcloud.feature.uniapp.annotation.UniJSMethod;
  2. import io.dcloud.feature.uniapp.common.UniDestroyableModule;
  3. public class ZyModule extends UniDestroyableModule {
  4.     private static final String TAG = "ZyModule";
  5.     @UniJSMethod(uiThread = true)
  6.     public void startActivity(Object data) {
  7.         Log.e(TAG, "传递参数:" + (JSONObject) data);
  8.         Context context = mUniSDKInstance.getContext();
  9.         try {
  10.             Intent intent = new Intent(context, MyActivity.class);
  11.             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  12.             context.startActivity(intent);
  13.             Log.d(TAG, "启动成功");
  14.         } catch (Exception e) {
  15.             Log.e(TAG, "启动失败: " + e.getMessage());
  16.         }
  17.     }
  18.     @Override
  19.     public void destroy() {
  20.     }
  21. }
复制代码
5、AndroidManifest.xml 的修改


  • 去掉 application 中的 name
  • 去掉 mian 入口的配置
  • FileProvider 一定要写完备的包名,不能用 ${applicationId},否则会调起不起我们的类

  • 点击 Android Studio 的 gradle(一般在右边),然后找到我们的项目,在 Tasks/ build 大概 other 大概某个目次下,找到 assembleDebug 大概 assembleRelease,双击运行即可生成 aar 包

  • 将 aar 复制到两个地方(aar包名名称不用管,但最好修改成同一的格式)
    (1)uniapp插件中:nativeplugins\插件名称\android

    (2)直接放在基座的libs目次下,然后同步一下即可
六、题目

1、appkey大概配置无效题目

在申请 appkey 时,其实就是新增平台信息的时候,填错包名大概 SHA1、SHA256,然后重新返来修改成正确的,接着如果去重新生成 appkey,但是发现 appkey 没有改变(如果有改变就用这个新的试试看,我遇到的是没有改变),就重新创建一条平台,原先这条就可以删掉了。
我是一开始包名写错,然后修改成正确的包名后,发现 appkey 没有变化,使用该 appkey 总是包标题错误,就删掉了重新生成才可以的。
2、基座打包辩论和缺包处置惩罚

首先,发起直接离线打包,在线打包每个账号每天有次数限定,且必要列队,很慢
其次,包辩论可以在本地快速处置惩罚
在打包过程中,有几个包是必要我们自己过滤的,我们的 aar 项目必要改成 compileOnly:


  • fastjson
  • zip4j
  • glide
  • com.squareup.okiokio:1.15.0 和 com.squareup.okhttp3khttp:3.12.12
这几个包在在线打包的时候都会出现包辩论报错的,所以我们不能打包进我们的 aar 中,当然,离线下我们必要引入,详细看一看前面基座项目应用的依赖配置
zip4j在基座的libs下aar中有
fastjson必要基座说明依赖
glide 必要的版本是 4.9.0,如果是其他版本,请将自己的项目配置成该版本,然后自行修改代码
缺包和部分辩论
关于缺包,是因为 embed 的依赖方式,是不会将第三方依赖中的依赖打包进去的,这个必要自己在 External Libraries 中找到相关的包添加到你 aar 应用的依赖中,比方,我这里用到的 rx:

大概我项目本身 kotlin 部分:

当然,在线打包,如果我们的是 kotlin 项目,那么我们必要去掉以下三个包:

其他包辩论和缺包都可以按照上面的方式来处置惩罚,发起先离线来处置惩罚,一般会把全部辩论先摆列出来,运行的时候才会报缺包,缺包就缺啥补啥即可
3、aar 已经放在 uniapp 项目下,为啥运行的时候,会报插件 undefined

原因是没有制作基座!!!
一定要有基座,基座其实就是将 aar 打包进 apk,运行的时候才会被调用到,基座 apk 路径可以参考前面
七、测试

uniapp 要调起 aar,无论是在线打包照旧离线打包,都是生成自定义基座:项目/unpackage/debug/android_debug.apk,然后运行的时候选择自定义基座的,如果没有这个基座,而是默认标准基座,那么 aar 是掉不起来的

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表