在早期的DevEco Studio版本(如v5.0)中,创建的工程没有配置targetSdkVersion(目标SDK版本)。当使用DevEco Stodio版本及之后的版本(如v5.1)打开之前创建的工程,编译时有WARN提示。
> hvigor WARN: The project has not explicitly set the 'targetSdkVersion' version at build-profile.json5. It is recommended to configure it.

在DevEco Studio 5.0.5版本之后,新创建的项目,才默认有targetSdkVersion配置项,在《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书中,没有对targetSdkVersion及相关的配置进行相关的介绍。个人刚接触时也有些不太理解targetSdkVersion(目标SDK版本)与compileSdkVersion(编译SDK版本)及compatibleSdkVersion(兼容SDK版本)的关系。
本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书第五章内容的延续,是咱这本书读者的福利,在本篇内容会介绍compileSdkVers(编译SDK版本)、targetSdkVersion(目标SDK版本)和compatibleSdkVersion(兼容SDK版本)这三项影响应用兼容性的关键信息,以帮助读者以最合适方式指定目标设备并有效的使用系统提供的API,欢迎大家一同来深入的解,甚至可以当作面试题来学习。
打个广告,对本书感兴趣的同学可以点击以下链接进行购买,或者了解我的班级参加 班级共同学习,点击链接可进入(华为官方活动)
往期福利:
- 【页面路由导航】三步实现页面跳转的完整示例-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
- 【鸿蒙生态共建】一文10个示例讲懂鸿蒙系统ArkTS中的null与undefined的区别与应用-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
- 【鸿蒙生态共建】一文两表三实例讲清async函数与普通函数的区别-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
- 【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
1: 基本定义:
1.1:API版本取值定义:
在了解本篇内容之前,先了解在HarmonyOS系统中API版本取值的格式,为M.S.F(N) Stage,如:5.1.0(18), 其中:
- M取值为1-99,表示API大版本更新。
- S和F取值都为0-99,表示API小版本更新。
- N为OpenHarmony底座的API level,取值为1-99。
- Stage为当前SDK的发布阶段,仅在SDK的版本号中可见,取值为CanaryN/BetaN/[Release], N为正整数,Release版本发布时可省略Release。
1.2:compileSdkVers、targetSdkVersion和compatibleSdkVersion定义:
compileSdkVers、targetSdkVersion和compatibleSdkVersion在项目的/build-profile.json5中设置,影响应用兼容性的关键信息。定义及说明如下表中所示:
如简介所述,开发应用时使用的SDK版本决定了API能力范围以及具体的API行为。在应用开发过程中,有如下SDK版本属性:
SDK版本属性 | 源码工程中配置项 (build-profile.json5文件中) | 应用打包后的对应字段 (module.json5文件中) | 说明 |
|---|---|---|---|
编译应用的SDK版本 | compileSdkVersion | compileSdkVersion | 编译应用工程的SDK版本,该字段决定了应用开发过程中联想的API范围和使用的工具链版本。 取值默认为DevEco Studio自带的SDK版本,如需显示配置,只能配置为当前DevEco Studio自带的SDK版本。 |
应用运行的目标SDK版本 | targetSdkVersion | targetAPIVersion | 应用运行的目标SDK版本。针对系统侧进行API版本隔离的变更,应用在终端设备上运行时会呈现以targetSdkVersion版本为目标版本的行为。 例如当前设备API版本为5.0.2(14),而运行在该设备上的某应用targetSdkVersion配置为5.0.1(13),则经过API版本隔离的变更会以5.0.1(13)版本的API行为呈现。在5.0.2(14)发生的API变更不会影响该应用在当前设备的实际表现。 如果应用工程中未填写该字段,则在应用包中该字段默认填写为编译该应用的SDK版本号。 强烈建议开发者在应用工程build-profile.json5中配置targetSdkVersion字段,如果开发者未配置该字段,则该字段取值默认为compileSdkVersion的值。 |
应用运行的最低SDK版本 | compatibleSdkVersion | minAPIVersion | 应用运行要求的最低SDK版本。运行该应用的终端设备系统搭载的API版本不能低于该字段的值,低于则无法安装。 该字段版本值不能高于目标SDK版本。 可将compatibleSdkVersion的值设置为较小值,从而可在更低版本的系统上安装该应用,但应用是否能在compatibleSdkVersion对应系统版本上面正常运行,需要开发者针对无法在compatibleSdkVersion版本使用的API进行兼容性判断保护。 |
1.2.1: 三者取值关系:
三者关为 compatibleSdkVersion <= targetSdkVersion <= compileSdkVersion. 当在工程配置中不符合此规则时,会报错。
* Try the following:
> Configure the API version according to the rule of compatibleSdkVersion <= targetSdkVersion <= compileSdkVersion.
![]()
2: compileSdkVersion信息
上节的表格中提到,compileSdkVersion是编译应用工程的SDK版本,该字段决定了应用开发过程中联想的API范围和使用的工具链版本。取值默认为DevEco Studio自带的SDK版本,如需显示配置,只能配置为当前DevEco Studio自带的SDK版本。默认项目的/build-profile.json5中也是没有显示的设置该项的信息。
1.1: 如何查看compileSdkVersion信息
如果需要查看compileSdkVersion信息,主要分为两步:
首先先查看DevEco Studio 的版本,在DevEco Studio 关于查看版本,截图如下。

之后在https://developer.huawei.com/consumer/cn/doc/harmonyos-releases/overview-allversion中查看DevEco Studio 对应的版本,如下图,DevEco Studio 5.1.1 Release对应的SDK API版本为5.1.1(19)

2.2: 如何设置compileSdkVersion信息
如需要显示的设置compileSdkVersion信息,在项目的/build-profile.json5中,增加"compileSdkVersion": "5.0.1(13)",注意5.0.1(13)要与DevEdo Studio的API版本相同,否则会报错,如下所示。
{
"app": {
"signingConfigs": [],
"products": [
{
"name": "default",
"signingConfig": "default",
"compileSdkVersion": "5.0.1(13)",
当配置与DevEco Studio的API版本不同时的报错提示


3: targetSdkVersion信息
targetSdkVersion的设置方式,与compileSdkVersion相同,在项目的/build-profile.json5中,增加"targetSdkVersion": "5.0.1(13)",注意5.0.1(13)要可根据需要进行配置
{
"app": {
"signingConfigs": [],
"products": [
{
"name": "default",
"signingConfig": "default",
"targetSdkVersion": "5.0.1(13)",
对应的截图如下:

3.1:targetSdkVersion信息配置实践
在第一小节中,以文字的方式对targetSdkVersion进行说明。“例如当前设备API版本为5.0.2(14),而运行在该设备上的某应用targetSdkVersion配置为5.0.1(13),则经过API版本隔离的变更会以5.0.1(13)版本的API行为呈现。在5.0.2(14)发生的API变更不会影响该应用在当前设备的实际表现。”光看文字很难理解,在实际的研发时应该如何实施,下面举个例示例说明一下。
在官方的文档中,getKeyboardAvoidMode接口返回值在 5.1.0(API 18)版本进行了变更,也就是说在实际开发时,需要注意变更带来的影响。

我们先在EntryAbility的onWindowStageCreate方法中增加以下实现
onWindowStageCreate(windowStage: window.WindowStage): void {
console.info('俩毛豆 Ability onWindowStageCreate');
windowStage.loadContent('pages/Index', (err) => {
let keyboardAvoidMode = windowStage.getMainWindowSync().getUIContext().getKeyboardAvoidMode();
console.info('俩毛豆 ' + JSON.stringify(keyboardAvoidMode));
});
}
指定targetSdkVersion 为 5.0.1(13)编译,并在API 14(小于API18即可)的设备上运行输出的日志为:

指定targetSdkVersion 为 5.0.1(13)编译,并在API 20(大于等于API18即可)的设备上运行输出的日志为:

看起来没有什么变化,指定targetSdkVersion 为5.1.0(18)编译,并在API 14(小于API18即可)的设备上运行输出的日志为,还是没什么变化:

指定targetSdkVersion 为 5.1.0(18)编译,并在API 18(大于等于API18即可)的设备上运行输出的日志为,这时该函数返回的值就不同了,故代码处理的逻辑上也需要分别的处理:

可以看出,对于targetSdkVersion的设定,会影响API执行的结果。这时再看官方的文字说明,是不是就更容易理解了,“例如当前设备API版本为5.0.2(14),而运行在该设备上的某应用targetSdkVersion配置为5.0.1(13),则经过API版本隔离的变更会以5.0.1(13)版本的API行为呈现。在5.0.2(14)发生的API变更不会影响该应用在当前设备的实际表现。”
4: compatibleSdkVersion信息
在上一节的例子中,可以看出,项目是可以在低于API 18的系统中运行,也可以在高于API 18的系统中运行,是因为最低的运行API版本的设置,受compatibleSdkVersion的配置项影响。即compatibleSdkVersion决定了项目产出的App可以在那些SDK版本的设备中运行。
compatibleSdkVersion信息默认在项目的/build-profile.json5中,如下所示。
{
"app": {
"signingConfigs": [],
"products": [
{
"name": "default",
"signingConfig": "default",
"compatibleSdkVersion": "5.0.1(13)",

当该值设定一个较高的版本,如5.1.0(18) 这时targetSdkVersion也需要进行对应的升级。当使用在低版本的系统中运行App时会报错,“compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device.”,当App上线之后,在低于5.1.0(18)的系统中也是无法安装,在应用商店中也无法搜索到。

5: API兼容
在实际的研发中,如需要存在API需要在不同的运行系统版本中进行兼容,可以使用以下的代码进行兼容性的判断。
console.info('俩毛豆 deviceInfo.distributionOSApiVersion ' + JSON.stringify(deviceInfo.distributionOSApiVersion));
// 兼容性判断,50100是由新接口的since字段M*10000+F*100+S转换而来
if (deviceInfo.distributionOSApiVersion >= 50100) {
// 调用5.1.0(18)的API新接口
console.info('俩毛豆 调用5.1.0(18)的API新接口');
} else {
// 降级方案
console.info('俩毛豆 调用降级方案');
}
对应的该代码在API 14(5.0.2),和API 18(5.1.0)的系统中输出的日志为。结合3.1小节的内容,当需要使用高阶API的特性,又需要兼容低版本的设备可使用该方案来保证在低版本的设备中,不执行高阶的API或者对于同一API区别参数或返回值。


总结:
在本篇的内容中,介绍了targetSdkVersion(目标SDK版本)与compileSdkVersion(编译SDK版本)及compatibleSdkVersion(兼容SDK版本)的关系及实践应用。
这三个配置项,在App研发生命周期会经常性的更改,也会受大环境的影响。合理的配置,会帮助App即可支持新的技术特性,又可以覆盖更广的用户群体,这也是本篇内容的核心价值之一。
最后再打下广告,对本书感兴趣的同学可以点击以下链接进行购买,或者了解我的班级参加 班级共同学习,点击链接可进入(华为官方活动)
浙公网安备 33010602011771号