目录
[1 -> 应用隐私保护](#1 -> 应用隐私保护)
[1.1 -> 透明可控](#1.1 -> 透明可控)
[1.2 -> 数据最小化](#1.2 -> 数据最小化)
[1.3 -> 身份保护](#1.3 -> 身份保护)
[1.4 -> 数据安全保障](#1.4 -> 数据安全保障)
[2 -> 三方应用调用管控机制](#2 -> 三方应用调用管控机制)
[2.1 -> 为什么要进行调用管控](#2.1 -> 为什么要进行调用管控)
[2.2 -> 相关概念](#2.2 -> 相关概念)
[2.3 -> 调用管控总体思路](#2.3 -> 调用管控总体思路)
[2.4 -> 管控规则](#2.4 -> 管控规则)
[3 -> 资源分类与访问](#3 -> 资源分类与访问)
[3.1 -> 资源分类](#3.1 -> 资源分类)
[3.1.1 -> resources目录](#3.1.1 -> resources目录)
[3.1.2 -> 限定词目录](#3.1.2 -> 限定词目录)
[3.1.3 -> 资源组目录](#3.1.3 -> 资源组目录)
[3.2 -> 资源访问](#3.2 -> 资源访问)
[3.2.1 -> 应用资源](#3.2.1 -> 应用资源)
[3.2.2 -> 系统资源](#3.2.2 -> 系统资源)
1 -> 应用隐私保护
随着移动终端及其相关业务(如移动支付、终端云等)的普及,用户隐私保护的重要性愈发突出。应用开发者在产品设计阶段就需要考虑用户隐私的保护,提高应用的安全性。HarmonyOS应用开发需要遵从隐私保护规则,在应用上架应用市场时,应用市场会根据规则进行校验,如不满足条件则无法上架。
1.1 -> 透明可控
应用采集个人数据时,应清晰、明确地告知用户,并确保告知用户的个人信息将被如何使用。
- 应用申请操作系统敏感权限时,需要明确告知用户权限申请的目的和用途,并获取用户的同意。
- 开发者应制定并遵从适当的隐私政策,在收集、使用留存和第三方分享用户数据时需要符合所有适用法律、政策和规定。如在收集个人数据前,需充分告知用户处理个人数据的种类、目的、处理方式、保留期限等,满足数据主体权利等要求。
- 应用向第三方披露任何个人信息须告知用户披露内容、目的和披露对象。
- 为了便于用户查看应用收集的个人信息与向第三方披露的个人信息,建议以清单列表的形式呈现在应用的二级菜单中。
- 个人数据应当基于具体、明确、合法的目的收集,与此目的不相符的方式不应该进行进一步处理。对于收集目的变更和用户撤销同意后再次使用的场景都需要用户重新同意。
- 应用需要提供用户查看隐私声明的入口。例如在应用的"关于"界面提供查看隐私声明的入口。
- 应用存在调用第三方的元服务场景时,需要在应用的隐私声明中明确第三方责任,如涉及个人数据收集则需要告知用户第三方的名称及收集的个人数据类型、目的和方式,申请的敏感权限、申请目的等。
对个人数据处理必须要征得用户的同意或遵守适用的法律法规,用户对其个人数据要有充分的控制权。
- 系统对于用户的敏感数据和系统关键资源的获取设置了对应的权限,应用访问这些数据时需要申请对应的权限。
- 应用申请使用敏感权限:应用弹窗提醒,向用户呈现应用需要获取的权限和权限使用目的、应用需要收集的数据和使用目的等,通过用户点击"允许"或"仅使用期间允许"或"允许本次使用"的方式完成用户授权,让用户对应用权限的授予和个人数据的使用做到透明、可知、可控。
- 用户可以修改、取消授予应用的权限:当用户不同意某一权限或者数据收集时,应当允许用户使用与这部分权限和数据收集不相关的功能。如通信社交类应用,用户可以拒绝授予相机权限,不应该影响与相机无关的功能操作,如语音通话。
- 在进入应用的主界面之前不建议直接弹窗申请敏感权限,仅在用户使用功能时才请求对应的权限。如通信社交类应用,在没有启用位置相关的功能时,不建议在启动应用时就申请位置权限。
- 应用若使用个人数据用于个性化广告和精准营销,需提供独立的关闭选项。
- 需要向用户提供对个人数据的控制能力;如在云服务上存储了个人数据,需要提供删除数据的方法。
- 应用同时支持单设备和跨设备场景时,用户能够单独关闭跨设备应用场景。
- 如果应用是给未成年人设计的,或者应用通过收集的用户年龄数据识别出用户是未成年人,开发者应该结合目标市场国家的相关法律,专门分析未成年人个人数据保护的问题。
- 收集未成年人数据前需要征得监护人的同意。
1.2 -> 数据最小化
应用个人数据收集应与数据处理目的相关,且是适当、必要的。开发者应尽可能对个人数据进行匿名化或假名化处理,降低数据主体的风险。仅可收集和处理与特定目的相关且必需的个人数据,不能对数据做出与特定目的不相关的处理。
- 敏感权限申请的时候要满足权限最小化的要求,在进行权限申请时,只申请获取必需的信息或资源所需要的权限。如应用不需要相机权限就能够实现其功能时,则不应该向用户申请相机权限。
- 应用针对数据的收集要满足最小化要求,不收集与应用提供服务无关联的数据。如通信社交类应用,不应收集用户的网页浏览记录。
- 数据使用的功能要求能够使用户受益,收集的数据不能用于与用户正常使用无关的功能。如应用不得将"生物特征"、"健康数据"等敏感个人数据用于服务改进、投放广告或营销等非业务核心功能。
- 系统禁止应用在后台访问相机和麦克风的数据;
- 应用使用第三方支付交易过程中,如非适用法律要求或为提供第三方支付服务所必需,不得记录用户交易类鉴权信息,或向第三方批露与用户特定交易无关的用户个人信息。
- 应用不得仅出于广告投放或数据分析的目的而请求位置权限。
- 禁止在日志中打印敏感个人数据,如需要打印个人数据时,应对个人数据进行匿名化或假名化处理;
- 避免使用IMEI和序列号等永久性的标识符,尽量使用可以重置的标识符,如系统提供了NetworkID和DVID作为分布式场景下的设备标识符,广告业务场景下则建议使用OAID,基于应用的分析则建议使用ODID和AAID,其他需要唯一标识符的场景可以使用UUID接口生成;
- 不再需要使用的数据需要及时清除,降低数据泄露的风险。如分布式业务场景下设备断开分布式网络,临时缓存的数据需要及时删除。
- 在后台持续读取位置信息场景时,请申请ohos.permission.LOCATION_IN_BACKGROUND权限。
- 专为未成年人设计的应用不建议请求获取位置权限。
1.3 -> 身份保护
使用隐私增强技术,使数据离开端侧时保护用户的身份。
- 应用使用用户可以重置的随机标识符代替唯一标识符。
- 应用导出个人数据时,对导出的个人数据进行加密保护或匿名化处理。
1.4 -> 数据安全保障
从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,应默认开启或采取安全保护措施。
- 数据存储
- 应用产生的密钥以及用户的敏感个人数据需要存储在应用的私有目录下。
- 应用可以调用系统提供的本地数据库RdbStore的加密接口对敏感个人数据进行加密存储。
- 应用产生的分布式数据可以调用系统的分布式数据库进行存储,对于敏感个人数据需要采用分布式数据库提供的加密接口进行加密。
- 安全传输
需要分别针对本地传输和远程传输采取不同的安全保护措施。
本地传输:
应用通过intent跨应用传输数据时避免包含敏感个人数据,防止隐式调用导致intent劫持,导致个人数据泄露。
- 应用内组件调用应采用安全方式,避免通过隐式方式进行调用组件,防止组件劫持。
- 避免使用socket方式进行本地通信,如需使用,localhost端口号随机生成,并对端口连接对象进行身份认证和鉴权。
- 本地IPC通信安全:作为服务提供方需要校验服务使用方的身份和访问权限,防止服务使用方进行身份仿冒或者权限绕过。
远程传输:
- 使用https代替http进行通信,并对https证书进行严格校验。
- 避免进行远程端口进行通信,如需使用,需要对端口连接对象进行身份认证和鉴权。
- 应用进行跨设备通信时,需要校验被访问设备和应用的身份信息,防止被访问方的设备和应用进行身份仿冒。
- 应用进行跨设备通信时,作为服务提供方需要校验服务使用方的身份和权限,防止服务使用方进行身份仿冒或者权限绕过。
2 -> 三方应用调用管控机制
2.1 -> 为什么要进行调用管控
后台进程启动过多,会消耗系统的内存、CPU等资源,造成用户设备耗电快、卡顿等现象。因此,为了保证用户体验,系统会对三方用户应用程序之间的PA调用进行管控,减少不必要的关联拉起。
注意:三方应用是相对于系统应用(不可卸载或者appId小于10000的应用)而言的,由第三方开发的用户应用程序。
2.2 -> 相关概念
- 前台:用户应用程序有可见的FA正在显示,则认为用户应用程序在前台。
- 用户应用程序内调用:同一用户应用程序内的FA、PA之间的访问。
2.3 -> 调用管控总体思路
- 用户应用程序内调用不管控。
- 三方用户应用程序间调用严格管控:禁止三方用户应用程序在后台调用其他三方应用的PA;严格管控三方用户应用程序在前台调用其他用户应用程序的PA。
2.4 -> 管控规则
-
用户应用程序内调用
不管控。
-
三方用户应用程序间调用
三方应用程序A调用三方应用程序B的PA,具体限制如下:
- 禁止A在后台调用B的PA。
- 当B有进程存活时,允许A在前台调用B的PA;当B无进程存活时,禁止A的调用。
3 -> 资源分类与访问
应用开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。
- **应用资源:**借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同设备或配置中的表现。
- 系统资源:开发者直接使用系统预置的资源定义。
3.1 -> 资源分类
3.1.1 -> resources目录
应用开发中使用的各类资源文件,需要放入特定子目录中存储管理。resources目录包括三大类目录,一类为base目录,一类为限定词目录,还有一类为rawfile目录。stage模型多工程情况下共有的资源文件放到AppScope下的resources目录。
base目录默认存在,而限定词目录需要开发者自行创建。应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找该资源。只有当resources目录中没有与设备状态匹配的限定词目录,或者在限定词目录中找不到该资源时,才会去base目录中查找。rawfile是原始文件目录,不会根据设备状态去匹配不同的资源。
资源目录示例:
resources
|---base // 默认存在的目录
| |---element
| | |---string.json
| |---media
| | |---icon.png
|---en_GB-vertical-car-mdpi // 限定词目录示例,需要开发者自行创建
| |---element
| | |---string.json
| |---media
| | |---icon.png
|---rawfile
|----------|---------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------|
| 分类 | base目录 | 限定词目录 | rawfile目录 |
| 组织形式 | base目录是默认存在的目录。当应用的resources目录中没有与设备状态匹配的限定词目录时,会自动引用该目录中的资源文件。 base目录的二级子目录为资源组目录,用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。 | 限定词目录需要开发者自行创建。目录名称由一个或多个表征应用场景或设备特征的限定词组合而成。 限定词目录的二级子目录为资源组目录,用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。 | 支持创建多层子目录,目录名称可以自定义,文件夹内可以自由放置各类资源文件。 rawfile目录的文件不会根据设备状态去匹配不同的资源。 |
| 编译方式 | 目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。 | 目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。 | 目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。 |
| 引用方式 | 通过指定资源类型(type)和资源名称(name)来引用。 | 通过指定资源类型(type)和资源名称(name)来引用。 | 通过指定文件路径和文件名来引用。 |
[表1 resources目录分类]
3.1.2 -> 限定词目录
限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括移动国家码和移动网络码、语言、文字、国家或地区、横竖屏、设备类型、颜色模式和屏幕密度等维度,限定词之间通过下划线(_)或者中划线(-)连接。开发者在创建限定词目录时,需要掌握限定词目录的命名要求,以及限定词目录与设备状态的匹配规则。
限定词目录的命名要求
-
限定词的组合顺序:移动国家码_移动网络码-语言_文字_国家或地区-横竖屏-设备类型-颜色模式-屏幕密度。开发者可以根据应用的使用场景和设备特征,选择其中的一类或几类限定词组成目录名称。
-
限定词的连接方式:语言、文字、国家或地区之间采用下划线()连接,移动国家码和移动网络码之间也采用下划线()连接,除此之外的其他限定词之间均采用中划线(-)连接。例如:zh_Hant_CN 、zh_CN-car-ldpi。
-
限定词的取值范围:每类限定词的取值必须符合限定词取值要求表中的条件,否则,将无法匹配目录中的资源文件。
|-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 限定词类型 | 含义与取值说明 |
| 移动国家码和移动网络码 | 移动国家码(MCC)和移动网络码(MNC)的值取自设备注册的网络。MCC后面可以跟随MNC,使用下划线(_)连接,也可以单独使用。例如:mcc460表示中国,mcc460_mnc00表示中国_中国移动。 详细取值范围,请查阅ITU-T E.212(国际电联相关标准)。 |
| 语言 | 表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。 详细取值范围,请查阅ISO 639(ISO制定的语言编码标准)。 |
| 文字 | 表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如:Hans表示简体中文,Hant表示繁体中文。 详细取值范围,请查阅ISO 15924(ISO制定的文字编码标准)。 |
| 国家或地区 | 表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如:CN表示中国,GB表示英国。 详细取值范围,请查阅ISO 3166-1(ISO制定的国家和地区编码标准)。 |
| 横竖屏 | 表示设备的屏幕方向,取值如下: - vertical:竖屏 - horizontal:横屏 |
| 设备类型 | 表示设备的类型,取值如下: - car:车机 - tv:智慧屏 - wearable:智能穿戴 |
| 颜色模式 | 表示设备的颜色模式,取值如下: - dark:深色模式 - light:浅色模式 |
| 屏幕密度 | 表示设备的屏幕密度(单位为dpi),取值如下: - sdpi:表示小规模的屏幕密度(Small-scale Dots Per Inch),适用于dpi取值为(0, 120]的设备。 - mdpi:表示中规模的屏幕密度(Medium-scale Dots Per Inch),适用于dpi取值为(120, 160]的设备。 - ldpi:表示大规模的屏幕密度(Large-scale Dots Per Inch),适用于dpi取值为(160, 240]的设备。 - xldpi:表示特大规模的屏幕密度(Extra Large-scale Dots Per Inch),适用于dpi取值为(240, 320]的设备。 - xxldpi:表示超大规模的屏幕密度(Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(320, 480]的设备。 - xxxldpi:表示超特大规模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(480, 640]的设备。 |
[表2 限定词取值要求]
限定词目录与设备状态的匹配规则
-
在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:移动国家码和移动网络码 > 区域(可选组合:语言、语言_文字、语言_国家或地区、语言_文字_国家或地区)> 横竖屏 > 设备类型 > 颜色模式 > 屏幕密度。
-
如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如,限定词目录"zh_CN-car-ldpi"不能参与"en_US"设备的资源匹配。
3.1.3 -> 资源组目录
base目录与限定词目录下面可以创建资源组目录(包括element、media、profile),用于存放特定类型的资源文件。
|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 资源组目录 | 目录说明 | 资源文件 |
| element | 表示元素资源,以下每一类数据都采用相应的JSON文件来表征。 - boolean,布尔型 - color,颜色 - float,浮点型 - intarray,整型数组 - integer,整型 - pattern,样式 - plural,复数形式 - strarray,字符串数组 - string,字符串 | element目录中的文件名称建议与下面的文件名保持一致。每个文件中只能包含同一类型的数据。 - boolean.json - color.json - float.json - intarray.json - integer.json - pattern.json - plural.json - strarray.json - string.json |
| media | 表示媒体资源,包括图片、音频、视频等非文本格式的文件。 | 文件名可自定义,例如:icon.png。 |
| rawfile | 表示其他类型文件,在应用构建为hap包后,以原始文件形式保存,不会被集成到resources.index文件中。 | 文件名可自定义。 |
[表3 资源组目录说明]
媒体资源类型说明:
|----------|-----------|
| 格式 | 文件后缀名 |
| JPEG | .jpg |
| PNG | .png |
| GIF | .gif |
| SVG | .svg |
| WEBP | .webp |
| BMP | .bmp |
[表4 图片资源类型说明]
|----------------------------------------|--------------------|
| 格式 | 支持的文件类型 |
| H.263 | .3gp .mp4 |
| H.264 AVC Baseline Profile(BP) | .3gp .mp4 |
| MPEG-4 SP | .3gp |
| VP8 | .webm .mkv |
[表5 音视频资源类型说明]
资源文件示例:
color.json文件的内容如下:
css
{
"color": [
{
"name": "color_hello",
"value": "#ffff0000"
},
{
"name": "color_world",
"value": "#ff0000ff"
}
]
}
float.json文件的内容如下:
css
{
"float":[
{
"name":"font_hello",
"value":"28.0fp"
},
{
"name":"font_world",
"value":"20.0fp"
}
]
}
string.json文件的内容如下:
css
{
"string":[
{
"name":"string_hello",
"value":"Hello"
},
{
"name":"string_world",
"value":"World"
},
{
"name":"message_arrive",
"value":"We will arrive at %s."
}
]
}
plural.json文件的内容如下:
css
{
"plural":[
{
"name":"eat_apple",
"value":[
{
"quantity":"one",
"value":"%d apple"
},
{
"quantity":"other",
"value":"%d apples"
}
]
}
]
}
3.2 -> 资源访问
3.2.1 -> 应用资源
创建资源文件
在resources目录下,可按照限定词目录和资源组目录的说明创建子目录和目录内的文件。
同时,DevEco Studio也提供了创建资源目录和资源文件的界面。
-
创建资源目录及资源文件
在resources目录右键菜单选择"New > Resource File",此时可同时创建目录和文件。
文件默认创建在base目录的对应资源组下。如果选择了限定词,则会按照命名规范自动生成限定词+资源组目录,并将文件创建在目录中。
图中Avaliable qualifiers为供选择的限定词目录,通过右边的小箭头可添加或者删除。File name为需要创建的文件名,Resource type为资源组类型,默认是element。Root Element为资源类型。创建的目录名自动生成,格式固定为"限定词.资源组",例如:创建一个限定词为dark的element目录,自动生成的目录名称为"dark.element"。
- 创建资源目录
在resources目录右键菜单选择"New > Resource Directory",此时可创建资源目录。
资源目录创建的是base目录,也可根据需求创建其它限定词目录。确定限定词后,选择资源组类型,当前资源组类型支持Element、Media、Profile三种,创建后自动生成目录名称。
- 创建资源文件
在资源目录的右键菜单选择"New > XXX Resource File",即可创建对应资源组目录的资源文件。
例如,在element目录下可新建Element Resource File。
访问应用资源
在工程中,通过"$r('app.type.name')"的形式引用应用资源。app代表是应用内resources目录中定义的资源;type代表资源类型(或资源的存放位置),可以取"color"、"float"、"string"、"plural"、"media",name代表资源命名,由开发者定义资源时确定。
引用rawfile下资源时使用"$rawfile('filename')"的形式,filename需要表示为rawfile目录下的文件相对路径,文件名需要包含后缀,路径开头不可以以"/"开头。
说明:资源描述符不能拼接使用,仅支持普通字符串如'app.type.name'。在xxx.ets文件中,可以使用在resources目录中定义的资源。
java
Text($r('app.string.string_hello'))
.fontColor($r('app.color.color_hello'))
.fontSize($r('app.float.font_hello'))
Text($r('app.string.string_world'))
.fontColor($r('app.color.color_world'))
.fontSize($r('app.float.font_world'))
// 引用string.json资源,$r的第二个参数用于替换%s,value为"We will arrive at five of the clock"。
Text($r('app.string.message_arrive', "five of the clock"))
.fontColor($r('app.color.color_hello'))
.fontSize($r('app.float.font_hello'))
// 引用plural$资源,第一个指定plural资源,第二个参数指定单复数的数量quantity,此处第三个数字为对%d的替换
// 单数下value为"5 apple",复数下value为"5 apples"。
Text($r('app.plural.eat_apple', 5, 5))
.fontColor($r('app.color.color_world'))
.fontSize($r('app.float.font_world'))
Image($r('app.media.my_background_image')) // media资源的$r引用
Image($rawfile('test.png')) // rawfile$r引用rawfile目录下图片
Image($rawfile('newDir/newTest.png')) // rawfile$r引用rawfile目录下图片
3.2.2 -> 系统资源
系统资源包含色彩、圆角、字体、间距、字符串及图片等。通过使用系统资源,不同的开发者可以开发出具有相同视觉风格的应用。
开发者可以通过"$r('sys.type.resource_id')"的形式引用系统资源。sys代表是系统资源;type代表资源类型,可以取"color"、"float"、"string"、"media";resource_id代表资源id。
说明:
- 仅声明式开发范式支持使用系统资源,类Web开发范式不支持。
- 系统资源的使用场景、id、参数详细对照表详见系统资源。
java
// API version 7
Text('Hello')
.fontColor($r('sys.color.id_color_emphasize'))
.fontSize($r('sys.float.id_text_size_headline1'))
.fontFamily($r('sys.string.id_text_font_family_medium'))
.backgroundColor($r('sys.color.id_color_palette_aux1'))
Image($r('sys.media.ic_app'))
.border({color: $r('sys.color.id_color_palette_aux1'), radius: $r('sys.float.id_corner_radius_button'), width: 2})
.margin({top: $r('sys.float.id_elements_margin_horizontal_m'), bottom: $r('sys.float.id_elements_margin_horizontal_l')})
.height(200)
.width(300)
// API version 8
Text('Hello')
.fontColor($r('sys.color.ohos_id_color_emphasize'))
.fontSize($r('sys.float.ohos_id_text_size_headline1'))
.fontFamily($r('sys.string.ohos_id_text_font_family_medium'))
.backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))
Image($r('sys.media.ohos_app_icon'))
.border({color: $r('sys.color.ohos_id_color_palette_aux1'), radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2})
.margin({top: $r('sys.float.ohos_id_elements_margin_horizontal_m'), bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')})
.height(200)
.width(300)
感谢各位大佬支持!!!
互三啦!!!