Uniapp离线打包/ 自定义原生插件(Android)

提示:没有看过Uni官方文档的建议先过一遍
链接:Uni官方文档

前言

本文主要两个方向:
1、离线打包:就是脱离Hbuilder来打包自己的Uniapp项目
2、原生组件:自己手写安卓原生组件,然后再通过离线打包的形式集成到Uniapp项目使用
两种的原理都是,我们有一个自己的安卓原生项目,里面集成UniApp项目
方法有两种:
1、是直接使用官方的simpleDemo来集成
2、自己新建安卓项目,引入官方SDK成功与Uni项目通信


一、准备

离线SDK下载:SDK
生成安卓证书:教程
生成UniAppkey:教程

二、集成uni项目到安卓项目

1、新建安卓项目(java语言),删掉项目自带的MainActivity.javaAndroidManifest.xml中对其的引用
2、下载SDK后找到UniPlugin-Hello-AS中的libsassets,两个文件夹复制到自己安卓项目对应的目录中。
在这里插入图片描述

3、打开自己的uni项目生成离线打包项目资源unpackage/resources中以appID命名的目录就是,复制替换安卓项目assets/apps下的同格式目录。
在这里插入图片描述
4、修改assets/data/dcloud_control.xml文件里的appID的值为自己uni的appID。

5、将下述activity信息添加到Androidmanifest.xmlapplication节点中,meta-data中记得替换自己的appkey

  <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>
  </activity>
  <activity
      android:name="io.dcloud.PandoraEntryActivity"
      android:launchMode="singleTask"
      android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize"
      android:hardwareAccelerated="true"
      android:permission="com.miui.securitycenter.permission.AppPermissionsEditor"
      android:screenOrientation="user"
      android:theme="@style/DCloudTheme"
      android:windowSoftInputMode="adjustResize">
      <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="h56131bcf" />
      </intent-filter>
  </activity>
  <meta-data
      android:name="dcloud_appkey"
      android:value="你的Uniapp appKey" />

6、打开安卓项目下的build.gradle文件,跟下面对照一下,需要注意的写到了注释中

plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.jonexu.xxx"
        // 以下四项注意与你Uni项目的对应上
        minSdk 21
        targetSdk 31 
        versionCode 100
        versionName "1.0.0"
        
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    signingConfigs {
        config {
            keyAlias 'com.jonexu.xxx'
            keyPassword '安卓证书的密码'
            storeFile file('证书的名字.keystore') // 这个文件得自己生成,然后放到本文件同目录下
            storePassword '证书的密码'
            v1SigningEnabled true
            v2SigningEnabled true
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.config // 这里是使用你上面写的证书配置
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            signingConfig signingConfigs.config
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    aaptOptions { // 别落下!
        additionalParameters '--auto-add-overlay'
        ignoreAssetsPattern "!.svn:!.git:.*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
    }
}

dependencies {
	// 引入libs中所有sdk包
    implementation fileTree(dir: 'libs', include: ['*.aar'], exclude: [])

    //Uni-AndroidX-needs-start
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.facebook.fresco:fresco:2.5.0'
    implementation "com.facebook.fresco:animated-gif:2.5.0"
    implementation 'com.github.bumptech.glide:glide:4.9.0'
    implementation 'com.alibaba:fastjson:1.1.46.android'
    
	//以下是我的项目自带的,不同版本as可能不同,注意与上面Uni引入的做去重,优先使用Uni需要的版本
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

此时,你运行安卓项目后就会是显示的Uni项目的界面,在此基础上,可以继续开发原生安卓组件,并进行调试

二、开发及使用安卓原生组件

开发组件有两种形式,这里主要讲使用的多的Module
1、新建Module
右键项目New——Module,选择Android Library。填写就好了
在这里插入图片描述

创建完成后到组件package中新建个class:MainTest,如下代码,主要看能不能ping通

import android.app.Activity;
import com.taobao.weex.bridge.JSCallback;
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.common.UniModule;

public class MainFloat extends UniModule {
    @UniJSMethod(uiThread = true)
    public void testUni(JSCallback callback) {
        Activity act = ((Activity) mWXSDKInstance.getContext());
        callback.invoke("Hello Friend");
    }
}

2、对Uni注册原生组件
1)在app的**build.gradle**,dependencies节点中注册你的uni组件

implementation project(':JFloatModule')

2)记得之前提到的UniPlugin-Hello-AS中的assets目录里的dcloud_uniplugins.json文件,复制到自己项目里的对应位置
3)编辑注册刚刚新建的组件,代码如下,注意复制过去删掉注释!!!!!!!!

{
  "nativePlugins": [
    {
      "plugins": [
        {
          "type": "module", // module 或 component
          "name": "MyFloat", // 这个名字随便定义,主要用于Uni中来请求使用的名字
          "class": "com.jonexu.jfloatmodule.MainFloat" // 组件实体类完整名称
        }
      ]
    }
  ]
}

3、Uni中使用组件,写到你的uni项目,然后重新编译生成离线打包文件,再替换到安卓项目里,替换流程参考本文第一点

const native = uni.requireNativePlugin('MyFloat'); // 名字是你在dcloud_uniplugins.json中定义的那个
export default {
	methods: {
		openFloatService() {
			native.testUni((sta) => {
				uni.showToast({
					title:"回调内容:"+sta
				})
			});
		},
	}
}

这一招,主要用于本地离线打包集成安卓原生组件,或者调试自己的安卓组件

三、封装安卓组件到Uni项目中

本文第二点联调没问题后,有需要的话可以将写好的安卓组件打包封装,生成jar包放到uni的项目里,这样就直接可以uni云打包了。
1、找到Build——Make Module ‘你的模块名’,生成aar。Select Build Variant能修改生成的是release/ debug。文件会生成到:模块名——build——outputs——aar下。
在这里插入图片描述
2、回到Uni项目中,根目录下新建nativeplugins目录。增加如图结构,将你的arr组件放到对应位置,package.json官方示例
在这里插入图片描述
3、如果以上配置没问题,就可以在manifest.json中App原生插件配置里可以选到你的组件了,然后打包自定义基座试试吧

End、过程中的坑

1.现在新建的安卓项目会自带下面的一些包,注意检查不要重复,有重复的优先删掉项目自带的引入
 implementation 'androidx.appcompat:appcompat:1.0.0'
 implementation 'androidx.legacy:legacy-support-v4:1.0.0'
 implementation 'androidx.recyclerview:recyclerview:1.0.0'
 implementation 'com.facebook.fresco:fresco:2.5.0'
 implementation "com.facebook.fresco:animated-gif:2.5.0"
 implementation 'com.github.bumptech.glide:glide:4.9.0'
 implementation 'com.alibaba:fastjson:1.1.46.android'
2.设置了meta-data中的dcloud_appkey还是一直包AppKey is not configured xxx

1)首先肯定是检查uniapp_id对上了没,包括access/apps的目录名,和data中dcloud_control.xml的appid
2)再就是确认build.gradle中有配置signingConfigs.config且内容信息都正确,buildTypes.debug也配置了signingConfig为signingConfigs.config。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值