一、打包方式对比
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 云打包 | 使用 DCloud 云端构建 | 个人项目、小项目 |
| 离线打包 | 本地配置环境打包 | 企业项目、定制化需求 |
离线打包优势
- 可自定义原生 SDK
- 可集成第三方原生插件
- 构建过程可控
- 适合企业级应用
二、Android 离线打包流程
2.1 环境准备
必需软件:
配置步骤:
- 安装 Android Studio
- 配置 JDK 环境变量
- 下载 uniapp 离线 SDK
2.2 获取离线包
- 登录 DCloud 开发者中心
- 生成应用标识(Appid)
- 下载离线 SDK
2.3 导入项目
- 打开 Android Studio
- 左上角 File → Open → 选择 Android 离线 SDK 里面的
HBuilder-Integrate-AS - 如果出现 Sync 提示,选择 Sync now
- File → Settings → Build,Execution,Deployment → Build Tools → Gradle,找到 Gradle JDK 选择 JDK 1.8
2.4 配置步骤
步骤 1:生成云端证书
- 打开 uniapp 官网
- 找到项目 → Android 云端证书 → 生成 → 下载到桌面
- 点击 各平台信息 → 右上角 新增 → 填写包名(格式:
com.xxx.xxx) - 填入证书相关信息(SHA1 等)
- 找到 离线打包 key → 获取 appkey
步骤 2:生成本地打包资源
- 用 HBuilderX 打开项目
- 发行 → 原生 app → 本地打包 → 生成本地打包 app 资源
- 等待打包完成,记录导出路径
步骤 3:替换资源文件
- 打开打包导出路径的
resources目录 - 复制所有文件
- 返回 Android Studio,将
simpleDemo/src/main/assets/apps下的UNI__XXX替换为自己的文件
步骤 4:配置 build.gradle
dependencies {
// 添加 uniapp 依赖
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'])
}步骤 5:配置 AndroidManifest.xml
<!-- 添加必要权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />将 package 修改为项目包名,底部 android:value 修改为自己的 appkey
步骤 6:配置 dcloud_control.xml
在 appid 处填入自己的 appid
步骤 7:配置 strings.xml
将 app_name 修改为项目名称
步骤 8:配置签名
android {
signingConfigs {
release {
keyAlias '你的别名'
keyPassword '你的密码'
storeFile file('证书绝对路径')
storePassword '你的密码'
}
}
}获取证书绝对路径:切换到 Project 视图 → 右键证书文件 → Copy Path/Reference → Absolute Path
2.5 常见问题
| 问题 | 解决方案 |
|---|---|
| 白屏 | 检查 H5 资源路径 |
| 插件不生效 | 检查原生配置 |
| 打包失败 | 检查签名配置 |
| SDK 版本不匹配 | 统一使用最新版 |
| 依赖冲突 | 检查 gradle 配置 |
三、iOS 离线打包流程
3.1 环境准备
必需软件:
- Xcode(最新版本)
- HBuilderX
- CocoaPods
3.2 配置步骤
- 从 DCloud 下载 iOS 离线 SDK
- 将 SDK 拖入 Xcode 项目,选择 Copy items if needed
- 配置依赖:
# Podfile pod 'UniSDK', '~> 1.0.0' - 在 Xcode 中配置 Signing & Capabilities → 选择开发团队
四、原生插件开发
4.1 插件结构
plugin/
├── android/ # Android 原生代码
├── ios/ # iOS 原生代码
└── package.json # 插件配置
4.2 Android 插件示例
// 继承 BaseModule
public class MyPlugin extends BaseModule {
@JSMethod
public void showToast(String message) {
Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
}
}4.3 iOS 插件示例
// 继承 DCUniPlugin
@interface MyPlugin : DCUniPlugin
@end
@implementation MyPlugin
- (void)showToast:(NSString *)message {
// iOS 实现
}
@end4.4 插件资源配置
- 将下载的插件解压
- 将 android 目录下的 aar/jar 文件放入
libs - 其余文件参考插件文档放入指定文件夹
- 在
assets目录下创建dcloud_uniplugins.json:
{
"nativePlugins": [
{
"plugins": [
{
"type": "module",
"name": "DCloud-RichAlert",
"class": "uni.dcloud.io.uniplugin_richalert.RichAlertWXModule"
}
]
}
]
}五、打包优化
5.1 体积优化
- 开启代码混淆
- 移除未使用资源
- 使用 WebP 格式
- 分包加载
- 只保留需要的 ndk 架构:
android { ndk { abiFilters 'armeabi-v7a' } }
注意:离线打包 APK 体积比云打包大通常是因为选择了多个 ndk 架构
5.2 性能优化
- 首屏资源预加载
- 图片懒加载
- 接口请求缓存
- 使用原生组件
5.3 安全加固
- 代码混淆
- 防反编译
- 接口签名
- 数据加密
六、发布流程
6.1 Android 发布
# 1. 打包 APK
./gradlew assembleRelease
# 2. 签名
jarsigner -verbose -keystore my.keystore app-release.apk alias_name
# 3. 对齐优化
zipalign -v 4 app-release.apk app-release-aligned.apk6.2 iOS 发布
- 在 Xcode 中选择 Generic iOS Device
- Product → Archive
- Organizer → Distribute App
- 上传 App Store Connect
相关链接
- 功能面试题 - 功能实现面试
- 性能优化 - 性能优化专题
- DCloud 官方文档
- Android uni-app 原生插件开发文档