一、打包方式对比

方式说明适用场景
云打包使用 DCloud 云端构建个人项目、小项目
离线打包本地配置环境打包企业项目、定制化需求

离线打包优势

  • 可自定义原生 SDK
  • 可集成第三方原生插件
  • 构建过程可控
  • 适合企业级应用

二、Android 离线打包流程

2.1 环境准备

必需软件:

配置步骤:

  1. 安装 Android Studio
  2. 配置 JDK 环境变量
  3. 下载 uniapp 离线 SDK

2.2 获取离线包

  1. 登录 DCloud 开发者中心
  2. 生成应用标识(Appid)
  3. 下载离线 SDK

2.3 导入项目

  1. 打开 Android Studio
  2. 左上角 File → Open → 选择 Android 离线 SDK 里面的 HBuilder-Integrate-AS
  3. 如果出现 Sync 提示,选择 Sync now
  4. File → Settings → Build,Execution,Deployment → Build Tools → Gradle,找到 Gradle JDK 选择 JDK 1.8

2.4 配置步骤

步骤 1:生成云端证书

  1. 打开 uniapp 官网
  2. 找到项目 → Android 云端证书 → 生成 → 下载到桌面
  3. 点击 各平台信息 → 右上角 新增 → 填写包名(格式:com.xxx.xxx
  4. 填入证书相关信息(SHA1 等)
  5. 找到 离线打包 key → 获取 appkey

步骤 2:生成本地打包资源

  1. 用 HBuilderX 打开项目
  2. 发行 → 原生 app → 本地打包 → 生成本地打包 app 资源
  3. 等待打包完成,记录导出路径

步骤 3:替换资源文件

  1. 打开打包导出路径的 resources 目录
  2. 复制所有文件
  3. 返回 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.xmlappid 处填入自己的 appid

步骤 7:配置 strings.xmlapp_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 配置步骤

  1. 从 DCloud 下载 iOS 离线 SDK
  2. 将 SDK 拖入 Xcode 项目,选择 Copy items if needed
  3. 配置依赖:
    # Podfile
    pod 'UniSDK', '~> 1.0.0'
  4. 在 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 实现
}
@end

4.4 插件资源配置

  1. 将下载的插件解压
  2. 将 android 目录下的 aar/jar 文件放入 libs
  3. 其余文件参考插件文档放入指定文件夹
  4. 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.apk

6.2 iOS 发布

  1. 在 Xcode 中选择 Generic iOS Device
  2. Product → Archive
  3. Organizer → Distribute App
  4. 上传 App Store Connect

相关链接