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

Posted Forever_wj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.65.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之深入解析编译构建的配置和代码混淆的主要内容,如果未能解决你的问题,请参考以下文章

HarmonyOS之深入解析图像的编码和解码

HarmonyOS之深入解析视频的功能和使用

HarmonyOS之深入解析NFC的功能和使用

HarmonyOS之深入解析音频的功能和使用

HarmonyOS之深入解析相机的功能和使用

HarmonyOS之深入解析图像的位图操作和属性解码