提示:没有看过Uni官方文档的建议先过一遍
链接:Uni官方文档
本文主要两个方向:
1、离线打包:就是脱离Hbuilder来打包自己的Uniapp项目
2、原生组件:自己手写安卓原生组件,然后再通过离线打包的形式集成到Uniapp项目使用
两种的原理都是,我们有一个自己的安卓原生项目,里面集成UniApp项目
方法有两种:
1、是直接使用官方的simpleDemo来集成
2、自己新建安卓项目,引入官方SDK成功与Uni项目通信
离线SDK下载:SDK
生成安卓证书:教程
生成UniAppkey:教程
1、新建安卓项目(java语言),删掉项目自带的MainActivity.java
和AndroidManifest.xml中对其的引用
2、下载SDK后找到UniPlugin-Hello-AS
中的libs
和assets
,两个文件夹复制到自己安卓项目对应的目录中。
3、打开自己的uni项目生成离线打包项目资源unpackage/resources中以appID命名的目录就是,复制替换安卓项目assets/apps
下的同格式目录。
4、修改assets/data/dcloud_control.xml
文件里的appID的值为自己uni的appID。
5、将下述activity信息添加到Androidmanifest.xml
的application
节点中,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
})
});
},
}
}
这一招,主要用于本地离线打包集成安卓原生组件,或者调试自己的安卓组件
本文第二点联调没问题后,有需要的话可以将写好的安卓组件打包封装,生成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原生插件配置里可以选到你的组件了,然后打包自定义基座试试吧
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'
1)首先肯定是检查uniapp_id对上了没,包括access/apps的目录名,和data中dcloud_control.xml的appid
2)再就是确认build.gradle中有配置signingConfigs.config且内容信息都正确,buildTypes.debug也配置了signingConfig为signingConfigs.config。