有没有做头像的网站,用花生壳做映射的网站需要备案,centos7网站开发,网站空间邮箱每年要续费吗需求#xff1a;
原生安卓 apk 要求嵌入到 uniapp 中#xff0c;并通过 uniapp 前端调起 app 的相关组件。 下面手把手教你#xff0c;从 apk 到 aar#xff0c;以及打包冲突到如何运行#xff0c;期间我所遇到的问题都会 一 一 进行说明#xff0c;相关版本以我文章内为…需求
原生安卓 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. 添加相关配置
app 下 build.gradleimplementation androidx.appcompat:appcompat:1.0.0implementation androidx.legacy:legacy-support-v4:1.0.0implementation com.alibaba:fastjson:1.2.83implementation androidx.webkit:webkit:1.3.0implementation com.facebook.fresco:fresco:2.5.0implementation com.facebook.fresco:animated-gif:2.5.0implementation androidx.recyclerview:recyclerview:1.0.0implementation com.squareup.okio:okio:1.15.0implementation com.squareup.okhttp3:okhttp:3.12.12implementation com.github.bumptech.glide:glide:4.9.0下载后的sdk放进来我们自己的aar包打包后直接放进来然后同步即可 可以看到这个基座是一个 androidX 的项目 如果我们要引进来的项目是 support 的也没关系我的就是 support 的
5. 搞一个签名签名网上有很多教程这里我就不贴出来了可以自行搜索这里我贴一下我的配置这个签名的作用是为后面我们打包 apk 和申请 appkey 的时候用到的离线打包自签名咋搞都可以只要签名能用 6. AndroidManifest.xml
注意点 1application 添加tools:replace“android:icon,android:allowBackup” 2provider 的 authorities需要改成你当前的 包名…dc.fileprovider例如android:authorities“com.android.myapplication2.dc.fileprovider” 3 增加 dcloud_appkeyvalue 就是等会我们要去 uniapp 工作台申请的 appkey
meta-dataandroid:namedcloud_appkeyandroid:valuexxx /完整示例如下
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolspackagecom.android.myapplication2uses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.MOUNT_UNMOUNT_FILESYSTEMS /uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.READ_PHONE_STATE /uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE /uses-permission android:nameandroid.permission.RECORD_AUDIO /uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/uses-permissionuses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/uses-permissionuses-permission android:namezy.permission.OUT_ENTER /applicationandroid:allowBackuptrueandroid:icondrawable/iconandroid:labelstring/app_nameandroid:supportsRtltruetools:replaceandroid:icon,android:allowBackupactivityandroid:nameio.dcloud.PandoraEntryandroid:configChangesorientation|keyboardHidden|keyboard|navigationandroid:labelstring/app_nameandroid:launchModesingleTaskandroid:hardwareAcceleratedtrueandroid:themestyle/TranslucentThemeandroid:screenOrientationuserandroid:windowSoftInputModeadjustResize intent-filteraction android:nameandroid.intent.action.MAIN /category android:nameandroid.intent.category.LAUNCHER //intent-filterintent-filtercategory android:nameandroid.intent.category.DEFAULT /category android:nameandroid.intent.category.BROWSABLE /action android:nameandroid.intent.action.VIEW /data android:scheme //intent-filter/activityactivityandroid:nameio.dcloud.PandoraEntryActivityandroid:launchModesingleTaskandroid:configChangesorientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize|uiModeandroid:hardwareAcceleratedtrueandroid:permissioncom.miui.securitycenter.permission.AppPermissionsEditorandroid:screenOrientationuserandroid:themestyle/DCloudThemeandroid:windowSoftInputModeadjustResize/activityproviderandroid:nameio.dcloud.common.util.DCloud_FileProviderandroid:authoritiescom.android.myapplication2.dc.fileproviderandroid:exportedfalseandroid:grantUriPermissionstruemeta-dataandroid:nameandroid.support.FILE_PROVIDER_PATHSandroid:resourcexml/dcloud_file_provider //providermeta-dataandroid:namedcloud_appkeyandroid:valuexxx //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 打包部分
{id: 插件名称,name: 插件名称,version: 1.0.0,description: ,_dp_type: nativeplugin,_dp_nativeplugin: {android: {plugins: [{type: module,name: 插件名称,class: aar中提供的类路径}],integrateType: aar}}
}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
hbuilder debugtrue syncDebugtrueappsapp appid__UNI__XXXX appver1.0.0//apps
/hbuilder6. 将我们的的目标 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 中的保持一致类名可以自己定义
{nativePlugins: [{plugins: [{type: module,name: 插件名称,class: 包名.ZyModule}]}]
}4、创建我们的入口类 ZyModule
这里我只暴露了一个方法 startActivity且可以传入一个参数具体根据自己需求修改我这里方法用于调起我的 MyActivity这里定义好后就可以将方法名和 uniapp 的 package.json 中进行配置和调用了
import io.dcloud.feature.uniapp.annotation.UniJSMethod;
import io.dcloud.feature.uniapp.common.UniDestroyableModule;public class ZyModule extends UniDestroyableModule {private static final String TAG ZyModule;UniJSMethod(uiThread true)public void startActivity(Object data) {Log.e(TAG, 传递参数 (JSONObject) data);Context context mUniSDKInstance.getContext();try {Intent intent new Intent(context, MyActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);Log.d(TAG, 启动成功);} catch (Exception e) {Log.e(TAG, 启动失败: e.getMessage());}}Overridepublic void destroy() {}
}5、AndroidManifest.xml 的修改
去掉 application 中的 name去掉 mian 入口的配置FileProvider 一定要写完整的包名不能用 ${applicationId}否则会调起不起我们的类 点击 Android Studio 的 gradle一般在右边然后找到我们的项目在 Tasks/ build 或者 other 或者某个目录下找到 assembleDebug 或者 assembleRelease双击运行即可生成 aar 包 将 aar 复制到两个地方aar包名名称不用管但最好修改成统一的格式 1uniapp插件中nativeplugins\插件名称\android 2直接放在基座的libs目录下然后同步一下即可
六、问题
1、appkey或者配置无效问题
在申请 appkey 时其实就是新增平台信息的时候填错包名或者 SHA1、SHA256然后重新回来修改成正确的接着如果去重新生成 appkey但是发现 appkey 没有改变如果有改变就用这个新的试试看我遇到的是没有改变就重新创建一条平台原先这条就可以删掉了。 我是一开始包名写错然后修改成正确的包名后发现 appkey 没有变化使用该 appkey 总是包标题错误就删掉了重新生成才可以的。
2、基座打包冲突和缺包处理
首先建议直接离线打包在线打包每个账号每天有次数限制且需要排队很慢 其次包冲突可以在本地快速处理 在打包过程中有几个包是需要我们自己过滤的我们的 aar 项目需要改成 compileOnly
fastjsonzip4jglidecom.squareup.okio:okio:1.15.0 和 com.squareup.okhttp3:okhttp: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 是掉不起来的