HarmonyOS之深入解析编译构建的配置和代码混淆
一、概述
- 编译构建是将 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之深入解析编译构建的配置和代码混淆相关推荐
- 【Android NDK 开发】Android Studio 的 NDK 配置 ( 源码编译配置 | 构建脚本配置 | 打包配置 | CMake 配置 | ndkBuild 配置 )
文章目录 I . 源码编译配置 II . 构建脚本配置 III . NDK 函数库打包配置 IV . Java 与 C 代码示例 V . CMake 配置 ( CMakeLists.txt ) VI ...
- Linux网络DNS配置反向解析与构建主从域名服务器
DNS配置反向解析与构建主从域名服务器 一.DNS反向解析 ①配置反向解析 1.编辑主配置文件 2.修改区域配置文件,添加反向区域配置 3.配置反向区域数据文件 4.重启服务进行测试 ②配置反向解析( ...
- OpenHarmony编译构建系统详解,从零搭建windows下开发环境,巨方便!
自从OpenHarmony更新了dev-tool,就可以在windows下构建鸿蒙(轻量型)系统了,这对于进行MCU开发的朋友们,学习鸿蒙OS会友好许多!我们可以更快的构建出系统,方便快速学习和验证. ...
- Open Harmony移植:build lite编译构建过程
本文分享自华为云社区<移植案例与原理 - build lite编译构建过程>,作者: zhushy. 配置完毕产品解决方案.芯片开发板解决方案,就可以执行 hb build进行编译.但是产 ...
- Windows下使用VS Code编译和构建LoRaWan开源节点代码
Windows下使用VS Code编译和构建LoRaWan开源节点代码 1.下载LoRaWan节点端开源代码 2.构建LoRaMac-node的先决条件 2.1添加环境变量 3.使用VS Code构建 ...
- 编译+构建+链接+运行之间的关系分析
编译+构建+链接+运行之间的关系分析 源文件+编译+部署+测试+打包 Maven+default: 验证(validate)+编译(compile)+测试(test)+打包(package)+验证(v ...
- 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )
文章目录 一.交叉编译 Shell 脚本参考 二.NDK r16b 版本配置 三.libjpeg-turbo 交叉编译 Shell 脚本 四.执行 libjpeg-turbo 交叉编译 Shell 脚 ...
- 源码编译构建安装内核kernel
源码编译构建安装内核kernel 荣涛 2021年10月27日 文档修改日志 日期 修改内容 修改人 备注 2021年10月27日 创建 荣涛 2021年10月28日 添加可能的问题 荣涛 1. 引言 ...
- Windows下用CMake编译JsonCpp及配置(适合新手)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 JsonCpp是什么? JSON是一种轻量级的数据交换格式.它可以表示数字.字符串.有序的值序列 ...
最新文章
- IDEA代码格式化快捷键(新)
- 微服务落地,我们在考虑什么?
- 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否...
- CH2-1 类型 操作 表达式
- IOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem
- 九种跨域方式实现原理
- 2020年中国互联网租车报告
- 信息安全工程师考试大纲-科目1:信息安全基础知识
- 为什么川渝的超市要求顾客必须“要有妈”?
- 界面放大_Beachtek推出RED摄影机低噪前置放大器DXA-RED
- notepad++,vim驼峰命名与下划线的互相转换
- git查看某次提交的内容
- PHP从入门到精通(数组运算符篇)
- android 自动语音提醒,Android 语音播报实现方案
- 方寸微 T620 存储安全芯片 安全存储 USB3.0 U盘/移动硬盘
- 4月5号-4月11号
- 关于Arduino连接L298N供电问题
- 《互联网+流通——F2R助力传统产业创新与转型》一一1.1 “互联网+”的本质、演进与发展趋势...
- 3ds Max(三维动画制作软件)V2020 x64 中文版
- http://bbs.3dmgame.com/forum.php,上古卷轴5:天际 任务MOD等心得大合集