小米开发平台平台素材审核规范

小米开发平台平台素材审核规范

本文档介绍了游戏中心、应用商店、快游戏等平台素材的尺寸、格式要求,您可通过阅读本文档,对平台素材审核规范有一定了解。

一、资源位尺寸及格式总览

需要审核的素材资源位包括:游戏中心APP资源位应用商店资源位快游戏APP资源位、SDK素材

  • 游戏中心
  • 应用商店
  • 快游戏
  • SDK素材

二、游戏中心素材

  • 开屏
  • 首页轮播图banner
  • 福利中心banner
  • 浮层
  • 右下角浮标
  • 首页首屏大图
  • 高端机预约详情页头图
  • SDK弹窗

三、应用商店素材

  • 开屏图
  • 浮层
  • 活动banner

四、快游戏素材

  • 首页banner
  • 活动banner

完整规范请见附件和网盘链接:

链接: https://pan.baidu.com/s/12UQrVX_hdwZlP41kMp4Ong 提取码: rlwe

1

如您仍有疑问,可进入问题工单系统,与我们取得联系。

小米平台素材审核规范8月25日.pdf

小米开发平台常见保证(承诺)函模板

小米开发平台常见保证(承诺)函模板

本文档介绍了常见保证(承诺函)模板,您可在了解文档内容后,自行上传承诺函。

一、相关内容须知

小米应用商店积极响应国家有关政府部门号召,将进一步加强金融投资理财类 、单本图书类、书城类、医疗健康类和盲盒类产品的上架审核。

目前对以下类别的产品,需到开发者后台提交【小米应用商店免责承诺函】:

1、应用存在借贷功能或属于P2P等借贷类的产品;

2、应用为单本图书类或书城的产品;

3、应用存在销售药物、医院挂号、整容、线上问诊、健康咨询或指导等功能或选择医疗健康分类的产品;

4、应用内存在盲盒内容的产品;

如贵公司(暂不接受个人开发者提交此类产品)的产品类型符合以上四点,请下载与贵公司产品的分类相对应的【小米应用商店免责承诺函】盖公司章后,将照片或扫描件(JPG/PNG格式,无尺寸要求)提交到开发者后台。对于未在规定时间内提交承诺函的应用,小米应用商店可能采取暂停审核上架或暂停其版本更新等措施。

注意:第一次在开发者后台提交了免责承诺函的应用,下一次版本更新时无需再重复提交。如有疑问,请进入问题工单系统,进行咨询。

二、免责承诺函提交方法

1、点击“更新版本”或者“查看资料”。

2、填写相关信息,下拉到“行业资质证明”一栏,上传“免责承诺函”,完善其他信息,提交审核。

三、点击附件下载相应模板

以上为常见保证(承诺)函模板内容,如您仍有问题,可进入问题工单系统,与我们取得联系。

承诺函-单本图书、书城类.docx

承诺函-理财类.docx

承诺函-医疗类.docx

承诺函-盲盒类.docx

承诺函通用版本.docx

小米应用商店APP举报方式

小米应用商店APP举报方式

关于举报和问题申诉

1、举报

如果您发现某个应用违反了本政策条款,如存在应用侵权、内容违规等问题,您可以通过以下渠道将对应信息告知小米,小米将会在收到举报后的合理期限内,对举报内容进行核实处理:

  • 开发者服务站问题反馈工单:小米应用商店 (sobot.com)
  • 应用问题反馈邮箱:developer@xiaomi.com
  • 游戏开发者问题反馈邮箱:mi-gamebd@xiaomi.com
  • 游戏开发者问题对接客服QQ:3007324363,客服1:3007322822,客服2:2270269056

2、申诉

若开发者对小米违规行为处理结果及措施存在疑议,可通过以下渠道进行申诉,我们将在接到申诉后的合理期限内对申诉内容进行处理:

  • 开发者服务站问题反馈工单:小米应用商店 (sobot.com)
  • 游戏开发者问题反馈邮箱:mi-gamebd@xiaomi.com
  • 游戏开发者问题对接客服QQ:3007324363,客服:3007322822,客服2:2270269056

3、禁止申诉

小米有权对涉及以下情况的应用,禁止接受其申诉:

1、应用涉嫌违反法律法规(如:应用存在非法金钱交易、允许用户提交色情内容)。

2、应用触犯本政策中“用户体验”条款。

3、应用或开发者屡次出现违反本政策的行为(如:隐私问题多次出现、应用多次存在性能和功耗问题)。

小米应用商店APP上架规则上架规范

上架规范

本政策提及的小米应用市场包含小米应用商店以及游戏中心,在小米应用商店上架的应用除应符合本政策要求,还应符合小米应用商店上架要求:应用商店上架要求;联运游戏除应符合本政策要求,还应符合联运游戏上架要求:小米游戏上架要求

开发者生态保护机制的运作方式

小米会在开发者应用上传或应用安装时,对开发者的应用进行审核检测,并不定期对开发者发布以及安装的应用进行复查。小米发现开发者或 应用存在违反本政策的行为,小米将对开发者应用采取包括但不限于以下一项或多项处置:

  • 拒绝应用发布和更新申请
  • 搜索、展示环节,增加问题说明
  • 公开范围受限,减少推荐和搜索展示权重
  • 下架应用
  • 向用户进行问题说明
  • 冻结/注销开发者账号
  • 限制违规应用的下载和安装
  • 系统范围内保障用户权益的相关手段:冻结已授权能力/权限/服务(如:定位等个人隐私权限获取、Push发送服务等)

在识别应用是否违反本政策时,小米会考虑多种因素,包括但不限于本政策中所提及的违规行为。同样,小米会根据诸多因素判断是否存在违规,考虑的因素包括但不限于:针对具体应用和开发者的投诉、新闻报道、违规记录、用户反馈以及其他行为。

请注意,针对存在违反本政策的处置通知中可能不会一一指出应用出现的每项违规行为。开发者有责任根据相关条款进行问题修改,并进一步核查自查,以确保应用完全符合政策要求。如在指定期限内未能修改合规,小米将进一步采取措施。

违规处置措施和影响

以下将详细介绍对涉及违反本政策的行为,小米可能采取的措施以及措施对违规应用和违规应用开发者帐号的影响。

1、驳回上架/更新申请

1.1 提交审核的新应用或应用更新版本不会在小米应用商店发布。

1.2 审核驳回现有应用的更新版本,此次更新版本之前发布的应用版本仍会保留在小米应用市场上。

1.3 应用驳回不会影响开发者的应用您访问现有用户安装量、统计信息和评分。

注意:在未完全解决违规问题之前,请勿尝试重新提交被驳回的应用。

2、搜索、展示、下载、安装环节,增加问题说明

2.1 用户会在搜索、详情页、应用列表、下载页面、安装页面等功能页面,看到应用存在问题的说明。

2.2 当应用问题修改完成且通过检测后,问题说明会自动消除。

3、公开范围受限

3.1 违反本政策的应用曝光度将被限制,被推荐及被用户搜索到概率将会降低。严重违反本政策的情况下,不排除应用无新用户曝光仅支持已安装用户升级的情况。

3.2 将违反本政策的应用设置为“公开范围受限”状态,但不会影响开发者帐号正常使用。

3.3 将违反本政策的应用设置为“公开范围受限”状态,不会影响用户查看应用的现有应用详情、用户安装量、统计信息和评分。

4、下架应用

4.1 违反本政策的应用所有版本都会从小米应用市场中下架,用户将无法再下载该应用。

4.2 由于该应用已下架,因此用户将无法查看该应用的商品详情、用户安装量、统计信息和评分。如果对应开发者提交了修改通过版本,小米将对应用做恢复上架处理。

4.3 当应用因为违规或其他问题导致下架,将在用户搜索结果上进行应用下架原因的提示。

4.4 下架不会立即影响开发者帐号的使用,若应用多次违规下架,小米有权对违反本政策的应用对应的开发者帐号进行账号冻结处理。

注意:在未完全解决问题之前,请勿尝试重新发布已下架的应用。

5、对已安装用户发布问题说明

针对违法违规的应用,将对已安装用户发送问题说明告知应用存在的违规问题和风险。

6、冻结/注销开发者账号

6.1 如果开发者帐号被冻结/注销,该账号下的所有应用都将从小米应用市场下架,并且该开发者将无法再发布新应用。

6.2 由于已冻结/注销开发者帐号,且账号旗下的应用也已下架,因此开发者将无法查看应用的商品详情、现有用户安装量、统计信息和评分。

6.3 被冻结/注销的开发者账号,其账号原注册企业和开发者将无法再次申请新的账号。

7、冻结/中止已授权的系统能力和服务

7.1 对于小米所提供或授权的公开/非公开的系统能力、系统权限、功能服务等,均将中止或关闭,开发者将无法继续使用这些能力和服务。

小米开发平台用户体验合规要求

小米开发平台用户体验合规要求

用户体验

做好用户体验、保障用户安全为小米一直以来所追求的目标。为保障用户权益,确保用户在应用下载、使用环节获得更安全、更可靠的使用体验,小米不允许应用或应用所提供的内容破坏用户对小米生态系统的信任,以及未经用户许可,进行安装(默认安装或默认勾选安装)或访问其他应用、游戏或软件(包括第三方提供的功能和体验)等行为。运行在小米设备上的应用所提供访问权限的所有内容,须符合本政策的各项条款且用户有权知晓。因此,开发者不得违反下述要求以及不得有其他损害用户权益及体验的行为,小米愿意与开发者共同努力,打造良好用户体验生态。

1、应用内容

基本要求

1、应用不得是简单打包的网站页面或套用模板、内容聚合、罗列链接、广告推广等,需具备实用价值及创意性,能为用户提供差异化、高质量的体验。

2、应用需为用户提供绿色、独特、高质量的应用内容,不得出现对用户有害或者不当的内容。

3、应用功能主要为应用分发(包括允许下载、更新、搜索应用/游戏等功能)的开发者,需提供所分发应用符合小米上架标准的检测证明、以及确保应用持续合规运营的保障方法,并通过小米合规检测后进行分发。

4、应用提供分发下载功能的,不得以提供“高速下载”、“安全下载”功能,捆绑下载其他应用分发平台或其他应用。用户主动启动应用时,应直接启动,不得附加其他应用分发平台或其他跳转的方式启动。

5、应用不得借助“辅助功能”等技术能力,在用户下载安装环节,通过自动点击安装、或仅通过确认隐私协议等方式,绕过用户对下载安装的确认,直接进行下载安装。

2、应用功能

安装与注册

1、应用不得出现无法正常安装、安装时提示解析失败、启动、卸载、运行崩溃或出现需借助第三方软件才可卸载的情况。

2、应用安装后至多能出现一个桌面快捷图标,不得出现多个桌面快捷图标。

基本功能与使用限制

1、基础功能

1.1 应用不得出现内容无法正常显示或无法获取等情况。

1.2 应用不得出现按钮或者链接点击无反应或报错。

1.3 应用不得安装或者运行前提示或者强制用户重启设备。

1.4 应用主功能不得无法使用,如应用功能有问题,小米有权在应用上添加必要的风险提醒或相关标识。

1.5 应用介绍或更新日志中介绍的功能不得与实际不符。

1.6 应用不得运行后提示更新版本,请确保应用为最新版本。

1.7 应用长时间停留(超过5秒)在闪屏/启动引导界面,无法进入功能页面。

1.8 应用界面必须保证清晰,不得出现模糊、拉伸、压缩、黑边等情况。

1.9 不能出现花屏、分辨率不匹配等分辨率异常。

1.10 正常网络下,不得出现不维护、无网络连接、无内容等无法使用的问题。

1.11 游戏类应用需保证画面清晰、音效清楚合理、操作体验流畅,不得出现画面内容模糊、中途切出游戏后声音仍不中断、实际触控区域与手机显示区域存在偏差等影响用户体验的情况。

2、广告规范

2.1 应用所提供的广告,须与应用使用的群体相适用。

2.2 面向儿童的广告内容,必须适合儿童观看,不得包含欺骗性内容,或极易导致儿童用户无意间触发行为的内容。

2.3 禁止出于广告目的,强制用户必须点击/观看广告,或提交个人数据才能完整使用应用的行为。

2.4 应用所提供的广告,不得出现干扰应用运行和设备功能的行为,以及直接或间接影响用户正常使用的情况。

2.5 应用不得伪装成系统、官方或其他第三方应用推送广告及活动,或进行匿名推送的行为。

2.6 应用不得在锁屏、桌面等设备功能页面,推送广告或其他活动内容。

2.7 应用在通知栏区域的广告和活动内容,应允许用户清除或关闭。

2.8 针对游戏类应用内广告:

2.8.1 游戏内广告需完美适应屏幕方向,如:横屏游戏不得接入和提供竖屏开屏广告。

2.8.2 横幅、插屏广告必须可以关闭,且关闭区域清晰明确,关闭后30s内不得再次弹出展示。

2.8.3 插屏广告不得在游戏进行中弹出,且不得在继续游戏或返回游戏场景切换时弹出广告。

2.8.4 不得使用插屏视频广告作为激励视频广告。

2.8.5 激励视频广告必须由用户主动触发,在视频结束后必须可关闭且关闭区域清晰明确,对应奖励必须在游戏内发放兑换,不得出现奖励不到账、或实际奖励与承诺存在不一致的情况。

3、应用内付费

1、 在充值场景下,用户支付完成须即时到账,到账金额需与实际支付金额一致。

2、对用户已支付费用,但应用未提供对应服务的情况,须及时退费。

3、用户在付费环节支付失败或无法调起支付,须明确告知用户。

4、在应用内或信息介绍中,须注明付费未到账的反馈渠道(客服电话或联系邮箱)或处理方式。

5、应用不得在支付失败、取消支付后,出现无法运行、或强制付费才能使用的情况。

6、应用须合理定价,不得出现定价过高或价格欺诈的行为,实际展示的支付金额,必须与用户在支付环节所需支付的金额一致。

7、应用不得含有不正当吸费行为,包括但不限于:未经用户二次确认主动扣费(即用户需要对购买和支付分别进行一次确认)、隐形扣费行为,未明确、明显提示用户(例如收费协议嵌套在应用引导页内),以误导或诱导方式实现用户付费。

8、应用内容不得含有引导、要求用户进行异常交易,包括但不限于客服引导充值或添加QQ/微信开通VIP等非应用内直接交易形式。

9、应用所有付费项目,须明示用户付费后能使用的功能,在用户已完成付费后,不得二次收费。

10、儿童类应用内支付功能不得存在诱导儿童支付内容(除非其保留在受家长监控的指定区域中),如短代支付,外链接支付等无需输入密码的快捷支付功能。

4、广告标识符规范

1、应用或SDK在使用广告标识符时,只能用于广告分析,以及用户行为和身份分析。

2、不得通过获取系统没有提供撤回能力的,可关联用户的信息,用于广告和用户分析。包括但不限于:CPUID、BOOT_ID、SN、MAC地址、IMEI等。

3、应用每次使用“设备标识”和“虚拟身份ID”时,都必须验证MIUI系统的“虚拟身份管理”状态(是否允许使用设备标识),如果用户已开启“虚拟身份保护”,您不得基于“设备标识”和“虚拟身份ID”收集和使用数据。

4、广告标识符重置后,在未获得用户明确许可的情况下,新的广告标识符不得与先前的广告标识符或由其衍生的数据相关联。

5、应用若因业务所需而与任何第三方共享广告标识符,对方也必须遵守广告标识符相关条款。

5、损害用户权益的行为

影响用户正常使用

1、流氓行为

1.1 应用在用户不知情或未授权的情况下,长期占用移动终端中央处理器计算资源。

1.2 应用在用户不知情或未授权的情况下,长期驻留系统内存。

1.3 应用在用户不知情或未授权的情况下,自动添加、修改、删除收藏夹、快捷方式。

1.4 应用无法正常退出,或应用安装后无法卸载。

1.5 应用不得含有隐藏或不被用户感知或发现的功能。

2、干扰

应用对其他应用程序进行干扰、屏蔽或弹窗等,导致其他应用程序无法正常使用,其中包括含有修改其他应用数据,游戏存档等功能的应用。

3、第三方安装来源应用

针对第三方安装来源的应用,在无法确认安装包体安全合规、安装动作为用户主观意愿的情况下,会通过验证手机密码等方式,证明此次安装行为是用户自主操作且符合用户预期。

非正常扣费或损害用户利益

1、非正常扣费

1.1 在用户不知情或未授权的情况下,应用自动订购付费服务或自动扣费。

1.2 应用通过非正常手段直接进行扣费,如模拟系统窗口/提示、替换系统功能按钮诱导用户、隐藏关键订购协议诱导用户同意付费。

1.3 用户付费后未完整履行付费服务,或提供的付费服务与承诺存在偏差。

1.4 应用造成用户财产损失且有持续、大范围扩散的风险,且应用开发者不介入解决用户损失问题的情况。

2、资源消耗

2.1 应用在用户不知情或未授权的情况下,自动拨打电话。

2.2 应用在用户不知情或未授权的情况下,自动发送短信。

2.3 应用在用户不知情或未授权的情况下,自动发送彩信。

2.4 应用频繁连接或尝试连接网络,产生异常数据流量,造成用户财产损失。

3、违规下载器

具备分发应用能力的应用,分发存在违法违规风险的应用,或未经过用户允许、诱导用户产生下载行为。

欺骗或误导用户

1、 通过破解或未经授权的使用行为,或伪装或盗用其他应用名称、icon的行为,或实际界面伪装成其它正常应用的行为,误导用户执行对原始受信任应用程序的相关操作。

2、通过伪造、篡改、劫持,如短信、彩信、邮件、通讯录、通话记录、收藏夹、桌面或其他常用应用等,诱骗用户从而达到不正当目的。

3、 应用利用变号软件进行机身电话号码伪装,对用户进行诈骗或用于其他违法违规行为。

攻击/破坏系统或设备运行

1、应用存在如导致系统崩溃、系统重启、无响应等系统破坏行为。

2、应用导致移动终端硬件无法正常工作,如黑屏、耗电异常等。

3、应用导致移动终端其它非恶意软件无法正常运行。

4、应用导致运营商通信网络无法正常工作,或资源消耗异常。

5、在用户不知情或未授权的情况下,对系统设置进行修改(辅助功能、设备管理器、系统时间、系统角标等)导致用户无法再进行正常设置或运行正常功能。

6、在用户不知情或未授权的情况下,对用户文件、系统文件或其它非恶意软件进行病毒感染、劫持、篡改、删除、卸载、或限制运行等。

7、应用强制索取ROOT权限,或提示部分/全部应用功能非ROOT手机无法使用。

8、利用系统已知安全漏洞、或私自调取未发布的系统能力,用于实现商业目的或导致用户信息安全和使用体验受到影响。

小米开发平台APP合规要求

小米开发平台APP合规要求

合规

1、资质

在小米设备上运行的应用发布需符合下述要求,由于应用涉及种类繁多,且政策要求不断变更完善,资质规范要求会不定期调整。

1、应用应保证具有从事相关行业的资质,资质要求可参考:《特殊行业资质要求》

2、资质需保证真实,不得伪造或盗用其他产品信息,且始终保持资质在有效期内。

2、隐私

为保障用户权益与个人信息安全,依据《中华人民共和国个人信息保护法》《中华人民共和国网络安全法》《App违法违规收集使用个人信息行为认定方法》《关于开展APP侵害用户权益专项整治工作的通知》《工业和信息化部关于开展纵深推进APP侵害用户权益专项整治行动的通知》《信息安全技术 个人信息安全规范》的相关规定和政策,制定了应用隐私合规标准(参见内容链接:应用隐私合规标准 ),来帮助开发者进行隐私合规问题的自查。

3、知识产权

开发者须确认提供的应用为原创或获得合法授权,不得在未经授权的情况下,使用他人的成果。应用应符合以下要求,如存在侵犯他人知识产权的情况,小米将有权下架违规应用,并拒绝应用发布和更新申请。

1、应用不得以误导用户的方式使用与其他开发者应用相同或相似如外观、名称、主题等。应用不得使用不当方式或在未经授权的情况下使用相同或相似商标,可能导致用户对相关商品的来源造成混淆。

2、开发者使用小米相关商标须获得小米公司的明确授权。

3、开发者需获取许可授权,才能在应用内使用他人知识产权成果。

4、游戏类应用不得为有明确版权归属的破解版、汉化版。

5、应用及其内容不得侵犯他人在先权利,也不得以帮助、诱导等方式间接侵犯他人在先权利。

4、内容合规

1、应用内容不得违反国家法规政策。

1.1 应用内不得含有违反宪法确定的基本原则的内容。

1.2 应用内不得含有危害国家统一、主权和领土完整的内容。

1.3 应用内不得含有泄露国家秘密、危害国家安全或者损害国家荣誉和利益的内容。

1.4 应用内不得含有散布谣言,扰乱社会秩序,破坏社会稳定的内容。

1.5 应用内不得含有淫秽、色情、低俗、非法交易、赌博、暴力,或者教唆犯罪的内容。

1.6 应用内不得含有违背社会公德的内容。

1.7 应用内不得含有煽动民族仇恨、民族或种族歧视,破坏民族团结,或者侵害民族风俗、习惯的内容。

1.8 应用内不得含诽谤、人身攻击或者侮辱性的内容。

1.9 应用内不得包含具有贩卖、购买违禁物品的内容。

1.10 儿童类应用内容需适合儿童,不得含有其他会对儿童造成干扰的内容,儿童类应用不得含有外链接、购买机会,除非其保留在受家长监控的指定区域中。

1.11应用不得含有宣扬邪教和封建迷信的内容,也不得含有关于宗教、种族、性取向、性别或其他目标群体的诽谤或恶意内容。

1.12 应用内不得过度宣传酒精和危险物品(如毒药、爆炸物等),或鼓励未成年人消费香烟和酒精饮料。

1.13 游戏类应用不得含有错误价值观取向的内容,包括但不限于拜金主义、耽美等不良文化。

1.14 游戏类应用要严格落实实名认证和防沉迷要求,严格执行向未成年人提供网络游戏的时段时长限制,不得以任何形式向未成年人提供网络游戏账号租售交易服务。

1.15 游戏类应用要强化“氪金”管控,杜绝擅自变更游戏内容、违规运营游戏等行为,坚决遏制“唯金钱”“唯流量”等错误倾向。

1.16 游戏类应用要加强游戏直播管理,禁止出现高额打赏、未成年人打赏等情况。

1.17 广告内容不得含有欺诈内容,不应与向用户所作的宣传或者承诺不符,如:用户实际下载的应用、跳转后的页面,与广告宣传的不一致。

1.18应用内广告存在欺骗、诱导点击等形式,欺骗用户点击低质量推广广告,或广告内容含有虚假内容、违规内容等违反国家广告法行为。

1.19广告内容不得包含不良信息或违法违规内容(例如:侵权、色情、恐怖暴力、反动等),不得含有违反政策法规的网址或页面的提示。

1.20应用所提供的广告,需设置显著的跳转/打开的提示,点击提示以外的区域,不得直接跳转/打开其他页面。

1.21 应用所提供的广告,不得强制、误导、诱导用户点击,迫使用户产生非自愿的下载/跳转行为。

1.22应用所提供的广告,须带有关闭功能和显著的关闭提示,不得设置关闭障碍,且应用关闭后,广告也需同时关闭。

1.23含有下载功能的广告,应设置显著应用下载提示,用户点击“下载按钮”以外区域,不得自动下载非用户所自愿下载应用,或通过设置关闭障碍、关闭提示欺骗等方式,强迫用户下载。

1.24应用所提供的广告,不得含有强制安装软件或出现捆绑下载的行为。

1.25广告内容和广告投放行为,应符合法律法规、政策要求的其他内容。

1.26 应用内不得含有法律、行政法规和国家规定禁止的其他内容。

2、开发者须对用户生成内容进行管控。

2.1 开发者须对应用内用户生成的内容需进行有效的管控,包括但不限于:核验用户帐号身份信息并保存有关记录。制定过滤机制对帐号名称、昵称、简介、备注、标识、评论等功能及内容中的违法有害信息进行防范处置并保存有关记录。

2.2 建立用户生成内容的举报机制,并及时作出响应。

2.3 应用应具备服务关闭功能,对严重违规的用户停止提供服务。

2.4 如应用内有社区版块的,开发者须履行管理社区版块责任,社区版块中不得包含违反法律、法规、条例及其他规定的内容。

小米开发平台生态政策

总则

小米始终秉持着建设健康生态、维护系统安全、保障用户合法权益与个人信息安全的理念,并不懈努力的为用户提供更好的产品体验。为此,小米制定了《小米开发者生态政策》(以下简称:本政策)。在小米设备上安装运行的应用应符合本政策要求。随着法律法规、行业规范、当代社会价值观的动态更新,小米也将定期对《小米开发者生态政策》进行更新。

技术

1、兼容

在小米设备上运行的应用需适配小米、Redmi两年内发售的机型,以及当前主流安卓版本,且必须通过小米的兼容性要求,不得出现以下情况:

1、应用频繁出现崩溃。

2、应用无法正常安装、启动、卸载。

3、功能未实现或点击后无响应或程序本身存在错误。

4、应用显示的图像、文本和其他界面元素有明显的失真、模糊或像素化。

5、支持横屏和竖屏方向的应用,在出现两种方向展现时,未匹配相同的特征和操作,或提供相匹配的功能。

2、稳定

在小米设备上运行的应用必须通过小米的稳定性要求,不得出现以下情况:

1、应用在小米设备上出现崩溃、强制关闭、冻结或不正常运行现象。

2、应用版本不是最新的稳定版本,或比小米应用商店在架检测过的同包名应用版本低。

3、安全

在小米设备上运行的应用必须通过小米的安全要求,不得出现以下安全不达标的情况:

1、应用含有病毒木马等侵害用户的功能(包括代码等可疑行为),并限制下载或安装。

2、应用不得下载、安装或执行会引入或更改应用特性或功能的代码,也不得含有第三方加载可执行代码的应用或SDK,也不得下载、安装或执行会引入或更改APP特性或功能的代码,包括其他APP。

3、除支持核心功能而需要的最低级别权限外,应用擅自申请其他无关的权限。

4、应用请求访问与核心功能不相关的敏感数据(例如通讯录或系统日志)或访问用户付费服务(例如:拨号器、短信或频繁自动联网)的权限。

5、影响手机功能,包括但不限于:安装后自动修改系统默认配置且用户无法修改,功能键失灵等。

6、应用签名、应用文件与小米应用市场检测过的同包名应用的签名与应用文件不一致。

7、同名应用因含有的支付、推送等SDK不同,或被第三方加固、重新打包或添加渠道号等差异化处理后,未在小米应用市场进行过安全检测。

4、性能

在小米设备上运行的应用必须通过小米的性能要求,不得出现以下性能不达标的情况:

1、应用在冷启动的时候未考虑用户操作的响应速度,若加载时间超过1000毫秒,且在屏幕上未向用户提供反馈(进度指示器或类似提示),则不满足性能要求。

2、应用在进行页面或功能切换的时候未考虑用户操作的响应速度, 若加载时间超过500毫秒,则不满足性能要求。

3、应用未满足良好用户体验,出现使用不流畅等现象。

4、应用在运行时未充分考虑CPU占用是否过高或者异常,导致终端出现卡顿、ANR现象。

5、应用在运行时未充分考虑内存占用是否过高或者异常,导致终端出现卡顿、ANR现象。

5、功耗

在小米设备上运行的应用必须通过在小米的功耗要求,不得出现以下功耗不达标的情况:

1、应用转入后台时,有服务处于运行状态(该服务与应用核心功能相关且必要的除外)。

2、应用转入后台时,未主动释放占用资源。

3、应用转入后台后,私自启动。

4、应用转入后台时,有持锁行为。

5、应用转入后台时,占用系统资源(例如,占用蓝牙以及GPS系统资源等)。

小米开放平台应用分阶段发布操作指南

小米开放平台应用分阶段发布操作指南

1、功能介绍

在应用发布新版本时,您可以采用分阶段发布的方式进行应用版本更新。采用分阶段发布,您可以先向一定比例的用户发布更新的版本,快速获取用户对新版本的反馈意见,验证产品功能的稳定性,降低全量发布可能出现的风险及影响范围。

(目前该能力覆盖范围仅限应用,游戏暂不支持,且该能力处于内测阶段,如需开通,请联系 zhouyanjie@xiaomi.com ,并提供开发者ID、应用名称、应用包名)。

2、操作说明

2.1 使用分阶段发布能力

前提条件:您的APP当前上架版本为全网发布时,可提交新版本并设置为分阶段发布(即分阶段发布只适用于应用版本更新环节)。

操作路径:小米开放平台 – 应用列表 – 管理 – 应用详情页 – 更新版本。

2.2 创建分阶段发布版本

在“发布类型”区域下设置相关参数。

参数说明
发布类型选择“分阶段发布”;
生效时间分阶段发布的生效周期;
分阶段发布开始时间不得早于当前时间,结束时间必须大于开始时间,生效周期最大30天。达到生效结束时间后,分阶段发布版本将自动转全网发布。
暂停状态下,不会自动转全网发布;
到达结束时间后操作默认为到达结束时间后推送全网发布,也可选择暂停分阶段发布;
发布百分比请输入整数或小数,数值必须大于0且小于100。如果输入小数,则最多保留小数点后1位。对同一个分阶段发布版本,要求发布百分比数值逐渐变大;
分阶段发布说明填写本次分阶段发布的备注信息,如发布特性等,限500字以内。此说明不对用户或小米审核人员展示,仅展示在版本信息页面,供开发者自己参考;

完善其他相关信息后,点击“提交审核”,确认版本号无误后点击“确认”。提交成功后,应用版本状态更新为“审核中”。

2.3 管理分阶段发布版本

审核期间,在应用详情页可以对分阶段发布版本查看详情、撤销审核;

审核通过后,小米商店将按设置的生效时间和发布百分比分发该版本,正式版本和分阶段发布版本将同时在架。开发者可以在应用详情页查看、更新资料和更新发布管理;

在“发布管理”页面,可查看分阶段版本的发布状态、发布设置、发布说明等,并进行更新分阶段发布、全网发布、暂停分阶段发布、恢复分阶段发布、取消分阶段发布操作。

2.3.1 暂停分阶段发布

分阶段发布生效后,点击“暂停分阶段发布”,认真阅读弹出的提示框内容后,点击“确认”,分阶段发布版本将在小米应用商店暂时下架,即发布范围内的所有用户均暂时无法在小米应用商店搜索到该版本的应用。

2.3.2 恢复分阶段发布

分阶段发布暂停期间,点击“恢复分阶段发布”按钮,在弹窗中点击“确定”,该分阶段发布将在小米应用商店恢复上架,按照设置的生效时间和发布百分比继续分发,且恢复分阶段发布的申请无需人工审核。

恢复分阶段发布参数说明
生效时间起始时间:不支持修改;
结束时间:支持修改,您需要保证整个分阶段发布的生效周期不超过30天;
发布百分比支持修改。对于同一个分阶段发布版本,每修改一次发布范围的百分比,需大于等于上一次的百分比数值;
分阶段发布说明支持修改。对于同一个分阶段发布版本,每修改一次发布范围的百分比,建议大于上一次的百分比数值。

2.3.3 更新分阶段发布

在分阶段发布审核通过但尚未达到生效时间以及在分阶段发布生效期间内,您均可以执行更新分阶段发布操作,且更新分阶段发布的申请无需人工审核。

更新分阶段发布参数说明
生效时间起始时间:不支持修改;
结束时间:支持修改,您需要保证整个分阶段发布的生效周期不超过30天;
发布百分比支持修改。对于同一个分阶段发布版本,每修改一次发布范围的百分比,需大于等于上一次的百分比数值;
分阶段发布说明支持修改。对于同一个分阶段发布版本,每修改一次发布范围的百分比,建议大于上一次的百分比数值。

2.3.4 取消分阶段发布

分阶段发布未生效和已生效期间,点击“取消分阶段”按钮,认真阅读弹出的提示框内容后,在弹窗中点击“确定”,可以取消分阶段发布,取消后,该版本将在小米应用商店下架,取消分阶段发布无需人工审核。

2.3.5 分阶段发布转全网发布

  • 自动转全网发布:如您之前在发布配置- 结束时间后操作选择的是“推全网发布”则分阶段发布的生效周期结束后,将自动转全网发布版本;
  • 手动转全网发布:点击“恢复分阶段发布”或“更新分阶段发布”,“发布类型”选择“全网发布”,即可将分阶段发布版本转为全网版本。

注:分阶段发布版本转为全网版本后,帐号持有者会收到邮件通知。

2.3.6 下架分阶段发布版本

  • 取消分阶段发布后,分阶段发布版本会立即下架,无需人工审核;
  • 应用下架审核通过后,分阶段发布版本也将随之下架。

2.4 提交新版本

当APP的各版本都审核完成时,点击全量版本操作栏的“更新版本”按钮,“发布类型”选择全网发布或分阶段发布,可更新正式版本或分阶段发布版本。提交审核后,当前在架的分阶段发布版本将下架。

3、常见FAQ

1)设置的比例代表什么含义?

以设置10%为例,代表在小米应用商店内有10%的活跃用户可以看到您的新版本;

2)该包是否会影响到正常版本的分发?

使用该能力后,新包和旧包同时保持上架,新包仅分发给设置的比例所命中用户群;

3)如果使用分阶段发布的新包有问题,想上传新的包去覆盖怎么操作?

只要保证新包版本号大于上一次的包即可;

4)分阶段发布是否支持同版本更新?

暂不支持。

小米开发平台应用隐私检测问题查询-“隐私合规”模块使用教程

小米开发平台应用隐私检测问题查询-“隐私合规”模块使用教程

为协助开发者在开发、运营APP的过程中,更好履行个人信息保护责任与义务,保障平台用户的合法权益,为用户和开发者提供更多更好的服务,小米应用商店新增隐私问题查询和复测功能。本文档为“隐私问题查询和复测页面”的使用教程,您可在了解文档内容后进行功能使用。

一、隐私问题查询路径

如果您提交的应用类型为:游戏,请参考路径 2、开发者首页“隐私合规”入口进行查询。

1、隐私检测弹窗提示

当开发者旗下的应用,在隐私检测过程中发现问题,我们将通过邮件、开发者站弹窗公告的方式进行提醒,告知开发者关注检测出的问题,届时开发者可通过弹窗直接跳转查看问题。如开发者旗下多个应用均检测出问题时,我们也将仅发布一个弹窗公告来提醒。

2、开发者站首页“隐私合规”入口

开发者站首页增加隐私检测入口,点击可进入隐私合规页面。在此可浏览开发者旗下在架应用的隐私检测状态,及存在的具体问题报告详情。(注:隐私合规页面中,仅对当前状态为“在架”的应用进行检测)

3、应用详情页“隐私合规”入口

同样,在各个应用的管理详情页—“应用服务”模块下,也增加了隐私问题查询入口,点击后可进入对应应用的隐私问题检测报告页。(注:部分非在架状态的应用无法检测,因此无问题报告详情)

二、隐私问题查询操作指南

1、检测情况查询

开发者进入“隐私合规”模块页面后,开发者旗下的应用将按照检测情况进行排列,不同检测状态定义如下:

1)检测情况显示“已通过”:代表该应用本次检测中,未发现问题;

2)检测情况显示“未通过”:代表该应用在本次检测中,发现存在隐私问题;

3)检测情况显示“未检测”:代表该应用目前在检测排队中,未进行检测;

4)检测情况显示“检测中”:代表开发者在“问题报告”页面,提交修改后的apk,正在复测中。

(注:因检测易受到环境差异或时间节点影响,已通过应用不代表绝对安全,未来还将不定期复测)

开发者可点击“隐私合规”模块页面上方的《隐私合规问题修改指引》,查询隐私问题的修改方法,或参照标准来进行问题的自查。

2、隐私问题报告查询

点击各个应用的“查看报告”入口可进入报告详情页,查看应用存在的相关问题及问题产生的详细介绍。对无法复现或定位的问题,报告详情页中将提供检测期间问题页面的截图供开发者参考,并且可以通过详情页中“查看报告”入口可以下载报告查看详细的检测问题项及其整改建议。

三、修改后的apk提交隐私复测操作指南

1、提交APK进行复测

如开发者将应用存在的隐私问题修改完成,开发者可在“问题报告详情页”中,点击右上角的“检测修改后的apk”,提交修改后的包体进行隐私合规的复测,提交复测的apk,无需修改apk的版本号。

复测apk上传后,将会对“包名、hash值、MD5”等信息进行校验,避免开发者不小心提交未修改的apk或错误的apk。(注:开发者上传未修改过的apk,或上传其他应用的apk,会进行弹窗提醒)

2、提交APK复测后状态查询

当开发者提交修改后的apk进行复测,问题报告详情页中的提交复测按钮将置灰,页面将暂时保持上一次的检测结果,待复测完成后,页面检测结果将更新为最新状态。(注:复测需要1~2个工作日)

若应用检测通过,问题详情页将显示以下状态。(注:检测通过的详情页,不提供apk复测入口)

小米开发平台32/64分包上传说明

小米开发平台32/64分包上传说明

本文档介绍了通过应用创建、应用更新两条路径完成应用32/64位安装包上传的流程,您可在了解文档内容后进行应用安装包上传。

应用32/64位安装包上传须知

1、目的

为更好地提升APP性能体验,降低APP功耗影响,同时保证APP在手机上的运行效率和兼容性;小米应用商店将针对不同机型下发合适的包体,推进国内安卓生态对64位架构的支持。

开发者可以在了解本文档描述的规则后,选择适合您的传包模式。

2、安装包要求

  • 同一应用的包名、应用名称、签名需相同,每种安装包为独立且完整的apk文件;
  • 双包应用上传或更新时,需保证双包同时审核通过才可上线;
  • 双包上传时,两个包体的md5值不能相同;
  • 支持从cpu架构维度拆分。

3、单包上传规则

  • 2022年5月6日后新上传的应用,单包上传入口仅支持上传32/64位兼容包和64位架构包,不支持32位架构包;
  • 2022年5月6日前的在架包更新时,单包上传入口支持上传32位、64位安装包或32/64位兼容包。

:“单包上传”的32位架构包入口,仅为给开发者提供过渡期选择,近期将会关闭。为避免应用分发受影响,建议开发者尽快完成64位适配。

4、双包上传规则

  • 首次使用“双包上传”,或从“单包上传”更换为“双包上传”时:必须同时上传32位、64位架构包;
  • 双包同时上传时,两个包体的versioncode需保持一致,且两个包体需要同时审核通过后才可上架。

操作方法/路径

1、应用创建

1.1 登录小米应用商店开发者站官网,点击“创建应用”,开始应用首次创建。

1.2 进入创建应用页面,在此页面您需要填写语言、操作系统、应用名称、应用包名等信息(注:后续应用创建流程请参考应用创建操作指南)。

1.3 创建包名后,进入到完善资料页,完成应用安装包的上传,在该页面可选择APK上传方式为“单包上传”或“双包上传”。

  • 单包上传:支持上传64位安装包或32/64位兼容包;
  • 双包上传:需同时上传32位和64位两个安装包。

如果您选择的是单包上传,目前不支持上传32位安装包。当上传的apk包是32位时,会出现弹窗错误提示并同时清空上传的安装包。

2、应用更新

2.1 进入应用管理界面,点击“管理”按钮进入应用详情页。

2.2 点击应用详情页“更新版本”按钮,进入完善资料-测试审核-发布上线的流程。

2.3 根据您的安装包适配情况上传新的应用安装包。

  • 单包上传:支持上传32位、64位安装包或32/64位兼容包;
  • 双包上传:需同时上传32位和64位两个安装包。

2.4 应用更新后续流程请参考应用更新、修改操作指南

小米开发平台应用更新、修改操作指南

小米开发平台应用更新、修改操作指南

本文档介绍了应用更新、修改应用信息的流程,您可在了解文档内容后进行应用更新与应用信息的修改。

应用更新

已发布的应用,如需更新新版本,请参照以下流程。

小米应用商店支持应用同版本更新,根据小米应用商店系统逻辑要求,将apk_hash改变后,即可进行同版本更新。

1、进入应用管理界面,点击“管理”按钮进入应用详情页。

2、点击应用详情页“更新版本”按钮,即可进入完善资料-测试审核-发布上线的流程。

3、上传完成应用安装包,如应用包括拓展包与安装包,请一并上传。

项目

说明备注其他
单包上传支持上传32位、64位安装包或32/64位兼容包具体相关内容请参考32/64分包上传说明
双包上传需同时上传32位和64位两个安装包
主扩展包基本包的补充扩展软件
副扩展包若您需要上传两个扩展包,请将第二个扩展包上传至副扩展包处

4、若您的应用被检测到需要获取用户的敏感权限,请您按照相关权限项目进行说明,以便用户理解您获得权限的目的。

项目说明备注
获取定位您的应用将会获取用户定位,请您说明获取定位的目的
拨打电话您的应用将会利用用户设备拨打电话,请您说明拨打电话的目的
读取联系人您的应用将会获取用户联系人信息,请您说明读取联系人的目的
获取手机信息您的应用将会获取用户手机信息,请您说明获取手机信息的目的
录音您的应用将会获取为用户录音,请您说明获取录音的目的

5、完善应用的发布设置,根据需要选择应用的兼容设备、分类、发布地区与上线时间方式。

项目说明备注
兼容设备您的应用可下载与使用的设备类型
一级分类包含VR、实用工具、影音视听、聊天社交、图书阅读、学习教育、效率办公、时尚购物、居家生活、旅行交通、摄影摄像、医疗健康、体育运动、新闻咨询、娱乐消遣、金融理财等分类选择符合应用主要功能的分类项目,如应用符合多个分类,则可以自由选择,但不能选择无关的分类
二级分类根据一级分类对您的应用进行再次细分
分发地区应用可以下载并适用的地区如勾选其他海外地区,审核通过后,应用将会根据选择发布到对应海外地区
上线时间方式应用通过审核后上线时间方式选择如对上线时间无特殊要求,可选择“审核通过后立即上线”。如选择定时发布,则无法取消或更改时间

6、填写应用本地化语言信息,星号标注为必填项,填写完毕请阅读小米应用商店应用品牌展示图注意事项并勾选“我已阅读并同意”。

项目说明备注
应用名称上传应用的官方全称具体审核规范请参考应用审核规范
应用图标展示在用户桌面的应用图标,需与apk包内图标一致具体审核规范请参考应用审核规范
版本名应用版本的标识号开发者每次更新应用时,版本名要大于上一次版本名,否则无法提交应用审核
开发者名称展示给用户的开发者名称应用信息内填写的开发者名称与提交应用审核使用的账号主体内开发者信息需保持一致
关键字用户通过关键字搜索到应用可以提供多个关键字,以空格隔开
一句话简介以一句话简单介绍应用勿使用极限词和虚假承诺等违反新广告法的内容;勿使用疑问、反问等句式;保持在17个汉字或34个字符之内,句末勿加标点。
应用介绍对应用功能、亮点的准确介绍,吸引用户如实介绍应用功能和亮点,方便用户快速上手,勿呈现过多的SEO优化和空行
隐私政策为了保护用户隐私而制定的政策措施,内容须包括该APP收集使用个人信息的目的、方式和范围具体政策参考应用添加隐私政策声明的重要通知
官网链接非必填。您公司官方网站的地址
测试账号非必填。若您的应用需要注册账号才能使用,请提供可以用于测试的账号与密码该账号将用于应用审核流程,将不会展示给用户
项目说明备注
应用截图应用内相关场景截图
手机截图使用手机操作应用时呈现的截图应用图片信息如需使用到手机外观图片,禁止使用 iPhone 或其他品牌手机外观素材,应用图片信息中系统状态栏禁止存在与本应用无关的第三方应用图标
应用视频介绍非必填。以视频的形式介绍您的应用应用视频在驳回状态是无法删除的,请在重新提交审核后发送应用视频删除申请至问题工单系统
应用品牌展示图非必填。是小米应用商店为开发者提供的一项对应用品牌的直观展示服务该项已不展示给用户

7、完善行业资质证明。

注:在行业资质证明模块提交的材料无法删除,若您未上传原有材料而仅提交新材料,原有材料将会被新上传材料替换。

项目说明备注
ICP 备案号国家对经营性互联网信息服务实行许可制度;对非经营性互联网信息服务实行备案制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务开发者需要提供ICP备案截图,或ICP证和ICP备案号以证明资质
版权证明APP电子版权认证证书为您的app电子版的著作权证明,纸质软件著作权证书为您的app知识产权证明文件
免责承诺函对于承诺书的中提到的内容免除责任的一种形式相关承诺函模板请参考常见保证(承诺)函模板,若应用不符合单本图书/书城类、理财类、医疗类三种中的一种,建议开发者提供书城类承诺函
特殊资质代理证书金融理财类、影音视听类、图书阅读类、新闻资讯类、实用工具类、聊天社交类、医疗健康类应用需提交ICP证或ICP备案截图等资质或代理授权书具体要求请参考特殊行业资质要求
应用安全评估报告针对具有舆论属性或社会动员能力的互联网信息服务的主体进行评估后产出的报告非必填项,按需填写

​8、完善联系人信息并提交审核。

注:若未出现【联系人信息】模块或在【联系人信息】板块如果未展示输入验证码,请在【本地化语言信息】板块将本地化语言切换为简体中文。

9、提交审核后应用状态更新为等待审核,我们会在1-3个工作日内为您审核。

应用信息修改

针对已上线的版本,我们支持进行应用资料信息修改,请参照以下流程。

1、进入应用详情页,点击“查看资料”按钮。

2、点击“编辑资料”按钮,即可进入完善资料页面,后续流程与更新应用的3-9流程一致。

注:

  • 应用在驳回状态下不支持点击“编辑资料”按钮进行修改,如需修改,需点击“更新版本”按钮,才可在重新提交应用审核的时候进行修改。
  • 修改应用信息不支持修改应用名称,如需修改应用名称,可在提交审核或者版本更新状态下修改。

小米开放平台应用创建操作指南

小米开放平台应用创建操作指南

本文档介绍了创建应用流程,您可在了解文档内容后进行应用发布。

1、登录小米应用商店开发者站官网,点击“创建应用”,即可开始应用首次创建。


2、点击“创建应用”及进入创建包名页面,在此页面您需要填写语言、操作系统、应用名称、应用包名等信息。

项目说明备注
默认语言应用展示与操作时默认呈现给用户的语言类别
操作系统应用适用的系统
应用名称上传应用的官方全称
应用包名应用的唯一标识不可创建已存在包名

3、创建包名后,进入到完善资料页,完成应用安装包的上传,如应用包括拓展包与安装包,请一并上传。

项目说明备注
单包上传支持上传64位安装包或32/64位兼容包具体相关内容请参考32/64分包上传说明
双包上传需同时上传32位和64位两个安装包
主扩展包基本包的补充扩展软件
副扩展包若您需要上传两个扩展包,请将第二个扩展包上传至副扩展包处

4、若您的应用被检测到需要获取用户的敏感权限,请您按照相关权限项目进行说明,以便用户理解您获得权限的目的。

项目说明备注
获取定位您的应用将会获取用户定位,请您说明获取定位的目的
拨打电话您的应用将会利用用户设备拨打电话,请您说明拨打电话的目的
读取联系人您的应用将会获取用户联系人信息,请您说明读取联系人的目的
获取手机信息您的应用将会获取用户手机信息,请您说明获取手机信息的目的
录音您的应用将会获取为用户录音,请您说明获取录音的目的

5、完善应用的发布设置,根据需要选择应用的兼容设备、分类、发布地区与上线时间方式。

项目说明备注
兼容设备您的应用可下载与使用的设备类型
一级分类包含VR、实用工具、影音视听、聊天社交、图书阅读、学习教育、效率办公、时尚购物、居家生活、旅行交通、摄影摄像、医疗健康、体育运动、新闻咨询、娱乐消遣、金融理财等分类选择符合应用主要功能的分类项目,如应用符合多个分类,则可以自由选择,但不能选择无关的分类
二级分类根据一级分类对您的应用进行再次细分
分发地区应用可以下载并适用的地区如勾选其他海外地区,审核通过后,应用将会根据选择发布到对应海外地区
上线时间方式应用通过审核后上线时间方式选择如对上线时间无特殊要求,可选择“审核通过后立即上线”。如选择定时发布,则无法取消或更改时间。

6、填写应用本地化语言信息,星号标注为必填项,填写完毕请阅读小米应用商店应用品牌展示图注意事项并勾选“我已阅读并同意”。

项目说明备注
应用名称上传应用的官方全称具体审核规范请参考应用审核规范
应用图标展示在用户桌面的应用图标,需与apk包内图标一致具体审核规范请参考应用审核规范
版本名应用版本的标识号
开发者名称展示给用户的开发者名称应用信息内填写的开发者名称与提交应用审核使用的账号主体内开发者信息需保持一致
关键字用户通过关键字搜索到应用可以提供多个关键字,以空格隔开
一句话简介以一句话简单介绍应用勿使用极限词和虚假承诺等违反新广告法的内容;勿使用疑问、反问等句式;保持在17个汉字或34个字符之内,句末勿加标点。
应用介绍对应用功能、亮点的准确介绍,吸引用户如实介绍应用功能和亮点,方便用户快速上手,勿呈现过多的SEO优化和空行。
隐私政策为了保护用户隐私而制定的政策措施,内容须包括该APP收集使用个人信息的目的、方式和范围具体政策参考应用添加隐私政策声明的重要通知
官网链接非必填。您公司官方网站的地址
测试账号非必填。若您的应用需要注册账号才能使用,请提供可以用于测试的账号与密码该账号将用于应用审核流程,将不会展示给用户
项目说明备注
应用截图应用内相关场景截图
手机截图使用手机操作应用时呈现的截图应用图片信息如需使用到手机外观图片,禁止使用 iPhone 或其他品牌手机外观素材,应用图片信息中系统状态栏禁止存在与本应用无关的第三方应用图标。
应用视频介绍非必填。以视频的形式介绍您的应用应用视频在驳回状态是无法删除的,请在重新提交审核后发送应用视频删除申请至问题工单系统
应用品牌展示图非必填。是小米应用商店为开发者提供的一项对应用品牌的直观展示服务该项已不展示给用户

7、完善行业资质证明。

项目说明备注
ICP 备案号国家对经营性互联网信息服务实行许可制度;对非经营性互联网信息服务实行备案制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务开发者需要提供ICP备案截图,或ICP证和ICP备案号以证明资质
版权证明APP电子版权认证证书为您的app电子版的著作权证明,纸质软件著作权证书为您的app知识产权证明文件
免责承诺函对于承诺书的中提到的内容免除责任的一种形式相关承诺函模板请参考常见保证(承诺)函模板,若应用不符合单本图书/书城类、理财类、医疗类三种中的一种,建议开发者提供书城类承诺函
特殊资质代理证书金融理财类、影音视听类、图书阅读类、新闻资讯类、实用工具类、聊天社交类、医疗健康类应用需提交ICP证或ICP备案截图等资质或代理授权书具体要求请参考特殊行业资质要求
应用安全评估报告针对具有舆论属性或社会动员能力的互联网信息服务的主体进行评估后产出的报告
非必填项,按需填写

8、完善联系人信息并提交审核。

注:若未出现【联系人信息】模块或在【联系人信息】板块如果未展示输入验证码,请在【本地化语言信息】板块将本地化语言切换为简体中文。

9、提交审核后应用状态更新为等待审核,我们会在1-3个工作日内为您审核。

小米开发平台开发者账号资料修改操作指南

小米开发平台开发者账号资料修改操作指南

本文档介绍了开发者账号管理基本资料的修改指南,您可在了解文档内容后,自行对开发者账号进行管理操作。

开发者账号密码修改

适用场景:

公司人员交接,开发者账号绑定的手机号码及邮箱可正常接收查看验证码。

操作方法/路径:

1、登陆小米账号管理页面(https://account.xiaomi.com);

2、完成对账号密码的修改(安全邮箱、安全手机号码等均可进行修改)。

企业开发者账号更换登录邮箱

适用场景:

原注册员工离职,无法找回账号;需要更改开发者管理应用;注册或者更改公司名称提示“已存在”。

操作方法/路径:

1、进入问题工单系统,按以下问题描述格式提供相关信息,申请协助处理。

工单主题:【企业开发者账号更换登录邮箱】

工单问题描述:

  • 贵公司企业名称:
  • 贵公司营业执照扫描件:
  • 需要绑定到小米账号的新的登录邮箱(公司必须使用企业邮箱且该邮箱未注册开发者账号):
  • 需要绑定到的新登录邮箱所对应的小米账号ID(非手机号码):
  • 原账号下应用的名称和包名:(未上传过应用,请填写“无”)
  • 信息变更申请表:点击下载模板(请加盖公章)
  • 公司座机和联系人手机:

注:登录邮箱和小米账号必须是一对一绑定的,且没有注册过小米开发者,

请您先和公司内部同事进行确认贵司的企业营业执照是否已被其他部门注册了企业开发者,如果是,请贵司内部进行协商后确认账号是否统一管理。

注:以上解决方式仅限于仅开通开发者且未开通广告商的账号,如旧账号同时开通了开发者账号和广告商账号(开发者需自行内部核实),请先按照以上邮件信息格式联系ad-audit@xiaomi.com,进行核实账号资质,以同步推广账号和资金。因未先联系广告邮箱带来的后续问题,需开发者自行承担。

开发者账号注销

适用场景:

员工离职账号无法找回、账号不再使用、账号需注销重新注册。

注:开发者账号注销后,其下的应用及已接入服务将一并删除,请谨慎选择。

操作方法/路径:

1、进入问题工单系统,按以下问题描述格式进行反馈:

问题描述主题:【开发者账号注销申请】

问题描述内容:

  • 贵公司企业名称:(个人开发者可不提供)
  • 企业营业执照扫描件:(个人开发者可不提供)
  • 加盖企业公章或个人开发者签名的注销申请书:(申请内容自拟,无明确要求)
  • 注册邮箱账号:
  • 注销原因:

2、收到反馈后,我们会在1-2个工作日内为您处理完成。

个人开发者账号转换为企业开发者账号

适用场景:

原有开发者账号无法满足上传应用需求,需要转换开发者账户类型。

注:不支持企业开发者账号转换为个人开发者账号;开发者账号类型转换后,其下的应用数据无任何影响。

操作方法/路径:

1、登录小米开放平台,点击右上角用户名“资料修改”;

2、点击基本资料账户类型处“升级为企业开发者”,按后续提示操作即可。

企业开发者账号主体、认证信息修改

适用场景:

公司营业执照更新、公司名称变更。

注:修改完主体信息的开发者账户,需在应用apk包中修改开发者名称,才可以在应用中显示最新主体名称。

操作方法/路径:

1、方式一:登录开发者账号,进入右上角资料修改界面,在该页面即可修改主体信息。

修改开发者账号主体信息是需要提交审核的,审核时间是1-3个工作日,审核期间不会影响到账号内的应用状态的,最终审核结果会通过邮件的方式发送到开发者邮箱。

注:务必保证填写的公司名称、公司注册名称等信息与营业执照内公司名称等相应信息保持一致以及应用信息内有关开发者信息与开发者账号主体信息一致。

2、方式二:通过认领的方式来实现应用主体的迁移。

在小米开放平台创建开发者账号后,再通过认领流程将该应用转移至开发者新的账号下管理。

企业开发者账号注册流程https://dev.mi.com/distribute/doc/details?pId=1145

应用认领操作指南 :https://dev.mi.com/distribute/doc/details?pId=1076

注:小米ID获取方式:

访问网址https://account.xiaomi.com登录小米账号,如下图所示红框内即为小米ID。

0像素或1像素窗口适配说明

1.前言

很多App因业务或软件本身的需要,会起一个0像素或者1像素的窗口,例如调起1个像素点的 Activity 来提高进程优先级,达到保活的效果。我们为此专门做了优化,但是由于系统整体架构的限制,仍然会有一定的问题,这需要App也同步做一些优化来规避。

2.原因

  • 0像素窗口会导致系统没有 FocusWindow,造成key事件无法发给app。
  • 1像素窗口会导致该窗口成为 TouchedWindow,造成其他窗口不能滑动和点击。

3.建议

窗口 height=1,width=1,同时设置 FLAG_NOT_TOUCHABLE flag。

MIUI Android P 适配指南

1. 综述

欢迎加入MIUI Android P适配计划。谷歌官方已于2018年8月7号发布了Android P,代号为Pie(馅饼) 。MIUI也于同天发布了基于Android P的MIUI系统(下文将简称为MIUI P)。本文档将介绍如何将您的应用适配到MIUI P,防止应用出现运行时错误而造成损失。

重要声明:

  • 若您的应用未适配MIUI P,用户仍可以在应用商店下载您的应用,但会收到应用未适配Android P的相关提示。为确保您的应用能够正常运行在MIUI P的版本上,请尽快完成适配。
  • 为确保您的应用能够在第一时间适配MIUI P,我们强烈建议您提前适配Android P,适配方法请参考Google官方文档。您的应用如果已适配Android P,原则上将不会在MIUI P上出现Android P兼容性问题。若仍存在,请尽快通过本文最后一节所述的方式将问题反馈给我们,我们会尽快解决。

2. MIUI P包含的内容

MIUI P是支持下一代Android系统的版本,它包含了最新的Android P API及相关系统组件。除此之外,还包括了MIUI为小米手机用户深度订制、精心打造的UI、系统功能、系统应用等等。具体内容请参考MIUI的主页

3. 获取MIUI P

3.1. 自动升级

MIUI P正式发布后,您即可通过我们推送的系统更新升级到MIUI P的版本。

3.2. ROM包升级

您可以在我们的官方网站上下载ROM包手动升级。具体操作步骤请参考升级手册

3.3. 原生Android P获取

您可以通过此Google官方文档获取到Android P,开始Android P的适配工作。

4. 迁移指南

MIUI P(Android API 级别 P)引入了行为变更以及您的应用中可加以利用的新功能和 API。本节概述了迁移指南。您可以通过以下步骤,将应用迁移到 MIUI P 。

4.1. 确保兼容 Android P

验证您的应用能够在Android P平台上全功能运行。在此阶段,您不需要使用新的 API,也不需要更改应用的 targetSdkVersion,但可能需要进行一些细微的更改。具体请参考Android P行为变更

4.2. 确保兼容 MIUI P

您也可以直接在MIUI P上验证您的应用。同样,在此阶段,您不需要使用新的 API,也不需要更改应用的 targetSdkVersion,但可能需要进行一些细微的更改。

若您的应用已经能够在Android P上全功能运行,原则上也可以在MIUI P上全功能运行。但您仍需测试验证。

4.3. 更新您的目标版本并使用 MIUI P 功能

当您准备好利用平台的新功能时,将 targetSdkVersion 更新至“28”,验证应用是否仍可按预期方式运行,然后开始使用新的 API。

5. 新功能和API

MIUI P为用户和开发者引入众多新特性和新功能,具体的功能和API的变化可点击这里

本文重点介绍面向开发者的新功能。要了解新API,请阅读 API 差异报告或访问Android API 参考 — 为醒目起见,将突出显示新API。 请务必查阅 Android P 行为变更以了解平台变更可能给您的应用带来哪些方面的影响。

6. 重点适配问题

为了解当前应用对MIUI P的适配情况,以便更好推进MIUI P的适配工作,我们已在内部进行了MIUI P的兼容性测试。我们选取了小米应用商店Top 1000的应用,对每个应用进行下载、安装、启动、monkey测试、遍历测试、卸载,并在整个过程中检测是否有FC/ANR问题发生。根据测试结果,我们强烈建议您关注以下问题。若您的应用存在以下情况,请尽快适配。

6.1. 使用了第三方加固工具

由于加固工具和系统耦合紧密,因此若您的应用使用了第三方加固工具,请尽快更新您所使用的加固工具以适配Android P。我们也会尽快推动加固厂商适配Android P。

在我们的测试中,存在兼容性问题的第三方加固工具有:

  • 梆梆加固
  • 360加固
  • 阿里聚安全
  • 百度加固

若您的应用使用了以上的加固工具,请务必关注相应厂商的适配进度,以便第一时间更新加固工具以适配Android P。若您使用的是其它加固工具,也请关注工具的Android P适配情况。

6.2. 依赖org.apache.http.legacy.boot.jar包

Android Runtime虚拟机实例初始化时会加载init.environ.rc中配置的jar包。Android P中init.environ.rc已移除了/system/framework/org.apache.http.legacy.boot.jar,该jar包内的类将不会被加载。如果您的应用使用了Apahce Http Client的类,且没有手动加载该jar包,则应用会报ClassNotFoundException异常,无法正常运行。因此,若您的应用依赖此包,请务必尽早适配。也请关注您使用的第三方SDK是否有依赖该jar包,如果有,请关注SDK的适配情况,并在SDK适配后第一时间更新SDK。

6.3. 使用了第三方SDK

一些第三方SDK也存在Android P的兼容性问题,导致应用无法运行。在我们的测试中,存在兼容性问题的SDK有:

  • 联通支付SDK
  • 腾讯广点通SDK

若您的应用使用了包括这两款在内的SDK,请务必关注相应厂商的适配进度,以便第一时间更新SDK以适配Android P。

Android 12 应用适配指南4 迁移指南 

Android 12 应用适配指南4 迁移指南

迁移指南

每次发布新的 Android 版本时,都会推出一些全新的功能并引入一些行为变更,目的就在于提高 Android 的实用性、安全性和性能。在许多情况下,您的应用都可以直接使用并完全按预期运行;而在其他的一些情况下,您可能需要对应用进行更新以适应这些平台变更。为了确保您的用户在Android 12上获得良好体验,请按照如下方法,将您的应用迁移到Android 12。

常见的迁移包含两个阶段,这两个阶段可以同时进行:

  1. 确保应用兼容性(在 Android 12 最终发布前)
  2. 针对新平台的功能和 API 调整应用(最终发布后尽快进行)

5.1 确保应用与Android 12兼容

您通常可以调整应用并发布更新,而无需更改应用的 ​targetSdkVersion​。您必须测试现有应用在 Android 12 上的运行情况,以确保更新到最新版 Android 的用户获得良好的体验。有些平台变更可能会影响应用的行为方式,在开始测试之前,请仔细阅读“应用变更:所有应用”章节的内容,即使您不更改应用的​targetSdkVersion​,这些变更也可能会影响您的应用。

请务必查看并测试非 SDK 接口限制,您应使用应用公共 SDK 或 NDK 等效项替换应用使用的任何受限接口。留意突出显示这些访问权限的 logcat 警告,并使用 ​StrictMode​ 方法 ​detectNonSdkApiUsage()​ 以编程方式捕获它们。

最后,请务必完整测试应用中的库和 SDK,确保它们在 Android 12 上按预期运行,并遵循隐私权、性能、用户体验、数据处理和权限方面的最佳做法。如果您遇到问题,请尝试更新到最新版本的 SDK,或联系 SDK 开发者寻求帮助。

当您完成测试并进行更新后,建议您立即发布兼容的应用,尽早帮助用户顺利过渡到 Android 12。

5.2 更新应用的targetSdkVerison并使用新API构建

当您计划全面支持 Android 12 时,请查看“以Android 12为目标平台的应用行为变更”,这些变更可能会影响应用的功能,可能需要进行大量开发工作,建议您尽早了解并解决这类问题。以下是全面支持Android 12的步骤:

编译应用并将其安装到搭载 Android 12 的设备上后,请开始测试,以确保应用能够在 Android 12 上正常运行,将测试重点放在以 Android 12 为目标平台的应用的行为变更上。

请务必查看并测试可能适用的受限非 SDK 接口的使用。留意突出显示这些访问权限的 logcat 警告,并使用 StrictMode 方法 detectNonSdkApiUsage() 以编程方式捕获它们。

最后,请务必完整测试应用中的库和 SDK,确保它们在 Android 12 上按预期运行,并遵循隐私权、性能、用户体验、数据处理和权限方面的最佳做法。如果您遇到问题,请尝试更新到最新版本的 SDK,或联系 SDK 开发者寻求帮助。

Android 12 为开发者引入了一项新功能:兼容性框架,可让您更轻松地测试应用的针对性行为变更。对于可调试的应用,切换开关可让您:

  • 在不实际更改应用的 targetSdkVersion 的情况下测试有针对性的更改。您可以使用切换开关强制启用特定的针对性行为变更,以评估对现有应用的影响。
  • 仅针对特定变更进行测试。您可以使用切换开关停用除要测试的变更之外的所有针对性变更,而不必一次处理所有针对性变更。
  • 通过 adb 管理切换开关。您可以使用 adb 命令在自动测试环境中启用和停用可切换的变更。
  • 使用标准变更 ID 更快地进行调试。每个可切换的变更都具有唯一 ID 和名称,可用于在日志输出中快速调试根本原因。

兼容性框架的详细内容,请参考:兼容性框架变更 (Android 12)

6.重点适配问题

为了解当前应用对Android 12 版本的适配情况,以便更好推进MIUI Android 12适配工作,我们已在内部进行了自动化兼容性测试。我们选取了小米应用商店Top的各类应用,对每个应用进行下载、安装、启动、monkey测试、遍历测试、卸载,并在整个过程中检测是否有FC/ANR问题发生。根据测试结果,我们强烈建议您关注以下问题。若您的应用存在以下情况,请尽快适配。

6.1 使用了第三方加固工具

由于加固工具和系统耦合紧密,因此若您的应用使用了第三方加固工具,请尽快更新您所使用的加固工具以适配Android 12。我们也会尽快推动加固厂商适配Android 12。
在我们的测试中,存在兼容性问题的第三方加固工具有:

  1. 爱加密加固
  • 样例问题trace1
05-24 14:38:02.242 10186 21122 21122 E AndroidRuntime: FATAL EXCEPTION: main
05-24 14:38:02.242 10186 21122 21122 E AndroidRuntime: Process: xxx, PID: xxx
05-24 14:38:02.242 10186 21122 21122 E AndroidRuntime: java.lang.VerifyError: Rejecting class xxx that attempts to sub-type erroneous class xxx (declaration of xxx appears in /data/user/0/xxx/Anonymous-DexFile@xxx.jar)
......
  • 样例问题trace2
04-28 15:39:04.470 10238 24709 24709 E AndroidRuntime: FATAL EXCEPTION: main
04-28 15:39:04.470 10238 24709 24709 E AndroidRuntime: Process: xxx, PID: xxx
......
04-28 15:39:04.470 10238 24709 24709 E AndroidRuntime:         at android.app.FragmentController.attachHost(FragmentController.java:89)
......

2.梆梆加固

  • 样例问题trace1
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Redmi/alioth/alioth:11/RKQ1.200826.002/20.12.28:user/release-keys'
Revision: '0'
ABI: 'arm'
Timestamp: 2021-01-04 09:19:50+0800
pid: 24985, tid: 25000, name: xxx  >>> xxx <<<
uid: 10296
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xc050ffdc
    r0  00006199  r1  00000000  r2  0000000a  r3  00000000
......
backtrace:
......
#06 pc 00037201  /data/app/~~Sog5FGGDSipk_Lf4DCNCLw==/xxx-Gc_aKgh9uIp2F1djVkczxg==/lib/arm/libDexHelper.so (BuildId: 73f2fb76430d4168663cb4ade4cb836abf0fe502)
#07 pc 00037e83  /data/app/~~Sog5FGGDSipk_Lf4DCNCLw==/xxx-Gc_aKgh9uIp2F1djVkczxg==/lib/arm/libDexHelper.so (BuildId: 73f2fb76430d4168663cb4ade4cb836abf0fe502)
......
  • 样例问题trace2
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : Build fingerprint: 'Xiaomi/venus/venus:11/RKQ1.200928.002/V12.0.14.0.RKBCNXM:user/release-keys'
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : Revision: '0'
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : ABI: 'arm'
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : Timestamp: 2021-01-14 18:01:11+0800
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : pid: 31144, tid: 31144, name: xxx  >>> xxx <<<
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : uid: 10686
01-14 18:01:11.350 10686 31177 31177 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xe7e15000
01-14 18:01:11.350 10686 31177 31177 F DEBUG   :     r0  00000000  r1  e7e15000  r2  00000000  r3  e51ff004
......
01-14 18:01:11.571 10686 31177 31177 F DEBUG   : backtrace:
01-14 18:01:11.571 10686 31177 31177 F DEBUG   :       #00 pc 00020406  /data/app/~~B1wDWHt01dZ4xgeR9qXtEw==/xxx-xIZ3NSdHSP5cB-tYLjQrYA==/lib/arm/libDexHelper_sdk.so
01-14 18:01:11.571 10686 31177 31177 F DEBUG   :       #01 pc 00021b47  /data/app/~~B1wDWHt01dZ4xgeR9qXtEw==/xxx-xIZ3NSdHSP5cB-tYLjQrYA==/lib/arm/libDexHelper_sdk.so (pFE1FFE21C810240D8476E0376B1F05CD+18)
01-14 18:01:11.571 10686 31177 31177 F DEBUG   :       #02 pc 0001ff5d  /data/app/~~B1wDWHt01dZ4xgeR9qXtEw==/xxx-xIZ3NSdHSP5cB-tYLjQrYA==/lib/arm/libDexHelper_sdk.so (pFF03AF407F2AEDDF5A59E1985C5A14AB+360)
......

3.乐固加固

  • 样例问题trace1
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : Build fingerprint: 'Xiaomi/grus/grus:10/QKQ1.190828.002/9.12.25:user/release-keys'
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : Revision: '0'
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : ABI: 'arm'
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : Timestamp: 2020-03-03 17:26:20+0800
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : pid: 14110, tid: 14110, name: xxx  >>> xxx <<<
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : uid: 10241
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : signal 6 (SIGABRT), code 0 (SI_USER), fault addr --------
03-03 17:26:20.978 10241 14180 14180 F DEBUG   : Abort message: 'JNI DETECTED ERROR IN APPLICATION: obj == null
03-03 17:26:20.978 10241 14180 14180 F DEBUG   :     in call to GetObjectField
03-03 17:26:20.978 10241 14180 14180 F DEBUG   :     from void com.tencent.StubShell.TxAppEntry.load(android.content.Context)'
03-03 17:26:20.978 10241 14180 14180 F DEBUG   :     r0  00000000  r1  0000371e  r2  00000006  r3  ffbe8b30
......
03-03 17:26:21.204 10241 14180 14180 F DEBUG   : backtrace:
03-03 17:26:21.204 10241 14180 14180 F DEBUG   :       #00 pc 00056dfe  /apex/com.android.runtime/lib/bionic/libc.so (abort+166) (BuildId: b1803e2c54cf63f48664b8839ccf313b)
......
  • 样例trace2
05-29 06:32:41.237 10390  6287  6287 E AndroidRuntime: FATAL EXCEPTION: main
05-29 06:32:41.237 10390  6287  6287 E AndroidRuntime: Process: xxx, PID: 6287
05-29 06:32:41.237 10390  6287  6287 E AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/core/content/FileProvider$PathStrategy;
05-29 06:32:41.237 10390  6287  6287 E AndroidRuntime:         at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:576)
......
05-29 06:32:41.237 10390  6287  6287 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: androidx.core.content.FileProvider$PathStrategy
05-29 06:32:41.237 10390  6287  6287 E AndroidRuntime:         ... 14 more

4.360加固

  • 样例trace1
03-14 23:24:09.078 10272 15691 15691 D AndroidRuntime: Shutting down VM
03-14 23:24:09.078 10272 15691 15691 E AndroidRuntime: FATAL EXCEPTION: main
03-14 23:24:09.078 10272 15691 15691 E AndroidRuntime: Process: xxx, PID: 15691
03-14 23:24:09.078 10272 15691 15691 E AndroidRuntime: java.lang.RuntimeException: Unable to create application com.stub.StubApp: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/stub/StubApp;
03-14 23:24:09.078 10272 15691 15691 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6997)
......
03-14 23:24:09.078 10272 15691 15691 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: com.stub.StubApp
03-14 23:24:09.078 10272 15691 15691 E AndroidRuntime: ... 13 more

5.百度加固

  • 样例trace1
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : Build fingerprint: 'Xiaomi/venus/venus:12/SPB1.210331.013/eng.builde.20210525.073644:user/test-keys'
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : Revision: '0'
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : ABI: 'arm'
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : Timestamp: 2021-05-28 19:38:13.445686711+0800
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : Process uptime: 0s
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : pid: 5969, tid: 5969, name: xxx  >>> xxx <<<
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : uid: 10209
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x62696c0e
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :     r0  62696c0e  r1  ffd08284  r2  e78d01ad  r3  dd422f24
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :     r4  d7502b90  r5  f1cb9d09  r6  ffd08284  r7  f5b9e2f0
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :     r8  f5cfdadf  r9  f5db6314  r10 00000003  r11 f5d02427
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :     ip  e655ef3c  sp  ffd08268  lr  dd419a07  pc  f1cb9d08
05-28 19:38:13.575 10209  5992  5992 F DEBUG   : backtrace:
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :       #00 pc 00034d08  /apex/com.android.runtime/lib/bionic/libc.so (strcmp_a15+0) (BuildId: c95adaa6733585cf4f8f4efd331ecb2d)
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :       #01 pc 00012a05  /data/app/~~eFnoVjNlNOx8V-dvL-_piw==/com.yukexing.mobileticket-uHImw17j1Y-uuPI3t8I8Iw==/lib/arm/libbaiduprotect.so
05-28 19:38:13.575 10209  5992  5992 F DEBUG   :       #02 pc 000125a3  /data/app/~~eFnoVjNlNOx8V-dvL-_piw==/com.yukexing.mobileticket-uHImw17j1Y-uuPI3t8I8Iw==/lib/arm/libbaiduprotect.so
......

若您的应用使用了以上的加固工具,请务必关注相应厂商的适配进度,以便第一时间更新加固工具以适配Android 12。若您使用的是其它加固工具,也请关注工具的Android 12适配情况。

6.2 其他问题

应用在启动时,创建activity报错闪退,报错信息是”Activity {packageName/compomentName} did not call through to super.onCreate()” ,经确认,这个问题是梆梆加固的问题,请遇到的开发者联系梆梆加固厂商,用最新的版本升级即可。

05-13 09:53:25.471 10732 15838 15838 E AndroidRuntime: FATAL EXCEPTION: main
05-13 09:53:25.471 10732 15838 15838 E AndroidRuntime: Process: xxxx, PID: xxx
05-13 09:53:25.471 10732 15838 15838 E AndroidRuntime: android.util.SuperNotCalledException: Activity {xxx/xxxx} did not call through to super.onCreate()
05-13 09:53:25.471 10732 15838 15838 E AndroidRuntime:         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3549)
05-13 09:53:25.471 10732 15838 15838 E AndroidRuntime:         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3729)
..............................................//此处省略

Android 12 应用适配指南3 影响应用的行为变更

Android 12 应用适配指南3 影响应用的行为变更

影响应用的行为变更

4.1 行为变更:所有应用

Android 12 平台包含一些行为变更,这些变更可能会影响您的应用。以下行为变更将影响在 Android 12 上运行的所有应用,无论采用哪种 targetSdkVersion都不例外。您应该充分测试您的应用,相应做出修改以支持这些变更。

4.1.1 沉浸模式下的手势导航改进

Android 12 简化了沉浸模式,使手势导航更易于操作且与其他活动体验(例如观看视频和阅读图书)更加一致。应用仍然可以在全屏游戏体验中防止意外手势,以免用户在玩游戏时意外退出游戏;所有其他全屏或沉浸式体验现在都允许用户通过滑动手势进行导航。为了实现这一点,从 Android 12 开始,已弃用非粘性沉浸式体验(​BEHAVIOR_SHOW_BARS_BY_TOUCH​、​BEHAVIOR_SHOW_BARS_BY_SWIPE​)的现有行为。它们已被默认行为 (​BEHAVIOR_DEFAULT​) 取代,即在隐藏系统栏后,允许使用滑动手势。此标志会根据模式显示不同的视觉和功能行为:

  • 在“三按钮”模式下,视觉和功能行为与 Android 12 之前的版本中的沉浸模式相同。
  • 在手势导航模式下,行为如下:
  • 在视觉上,它与 Android 11 及更低版本中的沉浸模式相同。从功能上讲,即使系统栏被隐藏,也允许使用手势;只需滑动屏幕一次便可调用系统返回操作,而 Android 11 需要滑动两次。下拉通知栏或转到主屏幕无需另外滑动屏幕。

Android 12 的粘性沉浸模式 (​BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE​) 没有任何变化。请注意此功能的以下向后兼容性:

  • 如果应用以 Android 11 及更低版本为目标平台,则在 Android 12 上运行时:
  • ​BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE​ 展示出的功能和呈现出的视觉效果相同。默认值会映射到 ​BEHAVIOR_SHOW_BARS_BY_SWIPE​。
  • 如果应用以 Android 12 为目标平台,则在 Android 11(API 级别 30)及更低版本上运行时:
  • 展示出的功能和呈现出的视觉效果应该是相同的,但 ​BEHAVIOR_SHOW_BARS_BY_TOUCH​ 映射到 ​BEHAVIOR_SHOW_BARS_BY_SWIPE​ 的情况除外。请务必更新您的 SDK 级别,以获得新的默认值 (​BEHAVIOR_SHOW_BARS_BY_SWIPE​)。否则,​BEHAVIOR_SHOW_BARS_BY_TOUCH​ 的默认值会保持不变。

4.1.2 前台服务通知延迟

在Android 12上为了优化短时间运行的前台服务的流畅体验,系统会延迟10s显示该前台服务的通知。此更改使某些短期任务在显示通知前完成。如果某项前台服务至少具有以下特征之一,则系统会在服务启动后立即显示相关通知:

  1. 该服务与包含“操作按钮”的通知相关联。
  2. 该服务的foregroundServiceType为 ​connectedDevice​、​mediaPlayback​、​mediaProjection​ 或 ​phoneCall​。
  3. 该服务根据通知的category中的定义,提供与通话、导航或媒体播放相关的用例。
  4. 该服务通过在设置通知时调用setShowForegroundImmediately()

4.1.3 对 Netlink MAC 地址的限制

Android 12 进一步限制了所有非系统应用对设备的 MAC 地址(不可重置的标识符)的访问,应用无论采用哪种targetSdkVersion都不例外。相关 API 会返回空值或占位值,具体取决于应用的targetSdkVersion:

  • 如果应用以 Android 12 为目标平台,则该 API 会返回 null。
  • 如果应用以 Android 11 或更低版本为目标平台,则该 API 将返回硬编码占位值:​02:00:00:00:00:00​

如果您的应用访问了MAC地址,logcat 输出会显示:CompatibilityChangeReporter: Compat change id reported: 170188668

4.1.4 不受信任的触摸事件被屏蔽

为了维持系统安全并保持良好的用户体验,Android 12 会阻止应用使用触摸事件,使用触摸事件时叠加层会以不安全的方式遮掩应用。 换言之,系统会屏蔽穿透某些窗口的触摸操作,但存在一些例外情况。

4.1.4.1 受影响的应用

此变更会影响选择让触摸操作穿透其窗口的应用,例如使用 ​FLAG_NOT_TOUCHABLE​ 标志。包括但不限于以下示例:

  • 需要 ​SYSTEM_ALERT_WINDOW​ 权限并使用 ​FLAG_NOT_TOUCHABLE​ 标志的叠加层,例如使用 ​TYPE_APPLICATION_OVERLAY​ 的窗口。
  • 使用 ​FLAG_NOT_TOUCHABLE​ 标志的 activity 窗口。
  • Toast窗口

例如,使用以上示例创建的窗口,在Android 12上会呈现出不可“穿透”的触摸操作:

如示例图所示,触摸操作将无法穿透窗口,即无法点击窗口内的应用图标。

4.1.4.2 适配方法

在以下情况下,允许执行“穿透”触摸操作:

注意:类型为TYPE_APPLICATION_OVERLAY的窗口不受信任。

  • 不可见窗口。窗口的根视图是 GONE 或 INVISIBLE。
  • 全透明窗口。窗口的 alpha 属性为 0.0。
  • 足够半透明的系统警报窗口。当组合后的不透明度小于或等于系统针对触摸的最大遮掩不透明度时,系统会将一组系统警报窗口视为足够半透明。在 Android 12 Beta 版中,这一最大不透明度为 0.8。此值在未来的 Beta 版中可能会发生变化,可通过如下方式获取:
InputManager inputManager = (InputManager) context.getSystemService(Context.INPUT_SERVICE);
Log.d("最大允许的透明度:",""+inputManager.getMaximumObscuringOpacityForTouch());
4.1.4.3 检测不受信任的触摸操作是否被屏蔽

如果系统屏蔽触摸操作,Logcat 会记录以下消息:

Untrusted touch due to occlusion by package_name
4.1.4.4 测试变更

运行 Android 12 开发者预览版3的设备默认已屏蔽不受信任的触摸操作。如需允许不受信任的触摸操作,请在终端窗口中运行以下命令:

# 单个应用
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app

# 对所有应用生效
# 设置成0,表示允许,设置成1,日志会打印对应的信息
adb shell settings put global block_untrusted_touches 0

如需将行为还原为默认设置(不受信任的触摸操作被屏蔽),请运行以下命令:

# 单个应用
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app

# 对所有应用生效
adb shell settings put global block_untrusted_touches 2

4.1.5 应用无法关闭系统对话框

为了加强用户与应用和系统互动时的控制,从 Android 12 开始,弃用了 ​ACTION_CLOSE_SYSTEM_DIALOGS​ intent 操作。当应用尝试调用包含此操作的 intent 时,系统会基于应用的目标 SDK 版本执行以下操作之一:

  • 如果应用以 Android 12 为目标平台,则会发生 ​SecurityException​。
  • 如果应用以 Android 11(API 级别 30)或更低版本为目标平台,则系统不会执行 intent,并且 Logcat 中会显示以下消息:
E ActivityTaskManager Permission Denial: 
android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from 
com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, 
dropping broadcast.

在以下情况下,应用仍然可以在 Android 12 上关闭系统对话框:

  • 您的应用运行的是插桩测试
  • 您的应用以 Android 11 或更低版本为目标平台,并在抽屉式通知栏顶部显示一个窗口。

4.1.6 Display#getRealSize 和 getRealMetrics:废弃和沙盒

Android 设备有许多不同的外形规格,如大屏设备、平板电脑和可折叠设备。为了针对每种设备适当地呈现内容,您的应用需要确定屏幕或显示屏尺寸。随着时间的推移,Android 提供了不同的 API 来检索此信息。在 Android 11 中,我们引入了WindowMetricsAPI 并废弃了以下方法:

在 Android 12 中,我们继续建议使用 WindowMetrics,并且正在逐步废弃以下方法:

为了缓解应用使用 Display API 检索应用边界的行为,Android 12 添加了一种新的沙盒机制来更正这些 API 返回的信息。这可能会对将此信息与 MediaProjection 一起使用的应用产生影响。

应用应使用 WindowMetrics API 查询其窗口的边界,并使用Configuration.densityDpi查询当前的密度。

为了与较低的 Android 版本实现更广泛的兼容性,您可以使用 JetpackWindowManager库,它包含一个WindowMetrics 类,该类支持 Android 4.0(API 级别 14)及更高版本。

关于如何使用 WindowMetrics 的示例

首先,确保应用的 activity完全可调整大小

activity 应依赖于来自 activity 上下文的 WindowMetrics 来执行任何与界面相关的工作,特别是WindowManager.getCurrentWindowMetrics()

如果您的应用创建了 MediaProjection,则必须正确地调整边界的大小,因为投影会捕捉显示内容。如果应用完全可调整大小,则 activity 上下文会返回正确的边界,如下所示:

WindowMetrics projectionMetrics = activityContext
        .getSystemService(WindowManager.class).getMaximumWindowMetrics();

如果应用并非完全可调整大小,则必须从 WindowContext 实例查询边界,并使用WindowManager.getMaximumWindowMetrics()检索应用可用的最大显示区域的 WindowMetrics。

Context windowContext = mContext.createWindowContext(mContext.getDisplay(),
        TYPE_APPLICATION, null /* options */);
WindowMetrics projectionMetrics = windowContext.getWindowManager()
        .getMaximumWindowMetrics();

注意:使用 MediaProjection 的任何库也应遵循此建议,并查询应用窗口的相应 WindowMetrics。

4.1.7 改进了刷新率切换

在 Android 12 中,无论显示屏是否支持无缝过渡到新的刷新率,都会发生使用setFrameRate()实现的刷新率变化;无缝过渡是指没有任何视觉中断,比如一两秒钟的黑屏。以前,如果显示屏不支持无缝过渡,它在调用 setFrameRate() 后通常会继续使用同一刷新率。您可以调用getAlternativeRefreshRates()来提前确定向新刷新率的过渡是否有可能是无缝过渡。通常,会在刷新率切换完成后调用回调onDisplayChanged(),但对于某些外接显示屏,会在非无缝过渡期间调用该回调。

以下示例说明了您可以如何实现此行为:

// Determine whether the transition will be seamless.
// Non-seamless transitions may cause a 1-2 second black screen.
Display display = context.getDisplay(); // API 30+
Display.Mode mode = display.getMode();
float[] refreshRates = mode.getAlternativeRefreshRates();
boolean willbeSeamless = Arrays.asList(refreshRates).contains(newRefreshRate);

// Set the frame rate even if the transition will not be seamless.
surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS);

4.1.8 麦克风和摄像头切换开关

在 Android 12 中,受支持的设备允许用户通过按一个切换开关选项,为设备上的所有应用启用和停用摄像头和麦克风使用权限。用户可以从快捷设置访问可切换的选项,也可以从系统设置中的“隐私设置”屏幕访问。

摄像头和麦克风切换开关会影响设备上的所有应用:

注意:当用户拨打应急服务电话(如 911)时,系统会开启麦克风使用权限。此行为可保护用户安全。

当用户关闭摄像头或麦克风的使用权限,然后启动需要使用摄像头或麦克风信息的应用时,系统会提醒用户,设备范围的切换开关已关闭。

检查给定的设备是否支持麦克风和摄像头切换开关

如需检查设备是否支持麦克风和摄像头切换开关,请添加以下代码段中所示的逻辑:

SensorPrivacyManager sensorPrivacyManager = getApplicationContext() .getSystemService(SensorPrivacyManager.class); boolean supportsMicrophoneToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.MICROPHONE); boolean supportsCameraToggle = sensorPrivacyManager .supportsSensorToggle(Sensors.CAMERA);

检查响应麦克风和摄像头切换开关的应用行为

麦克风和摄像头切换开关不应影响您的应用处理CAMERARECORD_AUDIO权限的方式,前提是您遵循关于 Android 权限的最佳做法

特别是,确保您的应用做到以下几点:

  • 等到用户向您的应用授予 CAMERA 权限后再使用设备的摄像头。
  • 等到用户向您的应用授予 RECORD_AUDIO 权限后再使用设备的麦克风。

4.1.9 麦克风和摄像头指示标志

在搭载 Android 12 的设备上,当应用使用麦克风或摄像头时,图标会出现在状态栏中。如果应用处于沉浸模式,则图标会出现在屏幕的右上角。用户可以打开“快捷设置”,并选择图标以查看哪些应用当前正在使用麦克风或摄像头。

为了提供更好的用户体验,在用户明确向您的应用授予权限之前,请勿使用麦克风或摄像头。

4.1.10 权限软件包可见性

在搭载 Android 12 的设备上,根据应用对其他应用的软件包可见性,以 Android 11(API 级别 30)或更高版本为目标平台且调用以下某种方法的应用会收到一组过滤后的结果:

4.1.11 移除了 Bouncy Castle 实现

Android 12 移除了之前废弃的加密算法(包括所有 AES 算法)的许多BouncyCastle实现。系统改用这些算法的Conscrypt实现。

如果符合以下任何条件,则此变更会影响您的应用:

  • 您的应用使用 512 位的密钥大小。Conscrypt 不支持此密钥大小。如有必要,请更新您应用的加密逻辑以使用其他密钥大小。
  • 您的应用将无效的密钥大小与 KeyGenerator 一起使用。与 BouncyCastle 相比,Conscrypt 的 KeyGenerator 实现会对密钥参数执行额外的验证。例如,Conscrypt 不允许您的应用生成 64 位 AES 密钥,因为 AES 仅支持 128 位、192 位和 256 位密钥。

BouncyCastle 允许生成大小无效的密钥,但如果稍后这些密钥与Cipher一起使用,验证会失败。如果使用 Conscrypt,验证失败的时间会更早。

  • 您使用并非 12 字节的大小初始化伽罗瓦/计数器模式 (GCM) 加密。Conscrypt 的 GcmParameterSpec 实现要求初始化为 12 字节,这是 NIST 推荐的做法。

4.1.12 剪贴板访问通知

在 Android 12 中,当某个应用首次调用getPrimaryClip()以访问来自其他应用的 ClipData 时,系统会显示一条消息框消息,通知用户此次剪贴板访问。

消息框消息内的文本包含以下格式:APP pasted from your clipboard.

检索剪贴说明时未显示消息

您的应用可能会调用getPrimaryClipDescription()以接收有关剪贴板上当前数据的信息。当您的应用调用此方法时,系统不会显示消息框消息。

Android 12 增强了此方法以检测下面这些额外的详细信息:

4.1.13 应用两个 Task 之间的过渡动画

Android 12 版本在两个 Task 之间的过渡动画逻辑发生了变更:

1.使用 Activity.overridePendingAppTransition 接口提供给系统的过渡动画无法作用于 Task 之间跳转。

2.使用 ActivityOptions.makeCustomAnimation 接口创建的过渡动画无法作用于 Task 之间跳转。

如果您的应用运行在 Android 12 设备上,且出现两个 Task 跳转时无过渡动画的情况,建议参考以下方案恢复 Task 动画的正常播放:

第一步,在项目资源目录下为 Task 创建过渡动画资源文件,如:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale
        android:fromXScale="1"
        android:toXScale="0.5"
        android:fromYScale="1"
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="200" />

</set>

第二步,在项目主题资源文件中配置 Task 过渡动画,如:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MyApplication" parent="Theme.AppCompat">
        //在主题中引用自定义的过渡动画
        <item name="android:windowAnimationStyle">@style/ActivitAnimStyle</item>
        //禁止启动动画,防止启动动画影响自定义动画的播放
        <item name="android:windowDisablePreview">true</item>
    </style>


    <style name="ActivitAnimStyle" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="android:taskOpenEnterAnimation">@anim/anim_xxx</item>
        <item name="android:taskOpenExitAnimation">@anim/anim_xxx</item>
        <item name="android:taskCloseEnterAnimation">@anim/anim_xxx</item>
        <item name="android:taskCloseExitAnimation">@anim/anim_xxx</item>
    </style>
</resources>

第三步,在 AndroidManifest.xml 文件中应用自定义主题,如:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true">
	<activity
        android:name=".MainActivity"
        android:exported="true"
        android:theme="@style/Theme.MyApplication">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".Secondctivity"
        android:launchMode="singleTask"
        android:taskAffinity=".NewTask"
        android:theme="@style/Theme.MyApplication"
        android:exported="true">
    </activity>
</application>

4.2 行为变更:以Android 12为目标平台的应用

4.2.1 WebView中SameSite cookie行为

Android 的 WebView 组件基于为 Google 开源项目 Chromium。在过去一年中,Chromium 变更了对第三方 Cookie 的处理方式,目的是为了更好地保护用户的安全和隐私,并赋予用户更高的透明度和控制权。从 Android 12 开始,这些变更将应用于 WebView 中。

Cookie 的 ​SameSite​ 属性决定了它是可以与任何请求一起发送,还是只能与同站点请求一起发送。Android 12 中的 WebView 基础版本(版本 89.0.4385.0)包含以下隐私保护方面的变更,旨在改善对第三方 Cookie 的默认处理方式,并帮助防止意外跨站点共享:

  • 没有 ​SameSite​ 属性的 Cookie 被视为 ​SameSite=Lax​。
  • 带有 ​SameSite=None​ 的 Cookie 还必须指定 ​Secure​ 属性,这意味着它们需要安全的上下文,并应通过 HTTPS 发送。
  • 站点的 HTTP 版本和 HTTPS 版本之间的链接现在被视为跨站点请求,因此除非将 Cookie 正确标记为 ​SameSite=None; Secure​,否则 Cookie 不会被发送。

对于开发者而言,一般指导意见是识别关键用户流中的跨站点 Cookie 依赖项,并确保在需要时使用适当的值显式设置 ​SameSite​ 属性。您必须显式指定允许在不同网站上运行的 Cookie,或适用于从 HTTP 切换到 HTTPS 进行同站点导航的 Cookie。

如需了解有关这些变更的更详细内容,请参阅:WebView 中的现代 SameSite Cookie 行为

4.2.2 adb备份

为了保护私有应用数据,Android 12 变更了 ​adb backup​ 命令的默认行为。对于以 Android 12 为目标平台的应用,用户运行 ​adb backup​ 命令时,从设备导出的任何其他系统数据都不包含应用数据。如果您的测试或开发工作流程依赖于使用 ​adb backup​ 的应用数据,现在您可以选择通过在应用的清单文件中将 ​android:debuggable​ 设置为 ​true​ 来导出应用数据。注意:为了帮助保护应用数据,请务必在发布应用前将 ​android:debuggable​ 设置为 ​false​。

4.2.3 组件安全性

4.2.3.1 更安全的exported组件

如果您的应用以 Android 12 为目标平台,且包含使用<intent-filter>的 activity、服务或广播接收器,您必须为这些应用组件显式声明 ​android:exported​ 属性。注意:targetSdkVersion为Android 12的应用,如果activity、服务或广播接收器使用 intent 过滤器,并且未显式声明 ​android:exported​ 的值,则您的应用将无法在搭载 Android 12 的设备上进行安装。强制安装时会有提示:

Targeting S+ (version 10000 and above) requires that an explicit value for 
android:exported be defined when intent filters are present

以下为正确的服务配置代码段:

<service android:name="com.example.app.xxxService"
         android:exported="false">
    <intent-filter>
        <action android:name="com.example.app.xxxxAction" />
    </intent-filter>
</service>
4.2.3.2 PendingIntent必须声明可变性

如果您的应用以 Android 12 为目标平台,您必须为您的应用创建的每个 ​PendingIntent​ 对象指定可变性。这项额外的要求可提高应用的安全性。如需声明特定 ​PendingIntent​ 对象是否可变,请分别使用 ​PendingIntent.FLAG_MUTABLE​ 或 ​PendingIntent.FLAG_IMMUTABLE​ 标志。如果您的应用试图在不设置任何可变标志的情况下创建 ​PendingIntent​ 对象,系统会抛出 ​IllegalArgumentException​,并在 Logcat 中显示以下消息:

PACKAGE_NAME: Targeting S+ (version 10000 and above) requires that one of 
FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.

Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if 
some functionality depends on the PendingIntent being mutable, e.g. if 
it needs to be used with inline replies or bubbles.

在大多数情况下,您的应用应创建不可变的 ​PendingIntent​ 对象,如以下代码段所示。如果 ​PendingIntent​ 对象不可变,则应用无法修改 intent 来调整调用 intent 的结果。

PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),
        requestCode, intent,/*flags */ PendingIntent.FLAG_IMMUTABLE);

有些情况下,应用需要创建可变的​PendingIntent​ 对象 :

  • 通知中的直接回复操作需要变更与回复关联的 ​PendingIntent​ 对象中的剪辑数据。通常,您可以通过将 ​FILL_IN_CLIP_DATA​ 作为标志传递给 ​fillIn()​ 的方法请求此变更。
  • 如果您的应用使用 ​PendingIntent​ 将对话放在气泡中,则 intent 应该可变,以便系统可以应用正确的标志,例如 ​FLAG_ACTIVITY_MULTIPLE_TASK​ 和 ​FLAG_ACTIVITY_NEW_DOCUMENT​。

如果您的应用创建了可变的 ​PendingIntent​ 对象,强烈建议您使用显式 intent 并填写​ComponentName​。如此一来,每当另一个应用调用 ​PendingIntent​ 并将控制权传回您的应用时,应用中的相同组件都会启动。

4.2.3.3 以不安全的方式启动嵌套intent

嵌套 intent 是在其他 intent 中作为 extra 传递的 intent。为了提高平台安全性,Android 12 提供了一种调试功能,如果您的应用以不安全的方式启动嵌套 intent,此功能便会发出警告。如果您的应用同时执行以下两项操作,就会发生 StrictMode 违规行为。

  1. 您的应用从已传递的 intent 的 extra 中解封嵌套 intent。
  2. 您的应用立即使用该嵌套 intent 启动应用组件,例如将 intent 传递给 ​startActivity()​、​startService()​ 或 ​bindService()​。

如需检查您的应用中是否会以不安全的方式启动嵌套 intent,请在配置 ​VmPolicy​ 时调用 ​detectUnsafeIntentLaunch()​,如以下代码段所示。如果您的应用检测到 StrictMode 违规行为,您可能需要停止应用的执行以保护潜在的敏感信息。

protected void onCreate() {
    StrictMode.setVmPolicy(new VmPolicy.Builder()
        // Other StrictMode checks that you've previously added.
        // ...
        .detectUnsafeIntentLaunch()
        .penaltyLog()
        // Consider also adding penaltyDeath()
        .build());
}

注意:如果您的应用以 Android 12 为目标平台,并在其 ​VmPolicy​ 定义中使用 ​detectAll()​ 方法,系统将自动调用 ​detectUnsafeIntentLaunch()​ 方法。

您的应用可能会启动嵌套 intent,以便在应用的各个组件之间导航,或代表其他应用执行操作。如需在这两种情况下最大限度地降低出现 StrictMode 违规行为的可能性,请执行以下操作:

  • 嵌套 intent 的内部启动:组件配置为 android:exported=”false” 。
  • 嵌套 intent 的跨应用启动:使用 ​PendingIntent​ 代替嵌套 intent。这样当 ​PendingIntent​ 从包含它的 ​Intent​ 中解封时,应用组件可以使用调用进程的身份启动 ​PendingIntent​。该配置允许提供程序应用向调用应用的任何组件(包括未导出的组件)发送回调。

4.2.4 前台服务启动限制

以Android 12为目标平台的应用在后台运行时无法再启动前台服务,但一些特殊情况除外。如果应用在后台运行时尝试启动前台服务且不符合特殊情况的,系统会抛出IllegalStateException。允许从后台启动前台服务的情况,请参考developer文档。

系统推荐替代前台服务的方案是WorkManager,Android 12 Beta 版发布时,WorkManager 将成为启动高优先级后台任务的推荐解决方案。Work Manager 2.7.0-alpha01 支持加急作业,后者是 Android 12 中的一种新作业。在 Android 11 及更低版本中,此版本的 WorkManager 使用前台服务提供向后兼容性。关于加急作业和WorkManager的更多介绍,请参考:加急作业

4.2.5 非SDK接口限制

从Android 9(API级别28)开始,Android平台对应用使用非SDK接口实施了限制。这些限制旨在提升用户体验,降低应用发生崩溃的风险,同时也为开发者降低紧急发布的风险。当应用通过引用非 SDK 接口或尝试使用反射或 JNI 来获取其句柄,这些限制就会生效,常见的访问非SDK接口,系统会抛出NoSuchFieldError,NoSuchMethodError,NoSuchFieldException,NoSuchMethodException,返回的结果可能是NULL。在Android 12中包含了更新后的受限制非SDK接口列表,在限制之前,Android会尽可能确保有可用的替代方案。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,应请求新的公共 API

Android 12 中的列表变更分为以下几类:

  • Android 11(API 级别 30)中不受支持的(已被列入灰名单)的非 SDK 接口现已在 Android 12 中被禁止使用
  • Android 11(API 级别 30)中受限的非 SDK 接口,它们在 Android 12 被添加到了 Android SDK 中。

如需查看 Android 12 的所有非 SDK 接口的完整列表,请下载以下文件:​hiddenapi-flags.csv​关于更多限制非SDK接口访问的内容,请参考:针对非 SDK 接口的限制

4.2.6 自定义通知变更

Android 12 改变了完全自定义通知的外观。 以前,自定义通知能够使用整个通知区域并提供自己的布局和样式,这可能在不同设备上引发布局兼容性问题。
对于以 Android 12 为目标平台的应用,包含自定义内容视图的通知将不再使用完整通知区域;相反,系统会应用标准模板。此模板可确保自定义通知在所有状态下都与其他通知相同,例如,在收起状态下的通知图标和展开功能,以及在展开状态下的通知图标、应用名称和收起功能。此行为与 ​Notification.DecoratedCustomViewStyle​ 的行为几乎完全相同。
通过这种方式,Android 12 通过为用户提供可看到且熟悉的通知展开功能,使所有通知保持外观一致且易于浏览。下图显示了标准模板中的自定义通知:

以下示例展示了在收起状态和展开状态下呈现的自定义通知:

Android 12 中的变更会影响某些定义 ​Notification.Style​ 的自定义子类的应用,或使用 ​Notification.Builder​ 的方法 ​setCustomContentView(RemoteViews)​、​setCustomBigContentView(RemoteViews)​ 和 ​setCustomHeadsUpContentView(RemoteViews)​ 的应用。如果您的应用使用的是完全自定义的通知,我们建议您尽快使用新模板进行测试,并进行必要的调整:

  1. 启用自定义通知变更:
  2. 将应用的 ​targetSdkVersion​ 变更为 ​S​ 以启用新行为。重新编译。在搭载 Android 12 的设备或模拟器上安装您的应用。
  3. 测试所有使用自定义视图的通知,确保这些通知在通知栏中看起来符合预期。
  4. 请注意自定义视图规格。一般来说,提供给自定义通知的高度比之前小。在收起状态下,自定义内容的最大高度已从 106dp 减少到 48dp。此外,水平空间也减小了。
  5. 为了确保“浮动通知”状态看起来符合您的预期,请勿忘记将通知渠道的重要性提升至“高”(在屏幕中弹出)。

4.2.7 连接性

以 Android 12 及更高版本为目标平台的设备在具有硬件支持的设备上运行时,在与对等设备建立连接时,使用点对点连接不会断开与现有 Wi-Fi 的连接。如需检查是否支持此功能,请使用 ​WifiManager.isMultiStaConcurrencySupported()​。

4.2.8 大致位置

使用以 Android 12 为目标平台的应用时,用户可以请求应用只能访问大致位置信息。

注意:如果您的应用请求 ACCESS_COARSE_LOCATION 但未请求 ACCESS_FINE_LOCATION,则此变更不会影响您的应用。

如果您的应用以 Android 12 为目标平台并且请求ACCESS_FINE_LOCATION运行时权限,则您还必须请求ACCESS_COARSE_LOCATION权限。您必须在单个运行时请求中包含这两项权限。

当您的应用同时请求 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 时,系统权限对话框将为用户提供以下新选项,如图 1 所示:

  • 确切:提供 ACCESS_FINE_LOCATION 权限提供的位置精确度。
  • 大致:提供 ACCESS_COARSE_LOCATION 权限提供的位置精确度。

详细了解 Android 12 中的大致位置

4.2.9 应用休眠

Android 12 在 Android 11(API 级别 30)中引入的自动重置权限行为的基础上进行了扩展。如果您的应用以 Android 12 为目标平台并且用户有几个月未与您的应用互动,则系统会自动重置授予的所有权限并将您的应用置于休眠状态。

注意:如果您的应用是实现DeviceAdminService或者在设备所有者或个人资料所有者操作模式下运行的设备政策控制器,则系统绝不会将您的应用置于休眠状态。

处于休眠状态的应用具有以下特征:

  • 系统会针对存储空间而非性能进行优化。应用缓存中的任何文件都会被移除。
  • 应用无法从后台运行作业或提醒。
  • 应用无法接收推送通知,包括通过 Firebase Cloud Messaging 发送的高优先级消息。

当用户下次与应用互动时,应用会退出休眠状态,并且可以再次创建作业、提醒和通知。不过,您需要重新调度在应用进入休眠状态之前调度的所有作业、提醒和通知。此工作流与用户从系统设置中手动强行停止应用时的工作流类似。为了更轻松地支持此工作流,请使用WorkManager。您还可以在ACTION_BOOT_COMPLETED 广播接收器中添加重新调度逻辑,系统会在您的应用离开休眠状态时以及设备启动后调用它。

请求用户停用休眠

如果您预计应用中的某个用例会受休眠的影响,您可以向用户发送请求,让其准许应用免于休眠和自动重置权限。如果用户希望应用主要在后台运行,即使用户不与应用互动,应用也能正常工作,例如,当应用执行以下一项或多项操作时,这种豁免很有用:

  • 通过定期报告家庭成员的位置来保障家庭安全。
  • 在设备与应用的服务器之间同步数据。
  • 与智能设备(如电视)通信。
  • 与配套设备(如手表)配对。

如需请求豁免,请调用包含Intent.ACTION_APPLICATION_DETAILS_SETTINGSintent 操作的 intent。在显示的屏幕中,用户可以关闭名为撤消权限并释放空间的选项。

注意:在调用 intent 之前,不妨考虑向用户显示一个指导界面,以便用户了解为什么您的应用将他们引导至系统设置。

测试休眠行为

如需将应用置于休眠状态以进行测试,请执行以下操作:

1.在设备上启用该行为:

adb shell device_config put app_hibernation app_hibernation_enabled true

2.更改应用的状态,使其进入休眠状态。包含 –global 标志的命令会强制应用进入“完全休眠”状态,以模拟系统已为多用户设备上的所有用户将应用置于休眠状态的情况。

adb shell cmd app_hibernation set-state  true && 
  adb shell cmd app_hibernation set-state --global  true

4.2.10 通知 trampoline 限制

当用户与通知互动时,某些应用会启动一个应用组件来响应通知点按操作,该应用组件最终会启动用户最终看到并与之互动的 activity。此应用组件被称为通知 trampoline。

为了改进应用性能和用户体验,以 Android 12 为目标平台的应用无法从用作通知 trampoline 的服务广播接收器中启动 activity。

换言之,当用户点按通知或通知中的操作按钮时,您的应用无法在服务或广播接收器内调用startActivity()

当您的应用尝试从充当通知 trampoline 的服务或广播接收器启动 activity 时,系统会阻止该 activity 启动,并在Logcat 中显示以下消息:

Indirect notification activity start (trampoline) from PACKAGE_NAME, 
this should be avoided for performance reasons.

识别哪些应用组件充当通知 trampoline 

测试您的应用时,点按通知后,您可以识别哪个服务或广播接收器在您的应用中充当通知 trampoline。为此,请查看以下终端命令的输出:

adb shell dumpsys activity service 
  com.android.systemui/.dump.SystemUIAuxiliaryDumpService

输出的某一部分包含文本“NotifInteractionLog”。此部分包含识别因点按通知而启动的组件所需的信息。

更新应用

如果您的应用从充当通知 trampoline 的服务或广播接收器启动 activity,请完成以下迁移步骤:

  1. 创建一个与用户点按通知后看到的 activity 关联的 PendingIntent 对象。
  2. 构建通知的过程中,使用您在上一步中创建的 PendingIntent 对象。

如需识别 activity 的来源,例如为了执行日志记录,请在发布通知时使用 extra。对于集中式日志记录,请使用ActivityLifecycleCallbacksJetpack 生命周期观察器

切换行为

在开发者预览版计划期间测试您的应用时,您可以使用 NOTIFICATION_TRAMPOLINE_BLOCK 应用兼容性标志启用和停用此限制。

Android 12 应用适配指南2 新功能和API

Android 12 应用适配指南2 新功能和API

新功能和API

3.1 用于接收内容的统一API

当前,用户更喜欢图片、视频等富有表现力的内容,但在应用中插入和移动并非易事。为了使应用能够轻松地接收富媒体内容,Android 12 引入了全新的统一 API,您可以从任何可用来源(剪贴板粘贴、键盘或拖放操作)接收富媒体内容。

3.1.1 接收内容的API

以前每个界面机制(例如长按菜单或拖放)都有对应的 API。这意味着您必须单独与每个 API 集成,并为每种插入内容的机制添加类似的代码:

现在新的统一 API 会通过创建一个要实现的单一 API 来整合这些不同的代码路径,这样您就可以专注于应用特定的逻辑,而让系统处理其余的工作:

新 API 是一个监听器接口,包含一种方法,即 ​OnReceiveContentListener​。此回调会成为您的代码处理接收所有内容(从纯文本和样式文本到标记、图片、视频、音频文件等)的唯一位置。为了兼容较低版本的 Android 平台,我们建议您使用 AndroidX,可在 Core 1.5.0-beta1 和 Appcompat 1.3.0-beta-01 中获得该API。

3.1.2 实现代码

如需使用该 API,请先指定您的应用可以处理哪些类型的内容,以开始实现该监听器:

public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] 
     {"image/*", "video/*"};
     // ...

指定您的应用支持的所有内容 MIME 类型后,实现该监听器的其余部分:

public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};

     @Override
     public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) {
         Pair<ContentInfoCompat, ContentInfoCompat> split = contentInfo.partition(
                 item -> item.getUri() != null);
         ContentInfo uriContent = split.first;
         ContentInfo remaining = split.second;
         if (uriContent != null) {
             ClipData clip = uriContent.getClip();
             for (int i = 0; i < clip.getItemCount(); i++) {
                 Uri uri = clip.getItemAt(i).getUri();
                 // App-specific logic to handle the URI ...
             }
         }
         // Return anything that your app didn't handle. This preserves the default platform
         // behavior for text and anything else that you aren't implementing custom handling for.
         return remaining;
     }
 }

3.1.3 实现效果

3.2 兼容的媒体转码

Android 12 引入了一项新功能,让录制视频的应用可以对设备上录制的视频进行更现代、存储效率更高的编码,同时又不影响与其他应用的兼容性。如果视频被不支持 HEVC 格式的应用打开,Android 会自动将以 HEVC (H.265) 等格式录制的视频转码为 AVC (H.264) 格式。对于在设备上创建的以下格式的内容,系统可以自动进行转码:

媒体格式XML属性MediaFormat MMIE类型
HEVC (H.265)HEVCMediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10MediaFeature.HdrType.HDR10
HDR10+HDR10PlusMediaFeature.HdrType.HDR10_PLUS

Android系统默认应用可以支持播放所有媒体格式,因此“兼容的媒体转码”默认情况下是关闭的。应用有两种方法来请求将媒体文件转码成更兼容的格式:1.在资源文件中声明;2.在代码中声明。

3.2.1 在资源文件中声明功能

首先在xml目录下创建media_capabilities.xml资源文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="true"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

这个例子中,录制的HEVC视频无法转码,而HDR视频会被转码为AVC SDR(标准动态范围)视频。同时,需要在应用AndroidManifest.xml中application 标签中使用property来标记对媒体功能文件的引用:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

3.2.2 在代码中声明功能

您可以使用构建器构造 ApplicationMediaCapabilities对象的实例,在代码中声明媒体功能:

ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder() 
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

通过 ContentResolver#openTypedAssetFileDescriptor()等方法访问媒体内容时,请使用此对象:

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    //视频内容会转换成ApplicationMediaCapabilities指定的格式
}

注意:代码的方式会优先于资源文件,这样可以对特定代码路径做更精细控制。

3.3 在企业中使用Android

3.3.1 Android 12中的企业功能新变化

  • 密码复杂度功能以预定义复杂存储分区(高、中、低和无)的形式设定设备级密码要求。如有必要,可对工作资料安全验证应用严格的密码要求。
  • 工作资料安全验证新手入门流程已简化。现在,设置会考虑设备密码是否符合管理员要求,让用户可以轻松选择是增强设备密码的强度还是使用工作资料安全验证。
  • 注册特定 ID 提供了一个唯一 ID,用于标识特定组织的工作资料注册,并且可在恢复出厂设置后保持稳定。在 Android 12 中,对于具有工作资料的个人设备,系统会移除对该设备的其他硬件标识符(IMEI、MEID、序列号)的访问权限。
  • 公司自有设备(无论是否具有工作资料)可以选择是否保留上述列表项中列出的功能,但不需要在 Android 12 中采用。

更详细的资料,请参阅:Android 12企业功能新变化

3.4.新的应用启动动画

Android 12 添加了SplashScreenAPI,它可为所有应用启用新的应用启动动画。这包括启动时的进入应用运动、显示应用图标的启动画面,以及向应用本身的过渡。

这种新体验可让应用每次启动时都呈现标准设计元素,但它也可自定义,以便您的应用能够保持其独特的品牌。

3.4.1 启动画面的工作原理

当用户启动应用而应用的进程未在运行(冷启动)或 Activity 尚未创建(温启动)时,会发生以下事件。(在热启动期间从不显示启动画面。)

  • 系统使用主题以及您已定义的任何动画显示启动画面。
  • 当应用准备就绪时,会关闭启动画面并显示应用。

3.4.2 动画的元素和机制

动画的元素由 Android 清单中的 XML 资源文件定义。每个元素都有浅色模式和深色模式版本。它们由窗口背景、动画形式的应用图标和图标背景组成。

关于这些元素,请注意以下几点:

  • 应用图标应该是矢量可绘制对象,它可以是静态或动画形式。虽然动画的时长可以不受限制,但我们建议让其不超过 1000 毫秒。默认情况下,使用启动器图标。
  • 图标背景是可选的,在图标与窗口背景之间需要更高的对比度时很有用。如果您使用一个自适应图标,当该图标与窗口背景之间的对比度足够高时,就会显示其背景。
  • 与自适应图标一样,前景的 ⅓ 被遮盖。
  • 窗口背景由不透明的单色组成。如果窗口背景已设置且为纯色,则未设置相应的属性时默认使用该背景。

启动画面动画机制由进入动画和退出动画组成。

  • 进入动画由系统视图到启动画面组成。这由系统控制且不可自定义。
  • 退出动画由隐藏启动画面的动画运行组成。如果您要对其进行自定义,您将可以访问 SplashScreenView 及其图标,并且可以在它们之上运行任何动画(需要设置转换、不透明度和颜色)。在这种情况下,当动画完成时,需要手动移除启动画面。

3.4.3 自定义应用中的启动画面

默认情况下,SplashScreen 使用主题的 windowBackground(如果它是单色)和启动器图标。启动画面的自定义通过向应用主题添加属性来完成。

您可以通过以下任一方式自定义应用的启动画面:

  • 设置主题属性以更改其外观
  • 让其在屏幕上显示更长时间
  • 自定义用于关闭启动画面的动画

设置启动画面的主题以更改其外观

您可以在 Activity 主题中指定以下属性来自定义应用的启动画面。如果您已有使用 android:windowBackground 等属性的旧版启动画面实现,不妨考虑为 Android 12 提供替代资源文件。

1.使用windowSplashScreenBackground 以特定的单色填充背景:

<item name="android:windowSplashScreenBackground">@color/...</item>

2.使用windowSplashScreenAnimatedIcon替换起始窗口中心的图标。如果对象通过AnimationDrawableAnimatedVectorDrawable可呈现动画效果且可绘制,则也会在显示起始窗口的同时播放动画。

<item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>

3.使用windowSplashScreenAnimationDuration设置启动画面在关闭之前显示的时长。最长时间为 1000 毫秒。

4.使用 windowSplashScreenIconBackground 设置启动画面图标后面的背景。当窗口背景与图标之间的对比度不够高时,这很有用。

<item name="android:windowSplashScreenIconBackground">@color/...</item>

5.(可选)您可以使用windowSplashScreenBrandingImage设置要显示在启动画面底部的图片。设计准则建议不要使用品牌图片。

<item name="android:windowSplashScreenBrandingImage">@drawable/...</item>

注意:建议的设计准则是不要使用品牌图片。

让启动画面在屏幕上显示更长时间

当应用绘制第一帧后,启动画面会立即关闭。如果您需要从本地磁盘异步加载少量数据(如应用内主题设置),您可以使用ViewTreeObserver.OnPreDrawListener让应用暂停绘制第一帧。

// Create a new event for the activity.
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Set the layout for the content view.
    setContentView(R.layout.main_activity);

    // Set up an OnPreDrawListener to the root view.
    final View content = findViewById(android.R.id.content);
    content.getViewTreeObserver().addOnPreDrawListener(
            new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    // Check if the initial data is ready.
                    if (mViewModel.isReady()) {
                        // The content is ready; start drawing.
                        content.getViewTreeObserver().removeOnPreDrawListener(this);
                        return true;
                    } else {
                        // The content is not ready; suspend.
                        return false;
                    }
                }
            });
}

自定义用于关闭启动画面的动画

您可以通过Activity.getSplashScreen进一步自定义启动画面的动画。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...

    // Add a callback that's called when the splash screen is animating to
    // the app content.
    getSplashScreen().setOnExitAnimationListener(splashScreenView -> {
        final ObjectAnimator slideUp = ObjectAnimator.ofFloat(
                splashScreenView,
                View.TRANSLATION_Y,
                0f,
                -splashScreenView.getHeight()
        );
        slideUp.setInterpolator(new AnticipateInterpolator());
        slideUp.setDuration(200L);

        // Call SplashScreenView.remove at the end of your custom animation.
        slideUp.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                splashScreenView.remove();
            }
        });

        // Run your animation.
        slideUp.start();
    });
}

在此回调开始时,启动画面上动画形式的矢量可绘制对象已经开始。根据应用启动的时长,可绘制对象可能在其动画的中间。使用SplashScreenView.getIconAnimationStartMillis 可了解动画何时开始。您可以按如下方式计算图标动画的剩余时长:

// Get the duration of the animated vector drawable.
long animationDuration = splashScreenView.getIconAnimationDurationMillis();
// Get the start time of the animation.
long animationStart = splashScreenView.getIconAnimationStartMillis();
// Calculate the remaining duration of the animation.
long remainingDuration = Math.max(
        animationDuration - (SystemClock.uptimeMillis() - animationStart),
        0L
);

3.5 画中画 (PiP) 改进

Android 12 针对画中画 (PiP) 模式引入了行为改进和新功能

3.5.1 点按一次和点按两次的行为改进

Android 12 改进了点按一次和点按两次的画中画行为,具体说明如下:

  • 现在,点按一次画中画窗口会为用户显示控件。以前,点按一次会展开画中画窗口并显示控件。
  • 现在,点按两次画中画窗口会在当前画中画大小与最大画中画大小之间切换。以前,点按两次会离开画中画模式而改为全屏模式。

3.5.2 新功能

Android 12 针对画中画模式引入了以下新功能:

3.5.2.1 用于在手势导航中更流畅地过渡到画中画模式的新 API 标志

Android 12 可让您使用新的setAutoEnterEnabled标志,在手势导航模式下向上滑动转到主屏幕时更流畅地过渡到画中画模式。以前,Android 会等到“向上滑动转到主屏幕”动画结束,然后再淡入画中画窗口。

如需实现此功能,请执行以下操作:

1.使用setAutoEnterEnabled 构造PictureInPictureParams.Builder,如下所示:

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setAspectRatio(aspectRatio)
    .setSourceRectHint(sourceRectHint)
    .setAutoEnterEnabled(true)    
    .build());

注意:启用 setAutoEnterEnabled 后,无需在onUserLeaveHint中显式调用enterPictureInPictureMode

2.尽早使用最新的 PictureInPictureParams 调用 setPictureInPictureParams。应用不应等待 onUserLeaveHint 回调(就像在 Android 11 中所做的那样)。

例如,应用可能要在第一次播放以及后续任何一次播放时(如果宽高比发生了变化)调用 setPictureInPictureParams。

3.根据需要调用 setAutoEnterEnabled(false)。例如,如果当前播放处于暂停状态,则视频应用进入画中画模式可能不是最佳选择。

3.5.2.2 用于为非视频内容停用无缝大小调整的新 API 标志

Android 12 添加了SeamlessResizeEnabled标志,在画中画窗口中调整非视频内容的大小时,该标志可提供更流畅的交替淡变动画。以前,在画中画窗口中调整非视频内容的大小时会产生烦人的视觉伪影。

为了向后兼容,默认情况下,将 setSeamlessResizeEnabled 标志设置为 true。对于视频内容,请将其设置保留为 true;对于非视频内容,请将其更改为 false。

如需停用非视频内容的无缝大小调整,请编写以下代码:

 setPictureInPictureParams(new PictureInPictureParams.Builder()
      .setSeamlessResizeEnabled(false)
      .build());
3.5.2.3 退出画中画模式时支持更流畅的动画

在 Android 12 中,SourceRectHint标志现在重用于在退出画中画模式时实现更流畅的动画。退出时,系统会使用当前可用的 sourceRectHint 创建动画,无论它是用于进入画中画模式的原始 Rect,还是应用提供的更新后的 Rect。

如需实现此功能,请按以下方式更新您的应用:

1.继续使用sourceRectHintaspectRatio构造 PictureInPictureParams,以实现流畅的进入动画。

2.如有必要,请在系统开始退出过渡之前更新sourceRectHint。当系统即将退出画中画模式时,activity 的视图层次结构会布局成其目标配置(例如全屏)。应用可以将布局更改监听器附加到其根视图或目标视图(如视频播放器视图),以检测事件并在动画开始前更新 sourceRectHint。

// Listener is called immediately after the user exits PIP but before animating.  
 playerView.addOnLayoutChangeListener { _, left, top, right, bottom,                      
               oldLeft, oldTop, oldRight, oldBottom ->      
   if (left != oldLeft || right != oldRight || top != oldTop 
           || bottom != oldBottom) {         
       // The playerView's bounds changed, update the source hint rect to         
       // reflect its new bounds.         
       val sourceRectHint = Rect()         
       playerView.getGlobalVisibleRect(sourceRectHint)         
       setPictureInPictureParams(             
           PictureInPictureParams.Builder()                 
               .setSourceRectHint(sourceRectHint)                 
               .build()         
       )      
   }  
}
3.5.2.4 支持新手势

Android 12 现在支持对画中画窗口使用隐藏和“双指张合即可缩放”手势:

  • 如需隐藏窗口,用户可以将窗口拖动到左侧或右侧边缘。如需取消隐藏窗口,用户可以点按已隐藏窗口的可见部分或将其拖出。
  • 用户现在可以使用“双指张合即可缩放”手势调整画中画窗口的大小。

3.6 存储

Android 12 引入了对存储管理 API 的几项变更,下面几部分对此进行了介绍。

3.6.1 语音录音的新目录

系统会将存储在新Environment.DIRECTORY_RECORDINGS文件夹中的音频文件识别为录音。当您的应用对系统的媒体库执行查询时,您可以使用IS_RECORDING标志来检索录音。

3.6.2 媒体管理访问权限

用户可能会信任特定的应用来执行媒体管理,如频繁地修改媒体文件。如果您的应用以 Android 11(API 级别 30)或更高版本为目标平台且不是设备的默认图库应用,则每次您的应用尝试修改或删除文件时,您都必须向用户显示一个确认对话框。

如果您的应用以 Android 12 为目标平台,您可以请求用户向您的应用授予执行以下各项操作的权限,而无需针对每项文件操作提示用户:

为此,请完成以下步骤:

1.在应用的清单文件中声明新的MANAGE_MEDIA权限和READ_EXTERNAL_STORAGE权限。

为了调用 createWriteRequest() 而不显示确认对话框,请同时声明ACCESS_MEDIA_LOCATION权限。

2.在您的应用中,向用户显示一个界面,说明为什么他们可能需要向您的应用授予媒体管理访问权限。

3.调用ACTION_REQUEST_MANAGE_MEDIA intent 操作。这样会将用户引导至系统设置中的媒体管理应用屏幕。在此处,用户可以授予特殊应用访问权限。

3.6.3 应用存储访问权限

应用可以声明并创建一个自定义 activity,该 activity 在启动后可让用户管理应用存储在用户设备上的数据。应用可以在清单文件中使用android:manageSpaceActivity

属性声明此自定义“管理空间”activity。文件管理器应用可以启动此“管理空间”activity,即使应用未导出该 activity(即,该 activity 将android:exported设置为 false)也是如此。

在 Android 12 中,同时具有MANAGE_EXTERNAL_STORAGE权限和QUERY_ALL_PACKAGES权限的应用(如文件管理应用)可使用新的getManageSpaceActivityIntent()

将用户引导至其他应用的自定义“管理空间”activity(如果为该应用定义了一个)。

getManageSpaceActivityIntent() 方法接受软件包名称和请求代码,它返回以下某一项:

  • PendingIntent – 如果具有指定软件包名称的应用已定义自定义“管理空间”activity。调用 getManageSpaceActivityIntent() 方法的应用随后可以调用返回的 intent 以将用户引导至该自定义 activity。
  • null – 如果具有指定软件包名称的应用未定义“管理空间”activity。

3.6.4 扩展的文件访问权限支持

除了对 ExternalStorageProvider URI 的现有支持以外,getMediaUri()方法现在还支持 MediaDocumentsProvider URI。现在,系统在返回这些 URI 之前将其授予调用方。

此外,由createWriteRequest()授予的媒体 URI 现在支持File 类中的 API。这些 API 提供了读取、写入、重命名和删除文件的功能。

Android 12 应用适配指南 获取Android 12

Android 12 应用适配指南 获取Android 12

1.综述

本文档基于谷歌Android 12 Beta 1版本的变更输出,后续版本如有新的变更和特性,我们会刷新文档的相关章节内容,请开发者持续关注。

2.获取Android 12

2.1 小米机器升级Android 12指导

小米11 Ultra、小米11 Pro、小米11、Redmi K40 Pro 可以线刷Android 12测试版,您可以在我们的小米社区上下载ROM包手动升级。

2.2 Google原生机升级Android 12

开发者持有Pixel系列的机器可以直接ota升级,或者下载镜像升级,具体见链接:https://developer.android.google.cn/about/versions/12/download

2.3 Android 模拟器

  1. 依次点击 Tools > SDK Manager。
  2. 在 SDK Platforms 标签页中,选择 Android 12。
  3. 在 SDK Tools 标签页中,选择 Android SDK Build-Tools 31。
  4. 点击 OK 安装 SDK。

如需访问 Android 12 API 并测试应用与 Android 12 的兼容性,请打开模块级 ​build.gradle​ 或 ​build.gradle.kts​ 文件,并使用 Android 12 的值更新 ​compileSdkVersion​ 和 ​targetSdkVersion​:

android {
    compileSdkVersion("android-S")

    defaultConfig {
        targetSdkVersion("S")
    }
}

注意:如果您尚未完全支持 Android 12,您仍可以使用可调试的应用、Android 12 设备和兼容性框架来执行应用兼容性测试,而无需更改应用的 ​compileSdkVersion​ 或 ​targetSdkVersion​。

2.4 小米远程真机调试

小米云测平台已经提供关于小米11(Android 12)的远程真机服务,开发者可以直接通过以下链接进入远程真机进行试用体验:https://testit.miui.com/remote

Android 13 应用适配指南4,安卓13新功能和API

Android 13 应用适配指南4,安卓13新功能和API

4.迁移指南

每次发布新的 Android 版本时,我们都会推出一些全新的功能并引入一些行为变更,目的就在于提高 Android 的实用性、安全性和性能。在许多情况下,您的应用都可以直接使用并完全按预期运行;而在其他的一些情况下,您可能需要对应用进行更新以适应这些平台变更。

源代码发布到 AOSP(Android 开源平台)后,用户随之就可能开始使用新平台。因此,应用必须做好准备,让用户能够正常使用,最好还能利用新的功能和 API 发挥新平台的最大优势。

典型的迁移包含两个阶段,这两个阶段可以同时进行:

  • 确保应用兼容性(在 Android 13 最终发布前)
  • 针对新平台的功能和 API 调整应用(最终发布后尽快进行)

4.1 确保与 Android 13 兼容

您必须测试现有应用在 Android 13 上的运行情况,以确保更新到最新版 Android 的用户获得良好的体验。有些平台变更可能会影响应用的行为方式,因此,必须尽早进行全面测试并对应用进行任何必要的调整。

您通常可以调整应用并发布更新,而无需更改应用的targetSdkVersion。同样,您应该也不需要使用新的 API 或更改应用的compileSdkVersion,但是这一点可能要取决于应用的构建方式及其所使用的平台功能。

在开始测试之前,请务必熟悉行为变更:所有应用。即使您不更改应用的targetSdkVersion,这些变更也可能会影响您的应用。

请务必查看并测试受限非 SDK 接口的使用。您应使用应用公共 SDK 或 NDK 等效项替换应用使用的任何受限接口。留意突出显示这些访问权限的 logcat 警告,并使用StrictMode方法detectNonSdkApiUsage()以编程方式捕获它们。最后,请务必完整测试应用中的库和 SDK

,确保它们在 Android 13 上按预期运行,并遵循隐私权、性能、用户体验、数据处理和权限方面的最佳做法。如果您遇到问题,请尝试更新到最新版本的 SDK,或联系 SDK 开发者寻求帮助。

当您完成测试并进行更新后,我们建议您立即发布兼容的应用。这样可以尽早让您的用户测试应用,并帮助用户顺利过渡到 Android 13。

4.2 更新应用的目标平台并使用新 API 进行构建

发布应用的兼容版本后,下一步是通过更新targetSdkVersion并利用 Android 13 的新 API 和功能来添加对 Android 13 的全面支持。准备就绪后,您即可开始进行这些更新,请注意以新平台为目标平台方面的Google Play 要求

当您计划全面支持 Android 13 时,请查看行为变更:以Android 13为目标平台的应用。这些针对性的行为变更可能会导致需要解决的功能问题。在某些情况下,这些变更需要进行大量开发工作,因此我们建议您尽早了解并解决这些问题。为帮助确定影响您的应用的具体行为变更,请使用兼容性切换开关来测试已启用所选变更的应用。

以下是全面支持 Android 13 的步骤。

a. 获取 SDK,更改目标平台,使用新 API 进行构建

如需开始针对 Android 13 全面支持进行测试,请使用最新预览版的 Android Studio 下载 Android 13 SDK,以及所需的任何其他工具。接下来,更新应用的targetSdkVersion和compileSdkVersion,然后重新编译应用。如需了解详情,请参阅SDK 设置指南

b. 测试 Android 13 应用

编译应用并将其安装到搭载 Android 13 的设备上后,请开始测试,以确保应用能够在 Android 13 上正常运行。某些行为变更仅在您的应用以新平台为目标平台时才适用,因此您需要在开始之前阅读本文的行为变更。

与基本兼容性测试一样,完成所有流程和功能以查找问题。将测试重点放在以Android 13为目标平台的行为变更上。您还可以根据核心应用质量指南测试最佳做法检查您的应用。请务必查看并测试可能适用的受限非 SDK 接口的使用。留意突出显示这些访问权限的 logcat 警告,并使用 StrictMode 方法detectNonSdkApiUsage()以编程方式捕获它们。最后,请务必完整测试应用中的库和 SDK,确保它们在 Android 13 上按预期运行,并遵循隐私权、性能、用户体验、数据处理和权限方面的最佳做法。如果您遇到问题,请尝试更新到最新版本的 SDK,或联系 SDK 开发者寻求帮助。

c. 使用应用兼容性切换开关进行测试

Android 13 包含兼容性切换开关,可让您更轻松地在您的应用中测试针对性的行为变更。对于可调试的应用,切换开关可让您:

  • 在不实际更改应用的 targetSdkVersion 的情况下测试针对性的变更。您可以使用切换开关强制启用特定的针对性行为变更,以评估对现有应用的影响。
  • 仅针对特定变更进行测试。您可以使用切换开关停用除要测试的变更之外的所有针对性变更,而不必一次处理所有针对性变更。
  • 通过 adb 管理切换开关。您可以使用 adb 命令在自动测试环境中启用和停用可切换的变更。
  • 使用标准变更 ID 更快地进行调试。每个可切换的变更都具有唯一 ID 和名称,可用于在日志输出中快速调试根本原因。

在您准备更改应用的目标平台时,或者在您积极开发以便支持 Android 13 时,切换开关将十分有用。如需了解详情,请参阅兼容性框架变更 (Android 13)

5.重点适配问题

为了解当前应用对Android 13 版本的适配情况,以便更好推进MIUI Android 13适配工作,我们已在内部进行了自动化兼容性测试。我们选取了小米应用商店Top的各类应用,对每个应用进行下载、安装、启动、monkey测试、遍历测试、卸载,并在整个过程中检测是否有FC/ANR问题发生。根据测试结果,我们强烈建议您关注以下问题。若您的应用存在以下情况,请尽快适配。

5.1 Native Crash问题

移动安全联盟msa的SDK崩溃问题,特征:linker64

04-24 18:24:19.863 8983 8983 F DEBUG : Cmdline: xxx
04-24 18:24:19.863 8983 8983 F DEBUG : pid: 8470, tid: 8470, name: xxx >>> xxx <<<
04-24 18:24:19.863 8983 8983 F DEBUG : uid: 10195
04-24 18:24:19.864 8983 8983 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
04-24 18:24:19.864 8983 8983 F DEBUG : pac_enabled_keys: 0000000000000000
04-24 18:24:19.864 8983 8983 F DEBUG : signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x000000704a6bd764
04-24 18:24:19.864 8983 8983 F DEBUG : x0 00000031b8a0a445 x1 0000007fdc63abc8 x2 0000000000000000 x3 0000007fdc63abb8
04-24 18:24:19.864 8983 8983 F DEBUG : x4 0000007049d551d0 x5 0000000000000000 x6 fefefefefefefeff x7 7f7f7f7f7f7f7f7f
04-24 18:24:19.864 8983 8983 F DEBUG : x8 0000000000428290 x9 000000704857c2e4 x10 0000000000000070 x11 0000000000000000
04-24 18:24:19.864 8983 8983 F DEBUG : x12 000000704cac0950 x13 f43ca3815c475fbd x14 0000000000000006 x15 ffffffffffffffff
04-24 18:24:19.865 8983 8983 F DEBUG : x16 0000000000000001 x17 000000704cbaa880 x18 0000006c8f0bdf90 x19 000000704b984018
04-24 18:24:19.865 8983 8983 F DEBUG : x20 0000007fdc63abc8 x21 00000031b8a0a445 x22 00000000b8a0a445 x23 0000000000000000
04-24 18:24:19.865 8983 8983 F DEBUG : x24 0000000000000000 x25 000000704b8abdd0 x26 000000704cbdd3a8 x27 000000704cbdf000
04-24 18:24:19.865 8983 8983 F DEBUG : x28 0000000000000000 x29 0000007fdc63aac0
04-24 18:24:19.866 8983 8983 F DEBUG : lr 000000704cb05130 sp 0000007fdc63aac0 pc 000000704cb0515c pst 0000000060001000
04-24 18:24:19.866 8983 8983 F DEBUG : backtrace:
04-24 18:24:19.866 8983 8983 F DEBUG : #00 pc 000000000005215c /apex/com.android.runtime/bin/linker64 (__dl__ZNK6soinfo10gnu_lookupER10SymbolNamePK12version_info+112) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.866 8983 8983 F DEBUG : #01 pc 0000000000043d04 /apex/com.android.runtime/bin/linker64 (__dl__ZL24dlsym_handle_lookup_implP19android_namespace_tP6soinfoS2_PS2_R10SymbolNamePK12version_info+408) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.867 8983 8983 F DEBUG : #02 pc 000000000003d834 /apex/com.android.runtime/bin/linker64 (__dl__Z8do_dlsymPvPKcS1_PKvPS_+904) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.867 8983 8983 F DEBUG : #03 pc 0000000000038300 /apex/com.android.runtime/bin/linker64 (__dl__Z10dlsym_implPvPKcS1_PKv+92) (BuildId: 5349b396f749a8df4f77c0798d1b2185)
04-24 18:24:19.867 8983 8983 F DEBUG : #04 pc 0000000000001070 /apex/com.android.runtime/lib64/bionic/libdl.so (dlsym+20) (BuildId: 72dd43ea80dff185706bb3bdfcfaf051)
04-24 18:24:19.867 8983 8983 F DEBUG : #05 pc 000000000045ae84 /apex/com.android.art/lib64/libart.so (art::SharedLibrary::FindSymbolWithoutNativeBridge(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)+72) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #06 pc 00000000004591d8 /apex/com.android.art/lib64/libart.so (art::JavaVMExt::FindCodeForNativeMethod(art::ArtMethod*)+1532) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #07 pc 00000000006da6bc /apex/com.android.art/lib64/libart.so (artFindNativeMethodRunnable+328) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #08 pc 00000000006da9d8 /apex/com.android.art/lib64/libart.so (artFindNativeMethod+592) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.867 8983 8983 F DEBUG : #09 pc 000000000020f5f8 /apex/com.android.art/lib64/libart.so (art_jni_dlsym_lookup_stub+72) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #10 pc 000000000021a154 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+148) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #11 pc 000000000021076c /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+556) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #12 pc 000000000027a364 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+188) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #13 pc 0000000000610d30 /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeVirtualOrInterfaceWithJValues<art::ArtMethod*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, art::ArtMethod*, jvalue const*)+464) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #14 pc 000000000046dfb0 /apex/com.android.art/lib64/libart.so (art::JNI<false>::CallBooleanMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue const*)+600) (BuildId: a479d08d252964da32f296b9ff5cf3ce)
04-24 18:24:19.868 8983 8983 F DEBUG : #15 pc 00000000000323a4 <anonymous:6cfd9a9000>

如您使用了此SDK,请联系SDK提供方。