一、概述

  • 编译构建是将 HarmonyOS 应用的源代码、资源、第三方库等打包生成 HAP 或者 APP 的过程。其中,HAP 可以直接运行在真机设备或者模拟器中;APP 则是用于应用上架到华为应用市场。
  • 为了确保 HarmonyOS 应用的完整性,HarmonyOS 通过数字证书和授权文件来对应用进行管控,只有签名过的 HAP 才允许安装到设备上运行(如果不带签名信息,仅可以运行在模拟器中);同时,上架到华为应用市场的 APP 也必须通过签名才允许上架。因此,为了保证应用能够发布和安装到设备上, 需要提前申请相应的证书与Profile文件,配置应用签名信息。
  • 申请证书和 Profile 文件时,用于调试和上架的证书与授权文件不能交叉使用:
    • 应用调试证书与应用调试 Profile 文件、应用发布证书与应用发布 Profile 文件具有匹配关系,必须成对使用,不可交叉使用。
    • 应用调试证书与应用调试 Profile 文件必须应用于调试场景,用于发布场景将导致应用发布审核不通过;应用发布证书与应用发布 Profile 文件必须应用于发布场景,用于调试场景将导致应用无法安装。

二、配置应用签名信息

① 申请发布证书和 Profile 文件
  • 通过生成的证书请求文件,向 AppGallery Connect 申请发布证书和 Profile 文件,如下表所示:
步骤 操作步骤 操作说明 操作指导
1 创建AGC项目 申请发布证书前,需要登录AppGallery Connect后创建一个项目 创建您的AGC项目
2 创建HarmonyOS应用 在AppGallery Connect项目中,创建一个HarmonyOS应用,用于发布证书和Profile文件申请 创建HarmonyOS应用
3 申请发布证书和Profile文件 在AppGallery Connect中申请、下载发布证书和Profile文件 申请发布证书和Profile文件
② 对应用进行签名
  • 调试应用签名的方式包括如下两种:
    • 通过 DevEco Studio 自动化签名的方式对应用进行签名;
    • 通过从 AppGallery Connect 中申请调试证书和 Profile 文件后,再进行签名。
  • 通过 DevEco Studio 自动化签名的方式更加简单和高效,因此推荐开发者使用自动化签名。
  • 连接真机设备,确保 DevEco Studio 与真机设备已连接(如果同时连接多个设备,则使用自动化签名时,会同时将这多个设备的信息写到证书文件中)。
  • 进入File > Project Structure > Project > Signing Configs界面,点击“Sign In”按钮进行登录:

  • 在 AppGallery Connect 中创建项目和应用:
    • 登录 AppGallery Connect,创建一个项目。
    • 在项目中,点击添加应用按钮,创建一个应用。如果是非实名认证的用户,请点击“HAP Provision Profile管理”界面的 HarmonyOS 应用按钮。
    • 选择平台:选择 APP(HarmonyOS应用)。
    • 支持设备:选择调试的设备类型。
    • 应用包名:必须与 config.json 文件中的“bundleName”取值保持一致。
    • 应用名称、应用分类、默认语言请根据实际需要进行设置。

  • 返回 DevEco Studio 的自动签名界面,点击 Try Again,即可自动进行签名。自动生成签名所需的密钥(.p12)、数字证书(.cer)和 Profile 文件(.p7b)会存放到用户 user 目录下的 .ohos\config 目录下。

  • 设置完签名信息后,点击 OK 进行保存,然后可以在工程下的 build.gradle 中查看签名的配置信息。

③ 通过配置文件存储签名信息
  • 由于签名配置是开发者的私有信息,DevEco Studio 会对签名配置中的密码进行安全保护,但是这个保护会对提交 build.gradle 到代码仓中带来不便。因此,开发者可以将签名配置信息放在一个独立的文件中,从而可以方便的将 build.gradle 提交到代码仓,而存放签名配置信息的文件不用提交。
  • 在工程的根目录下创建一个名为 signing-config.properties 的文件。
  • 打开 signing-config.properties 文件,写入签名配置信息。签名配置信息可以从工程的 build.gradle 文件中进行拷贝,p12、p7b 和 cer 文件存储地址可以自定义。
 storeFile=D:\\key\\auto_debug_900086000300430549.p12storePassword=0000001BA1E0B33A4507FAAD0CD0F378CE4E6AC5AEBDEA75C3283753284436002D859E52C3836DAD3A3D1CkeyAlias=myApplication_debugkeyPassword=0000001BAC7C26C59AC5EB95E56DFC155C911ED08C658839127F4CEC6AB548B39BE8CC499CE7F27F13AE57profile=D:\\key\\auto_debug_Myapplication_900086000300430549.p7bcertpath=D:\\key\\auto_debug_900086000300430549.cer
  • 打开 build.gradle,修改debug或release类型的签名配置信息从 signing-config.properties 文件中读取。下面是 debug 类型签名信息的配置示例:
 apply plugin: 'com.huawei.ohos.hap'...// 加载签名信息配置文件def signingConfigPropsFile = rootProject.file("signing-config.properties")def signingConfigProps = new Properties()signingConfigProps.load((new FileInputStream(signingConfigPropsFile)))ohos {...// 配置签名信息索引signingConfigs {debug {storeFile file(signingConfigProps['storeFile'])storePassword signingConfigProps['storePassword']keyAlias signingConfigProps['keyAlias']keyPassword signingConfigProps['keyPassword']signAlg = 'SHA256withECDSA'profile file(signingConfigProps['profile'])certpath file(signingConfigProps['certpath'])}}
  • 修改完成后重新同步工程即可。

三、编译构建前配置

  • 在进行 HarmonyOS 应用的编译构建前,需要对工程和编译构建的 Module 进行设置,请根据实际情况进行修改。
    • build.gradle:HarmonyOS 应用依赖 gradle 进行构建,需要通过 build.gradle 来对工程编译构建参数进行设置。build.gradle 分为工程级和模块级两种类型,其中工程根目录下的工程级 build.gradle 用于工程的全局设置,各模块下的 build.gradle 只对本模块生效。
    • config.json:应用配置文件,用于描述应用的全局配置信息、在具体设备上的配置信息和 HAP 的配置信息。
① 工程级 build.gradle
  • apply plugin:在工程级 Gradle 中引入打包 app 的插件,不需要修改:
 apply plugin: 'com.huawei.ohos.app'
  • ohos 闭包:工程配置,包括如下配置项:
    • compileSdkVersion:依赖的 SDK 版本。
 compileSdkVersion 5    // 应用编译构建的目标SDK版本defaultConfig {compatibleSdkVersion 4    // 应用兼容的最低SDK版本}
    • signingConfigs:发布 APP 时的签名信息,在应用发布中进行设置后自动生成。
  • buildscript 闭包:Gradle 脚本执行依赖,包括 Maven 仓地址和 HarmonyOS 编译构建插件。HarmonyOS 编译构建插件是以 Gradle 插件为基础,在使用相应的 HarmonyOS 编译构建插件时,需要使用配套的 Gradle 插件,两者之间的配套关系如下表所示:
HarmonyOS编译构建插件版本 Gradle插件版本
2.0.0.6 5.4.1
2.0.0.7
2.4.0.1
2.4.1.4
2.4.2.5
2.4.4.2
2.4.5.0
6.3
 buildscript {repositories {   maven {url 'https://mirrors.huaweicloud.com/repository/maven/'}maven {url 'https://developer.huawei.com/repo/'}      jcenter()}dependencies {classpath 'com.huawei.ohos:hap:2.4.5.0'classpath 'com.huawei.ohos:decctest:1.2.4.1'}}
  • allprojects 闭包:工程自身所需要的依赖,比如引用第三方库的 Maven 仓库和依赖包:
 allprojects {repositories {maven {url 'https://mirrors.huaweicloud.com/repository/maven/'}maven {url 'https://developer.huawei.com/repo/'}      jcenter()}}
② 模块级 build.gradle
  • apply plugin:在模块级 Gradle 中引入打包 hap 和 library 的插件,无需修改:
 apply plugin: 'com.huawei.ohos.hap'   // 打包hap包的插件apply plugin: 'com.huawei.ohos.library'    // 将HarmonyOS Library打包为har的插件apply plugin: 'java-library'    // 将Java Library打包为jar的插件
  • ohos 闭包:模块配置,包括如下配置项:
    • compileSdkVersion:依赖的 SDK 版本:
 compileSdkVersion 5    //应用编译构建的目标SDK版本defaultConfig {compatibleSdkVersion 4    //应用兼容的最低SDK版本}
  • showInServiceCenter:是否在服务中心露出,只有在创建工程时选择了“Show in Service Center”选项才会生成该字段:
 showInServiceCenter true
  • buildTypes:Java 代码混淆功能:
 buildTypes {// 构建Release类型的hap包或APP时的混淆功能设置release {proguardOpt{// 开启代码混淆功能proguardEnabled true// 配置混淆规则文件相对路径rulesFiles 'proguard-rules.pro'// 配置打包混淆规则文件相对路径,仅在HarmonyOS Library模块中配置consumerRulesFiles 'consumer-rules.pro'}}}
    • signingConfigs:在编译构建生成 HAP 中进行设置后自动生成。
    • externalNativeBuild:C/C++ 编译构建代码设置项。
 externalNativeBuild {path "src/main/cpp/CMakeLists.txt"   // CMake配置入口,提供CMake构建脚本的相对路径arguments "-v"    // 传递给CMake的可选编译参数abiFilters "arm64-v8a"     // 用于设置本机的ABI编译环境cppFlags ""   // 设置C++编译器的可选参数}
  • entryModules:该 Feature 模块关联的 Entry 模块:
 entryModules "entry"
  • mergeJsSrc:跨设备的应用编译构建,是否需要合并 JS 代码。Wearable 和 Lite Wearable 共用一个工程,如下图所示。当进行编译构建时,将 wearable/liteWearable 目录下的 JS 文件与 pages 目录(Wearable 和 Lite Wearable 共用的源码)下的 JS 文件进行合并打包。

  • annotationEnabled:支持数据库注释:
 compileOptions{ annotationEnabled true   // true表示支持,false表示不支持}
  • dependencies 闭包:该模块所需的依赖项:
 dependencies {implementation fileTree(dir: 'libs', include: ['*.jar','*.har'])    // 该模块依赖的本地库,支持jar和har包testImplementation 'junit:junit:4.13'    // 测试用例框架,无需修改ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.200'}

四、配置 Java 代码混淆

① 混淆功能说明
  • DevEco Studio 提供了代码混淆功能,通过使用 ProGuard 工具(ProGuard 是一个开源的 Java 代码混淆器)将工程中的 Java 文件源代码进行混淆,以简短无意义的名称(例如a、b、c等),对类、字段和方法等进行重命名,可以有效的减少应用的大小。
  • 代码混淆功能还可以提升反编译的难度,降低源代码泄露的风险,起到保护源代码的目的。

② 启动混淆功能
  • 在 DevEco Studio 中,混淆功能默认是关闭的。如果需要开启混淆功能,在模块的 build.gradle 文件中配置 proguardEnabled 为 true 即可开启。
 ohos {……buildTypes {// 构建Release类型的hap包或APP时的混淆功能设置release {proguardOpt{// 开启代码混淆功能proguardEnabled true// 配置混淆规则文件相对路径rulesFiles 'proguard-rules.pro'// 配置打包混淆规则文件相对路径,仅在HarmonyOS Library模块中配置// consumerRulesFiles 'consumer-rules.pro'}}}}
  • 在 DevEco Studio 中,在开启混淆功能后,压缩、优化功能均为默认开启的状态。如果想要关闭这些功能,可以在自定义规则文件中进行配置。
  • 启动混淆功能后,在构建 Release 类型的 hap 包或 APP 时,DevEco Studio 会自动对源码进行混淆。
③ 混淆规则文件
  • 在 DevEco Studio 中为每一个模块默认提供了 Proguard 规则文件 proguard-rules.pro:

  • 在 proguard-rules.pro 中配置混淆规则后,构建时会将自定义的混淆规则与 SDK 中默认的规则合并、应用到程序中。如果程序引用了其它 HarmonyOS Library 模块或 HAR 类库,依赖中被打包的混淆规则(例如 HarmonyOS Library 模块中配置的 consumerRulesFiles 文件中的规则)也会一并应用到主程序中。
  • HarmonyOS Library 模块中的混淆规则文件 consumerRulesFiles,在编译时会打包到 har 包中,并更名为“proguard.txt”。
  • 混淆时开启记录日志:
 -verbose
  • 混淆时不使用大小写混合,混淆后的类名为小写,Windows 用户必须指定,否则当项目中有超过 26 个类的话,ProGuard 就会默认混用大小写文件名,而导致 class 文件相互覆盖。
 -dontusemixedcaseclassnames
  • 在读取依赖的库文件时,不要略过那些非 public 类:
 -dontskipnonpubliclibraryclasses
  • 在读取依赖的库文件时,不要略过那些非 public 类成员:
 -dontskipnonpubliclibraryclassmembers
  • 优化算法过滤:
 -optimizations !code/simplification/artithmetic,!field/*,!class/merging/*
  • 默认优化次数为 5 次:
 -optimizationpasses 5
  • 指定要保留的所有可选属性,比如可能会被反射方法调用的属性:
 -keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod
  • 跳过预校验阶段:
 -dontpreverify
  • 保留 JNI 中调用的类,拥有 native 方法的类名和方法名,保证可以与 native 库链接:
 -keepclasseswithmembers,allowshrinking class * {native <methods>;}
  • 保留枚举类不被混淆:
 -keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}
  • 保留 HarmonyOS 应用入口类:
 -keep public class * extends *.aafwk.ability.Ability-keep public class * extends *.ace.ability.AceAbility-keep public class * extends *.aafwk.ability.AbilitySlice-keep public class * extends *.aafwk.ability.AbilityPackage
  • 没有被使用到的类/方法,可能会在 Proguard 的压缩/优化阶段被去除。如需关闭压缩/优化功能请在规则文件中配置:
 -dontoptimize-dontshrink

五、编译构建生成 HAP

  • HAP 可以直接在模拟器或者真机设备上运行,用于 HarmonyOS 应用开发阶段的调试和查看运行效果。
  • HAP 按构建类型和是否签名可以分为以下四种形态:
    • 构建类型为 Debug 的 HAP(带调试签名信息):携带调试签名信息,具备单步调试等调试手段的 HAP,一般用于开发者使用真机设备调试应用。
    • 构建类型为 Release 的 HAP(带调试签名信息):携带调试签名信息,不具备调试能力的 HAP,相对于 Debug 类型的 HAP 包,体积更小,运行效果与用户实际体验一致。一般用于开发者在代码调试完成后,在真机设备中验证应用运行效果。
    • 构建类型为 Debug 的 HAP(不带签名):不带调试签名信息,具备单步调试等调试手段的 HAP,一般用于开发者使用模拟器调试应用。
    • 构建类型为 Release 的 HAP(不带签名):不带调试签名信息,不具备调试能力的 HAP,相对于 Debug 类型的 HAP 包,体积更小,运行效果与用户实际体验一致。一般用于开发者在代码调试完成后,在模拟器设备中验证应用运行效果。
① 对应用进行签名
  • 带签名信息的 HAP 包(包括 Debug 和 Release 类型),可以在真机设备上运行。在构建 Hap 包前,需要对应用进行签名。
  • 调试应用签名的方式包括如下两种:
    • 方式一:通过 DevEco Studio 自动化签名的方式对应用进行签名;
    • 方式二:通过从 AppGallery Connect 中申请调试证书和 Profile 文件后,再进行签名。
  • 通过 DevEco Studio 自动化签名的方式更加简单和高效,因此推荐开发者使用自动化签名。
    • 连接真机设备,确保 DevEco Studio 与真机设备已连接。
  • 进入 File > Project Structure > Project > Signing Configs界面,点击“Sign In”按钮进行登录。

  • 在 AppGallery Connect 中创建项目和应用:
    • 登录 AppGallery Connect,创建一个项目。
    • 在项目中,点击添加应用按钮,创建一个应用。如果是非实名认证的用户,请点击“HAP Provision Profile管理”界面的 HarmonyOS 应用按钮。
    • 选择平台:选择 APP(HarmonyOS 应用)。
    • 支持设备:选择调试的设备类型。
    • 应用包名:必须与 config.json 文件中的“bundleName”取值保持一致。
    • 应用名称、应用分类、默认语言请根据实际需要进行设置。

  • 返回 DevEco Studio 的自动签名界面,点击 Try Again,即可自动进行签名。自动生成签名所需的密钥(.p12)、数字证书(.cer)和 Profile 文件(.p7b)会存放到用户user目录下的 .ohos\config 目录下。

  • 设置完签名信息后,点击 OK 进行保存,然后可以在工程下的 build.gradle 中查看签名的配置信息。

② 构建带签名信息的 HAP(Debug 类型)
  • 打开左下角的 OhosBuild Variants,检查并设置模块的编译构建类型为 debug,默认类型为 debug。

  • 在主菜单栏,点击 Build > Build APP(s)/Hap(s) > Build Hap(s),生成已签名的 Debug HAP:

③ 构建带签名信息的 HAP(Release 类型)
  • 打开左下角的 OhosBuild Variants,检查并设置模块的编译构建类型为 release,默认类型为 debug:

  • 在主菜单栏,点击 Build > Build APP(s)/Hap(s) > Build Hap(s),生成已签名的 Release HAP:

④ 构建不带签名信息的 HAP(Debug 类型)
  • 打开左下角的 OhosBuild Variants,检查并设置模块的编译构建类型为 debug,默认类型为 debug:

  • 在主菜单栏,点击Build > Build APP(s)/Hap(s) > Build Hap(s),生成不带签名的Debug HAP:
⑤ 构建不带签名信息的 HAP(Release 类型)
  • 打开左下角的 OhosBuild Variants,检查并设置模块的编译构建类型为 release,默认类型为 debug:

  • 在主菜单栏,点击 Build > Build APP(s)/Hap(s) > Build Hap(s),生成不带签名的Release HAP:

HarmonyOS之深入解析编译构建的配置和代码混淆相关推荐

  1. 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )

    文章目录 I . 源码编译配置 II . 构建脚本配置 III . NDK 函数库打包配置 IV . Java 与 C 代码示例 V . CMake 配置 ( CMakeLists.txt ) VI ...

  2. Linux网络DNS配置反向解析与构建主从域名服务器

    DNS配置反向解析与构建主从域名服务器 一.DNS反向解析 ①配置反向解析 1.编辑主配置文件 2.修改区域配置文件,添加反向区域配置 3.配置反向区域数据文件 4.重启服务进行测试 ②配置反向解析( ...

  3. OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!

    自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...

  4. Open Harmony移植:build lite编译构建过程

    本文分享自华为云社区<移植案例与原理 - build lite编译构建过程>,作者: zhushy. 配置完毕产品解决方案.芯片开发板解决方案,就可以执行 hb build进行编译.但是产 ...

  5. Windows下使用VS Code编译和构建LoRaWan开源节点代码

    Windows下使用VS Code编译和构建LoRaWan开源节点代码 1.下载LoRaWan节点端开源代码 2.构建LoRaMac-node的先决条件 2.1添加环境变量 3.使用VS Code构建 ...

  6. 编译+构建+链接+运行之间的关系分析

    编译+构建+链接+运行之间的关系分析 源文件+编译+部署+测试+打包 Maven+default: 验证(validate)+编译(compile)+测试(test)+打包(package)+验证(v ...

  7. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

    文章目录 一.交叉编译 Shell 脚本参考 二.NDK r16b 版本配置 三.libjpeg-turbo 交叉编译 Shell 脚本 四.执行 libjpeg-turbo 交叉编译 Shell 脚 ...

  8. 源码编译构建安装内核kernel

    源码编译构建安装内核kernel 荣涛 2021年10月27日 文档修改日志 日期 修改内容 修改人 备注 2021年10月27日 创建 荣涛 2021年10月28日 添加可能的问题 荣涛 1. 引言 ...

  9. Windows下用CMake编译JsonCpp及配置(适合新手)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 JsonCpp是什么? JSON是一种轻量级的数据交换格式.它可以表示数字.字符串.有序的值序列 ...

最新文章

  1. IDEA代码格式化快捷键(新)
  2. 微服务落地,我们在考虑什么?
  3. 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...
  4. CH2-1 类型 操作 表达式
  5. IOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
  6. 九种跨域方式实现原理
  7. 2020年中国互联网租车报告
  8. 信息安全工程师考试大纲-科目1:信息安全基础知识
  9. 为什么川渝的超市要求顾客必须“要有妈”?
  10. 界面放大_Beachtek推出RED摄影机低噪前置放大器DXA-RED
  11. notepad++,vim驼峰命名与下划线的互相转换
  12. git查看某次提交的内容
  13. PHP从入门到精通(数组运算符篇)
  14. android 自动语音提醒,Android 语音播报实现方案
  15. 方寸微 T620 存储安全芯片 安全存储 USB3.0 U盘/移动硬盘
  16. 4月5号-4月11号
  17. 关于Arduino连接L298N供电问题
  18. 《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
  19. 3ds Max(三维动画制作软件)V2020 x64 中文版
  20. http://bbs.3dmgame.com/forum.php,上古卷轴5:天际 任务MOD等心得大合集

热门文章

  1. 使用yum查看安装了哪些软件包、某软件包是否已经安装
  2. 强制关闭虚拟机后问题+解决
  3. 程序员的自我反省-十条原则
  4. 《代码大全2》读书笔记(七)
  5. linux下查看机器配置
  6. 51nod1179【思维】
  7. 如何理解pytorch 卷积里group 这个参数
  8. centos 6.3 mysql python 模块_CentOS安装python2.6以及MySQL-python
  9. php制作曲线柱形图的框架,用GD图库生成横竖柱状图折线图的类_php
  10. python 3 输入和输出