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.p12
storePassword=0000001BA1E0B33A4507FAAD0CD0F378CE4E6AC5AEBDEA75C3283753284436002D859E52C3836DAD3A3D1C
keyAlias=myApplication_debug
keyPassword=0000001BAC7C26C59AC5EB95E56DFC155C911ED08C658839127F4CEC6AB548B39BE8CC499CE7F27F13AE57
profile=D:\\key\\auto_debug_Myapplication_900086000300430549.p7b
certpath=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,构建,签名,应用,HAP 来源: https://blog.csdn.net/Forever_wj/article/details/119085321