小米开发平台开发者评价功能操作指南

小米开发平台开发者评价功能操作指南

为评估开发者站的使用体验、获取真实的反馈,以帮助开发者更好地使用平台,我们从平台功能、运营服务、审核三个方向建立了开放平台的评价体系。

您真实的用户体验,能帮助我们及时判定开发者站的优化方向是否正确。本文档介绍了评价的入口及操作指南,希望您能有所了解,并积极给予反馈。

一、平台功能评价

1、评价体系现覆盖开放平台的八大主要功能,包括:

开发者账号注册

(应用/游戏)创建上传

(应用/游戏)更新

(应用/游戏)下架请求

被下架后申诉

应用认领

商品管理

素材A/B测试(创建任务 & 查看数据)

2、评价步骤

2.1 进入评价页面

在上述八大功能使用后的“提交审核成功”页面,点击右下角的橙色小方框,即可进入评价页。

hh

2.2 给该功能打分

根据你对该功能的使用体验,选择对应的表情。

当你对该功能“不满意”或感觉“一般”时,请留下3字以上的宝贵意见;当你对该功能“很不满意”时,请留下7字以上的宝贵意见,并支持上传1-3张问题截图。

2.3 点击“提交”,我们将收到您的反馈。

二、审核服务评价

评价体系现覆盖审核服务的五大场景,包括:

开发者账号注册

应用创建上传

应用更新上传

信息变更

(应用/游戏)下架

hh

注意:评价入口仅在初次审核失败、重提申请时出现。评价步骤,同平台功能评价一致

小米开发平台应用资质上传操作指南

小米开发平台应用资质上传操作指南

本文档介绍了如何进行应用资质提交,您可在阅读文档内容后,了解具体内容。

资质提交须知:

1、适用背景:为减少在架应用的侵权纠纷,小米应用商店现要求开发者提供应用版权相关证明材料。商店将于2021年5月20号执行版权文件提交要求,届时新增和更新应用需补充上述资质提交审核,若暂无上述资质,请在2021年6月20日前办理好上述资质并且补充资质提交审核,如因开发者自身原因未能按时提交资质,我们后续在审核新增和更新应用时会对应用做驳回处理。

2、适用对象:小米应用商店全量应用。

资质材料获取路径:

1、《计算机软件著作权证书》或《APP电子版权认证证书》

申请和查询入口:https://register.ccopyright.com.cn/query.html

2、ICP证或ICP备案截图

请提交ICP证或ICP备案截图到资质栏中,ICP证或ICP备案需开发者到各地通信管理部门或其官方网站上进行申请,

若您已申请ICP证或ICP备案截图,请您登录https://beian.miit.gov.cn/#/Integrated/index查询您的ICP。

操作方法/路径:

1、应用创建:

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

1.2 完成应用的包名创建、安装包上传、权限信息完善、发布设置、本地化语言信息等资料的填写。相关步骤可参考应用创建操作指南文档。

1.3 上传相关行业资质证明,请您如实填写应用ICP备案号并上传版权证明。

1.4 后续应用创建步骤,请参考应用创建操作指南文档。

2、应用更新/资料修改:

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

2.2 若您在应用更新的进程中进行资质提交,请您点击应用详情页“更新版本”按钮进入应用更新页面;若您在应用资料修改的进程中进行资质提交,请您点击“编辑资料”按钮进入完善资料页面;

2.3 应用更新/资料修改相关步骤请参考应用更新、修改操作指南文档。

2.4 请在相应位置完善应用的资质证明,如实填写应用ICP备案号并上传版权证明。

小米应用商店风险应用审查标准

为保障外部来源的应用在小米终端设备上具备良好的使用体验,小米统一对第三方移动智能终端应用软件(下称“应用”)及其下载渠道(含提供应用下载功能的第三方应用)在小米终端设备上的应用下载、安装等行为进行检测和管理。根据《网络安全法》、《互联网信息服务管理办法》、《移动智能终端应用软件预置和分发管理暂行规定》、《移动应用(APP)数据安全与个人信息保护白皮书》等法律法规、相关政策和通信行业标准,小米制定了《风险应用审查标准》(下称本标准),规定了风险应用类别,即存在下列行为的应用即为风险应用,可能会给用户的设备、数据、隐私或用户财产安全造成负面影响。

小米将通过安全中心内置的应用风险检测服务、用户举报、上架人工审核等渠道进行风险识别,在终端用户下载、安装应用的过程中,依据检测情况和风险严重程度进行相应的风险提示、安全引导、下载或安装限制、小米应用商店已检测版本安装提醒等操作。包括但不限于以下风险应用类别:

一、应用涉及政治敏感内容

应用内容涉及政治敏感、破坏社会稳定的信息。包括但不限于:

  • 对国家领导人诽谤、人身攻击或者侮辱性的内容
  • 含有关于宗教、种族、性取向、性别或其他目标群体的诽谤或恶意内容
  • 含有政治谣言、涉及反政府、反社会以及其他涉及政治敏感内容

二、应用涉及违禁品内容或违禁品交易

应用存在法律明确规定的违禁品内容或相关交易。包括但不限于:

  • 爆炸物品
  • 剧毒物品
  • 麻醉剂
  • 放射性物品
  • 香烟售卖
  • 枪支器械及其交易
  • 其他违禁品及其交易

三、应用涉及血腥暴力内容

应用含有血腥、暴力等引起用户不适的内容。包括但不限于:

  • 过分描述暴力
  • 对血腥场面过度展示
  • 含有虐待、侮辱性内容

四、应用涉及色情内容

应用包含色情内容或色情服务,如性器官的过分展示。包括但不限于:

  • 应用涉及色情内容
  • 允许应用使用者发布含有色情内容的文字、图片、视频、音频等
  • 应用内含有色情服务

五、应用涉及非法交易和非法金融行为

应用内含有法律违禁的交易和非法金融行为,包括但不限于:

  • 应用含有非法金融行为,包括但不限于违法私募基金、地下钱庄、高利贷、期货等
  • 应用含有非法金钱交易,包括但不限于违规销售彩票、赌博行为或其他法律禁止的金钱交易
  • 应用提供虚拟币交易或支付,包括但不限于如比特币、以太坊、其他虚拟币等

六、应用提供违规VPN服务

应用含违规支持境外软件访问的VPN相关功能,通过VPN功能导致违规内容传播。

七、应用存在病毒

应用内含有病毒等恶意代码,危害用户的安全。包括但不限于:

  • 木马
  • 蠕虫
  • 后门
  • 混合型恶意软件

八、应用涉及恶意扣费

在用户不知情或未授权的情况下,通过隐蔽执行、欺骗用户点击等手段,订购各类收费业务或使用移动终端支付。包括但不限于:

  • 在用户不知情或未授权的情况下,自动订购付费服务或者自动扣费
  • 应用通过非正常手段,如模拟系统窗口、替换按钮功能诱导用户点击、故意隐藏关键订购协议诱导用户同意付费等,直接进行扣费
  • 无二次确认的情况下,直接扣费
  • 诱导用户付费或者强制付费后未完整履行付费服务
  • APP造成用户财产损失且有持续、大范围扩散风险,且APP开发者不介入解决用户损失问题
  • 用户付费后未完整履行付费服务,或提供的付费服务与承诺存在偏差

九、应用隐私不合规

应用涉及在用户不知情或未授权的情况下侵犯个人隐私。包括但不限于:

  • 应用的隐私政策未向用户进行明示;
  • 应用的隐私政策未详细向用户说明,应用收集使用的个人信息目的、类型、方式
  • 应用内存在默认或强制用户同意隐私协议行为
  • 应用存在超范围收集个人信息及系统权限行为
  • 应用内强制用户授权,存在“不给权限不让用”的行为
  • 应用存在未用户同意收集个人信息行为
  • 应用实际收集使用个人信息行为与声明不一致
  • 应用未经用户同意向第三方企业提供个人信息
  • 应用未提供删除、更正或投诉举报的功能或渠道
  • 应用未提供有效的注销用户账号途径,或针对用户注销设置障碍
  • 应用存在强制收集用户个人信息,强迫用户使用定向推送功能

详情可参考:《应用隐私合规标准

十、应用含有恶意广告

应用以用户不希望的方式显示广告,包括损害或干扰设备功能的可用性,或在未经充分同意的情况下在触发应用环境之外的展示。包括但不限于:

  • 应用内广告不得频繁出现以弹窗、横幅、视频形式影响用户正常使用
  • 应用内广告需提供可关闭按钮,不得设置关闭障碍
  • 应用内广告不得欺骗误导用户,不得虚假宣传等诱导方式欺骗误导用户
  • 应用内广告不得存在“极限词”、涉黄等违反国家广告法相关内容
  • 应用广告不得抢占锁屏、桌面,影响用户正常使用

十一、应用涉及远程控制

应用在用户不知情或未授权的情况下,能够接受远程控制端指令并进行相关操作 ,具有远程控制属性。包括但不限于:

  • 在未经用户许可的情况下操作和篡改系统相关设置
  • 远程控制拍照录音上传

十二、应用存在系统破坏情况

应用通过感染、劫持、篡改、删除、终止进程等手段,导致移动终端或其它非恶意软件部分或全部功能、用户文件等无法正常使用;干扰、破坏、阻断移动通信网络、网络服务或其它合法业务正常运行。包括但不限于:

  • 导致移动终端硬件无法正常工作(黑屏、耗电异常等)
  • 导致移动终端操作系统无法正常运行(系统重启、无响应等)
  • 导致移动终端其它非恶意软件无法正常运行
  • 导致运营商通信网络无法正常工作
  • 在用户不知情或未授权的情况下,对系统设置进行修改(辅助功能、设备管理器、系统时间、系统角标等),导致用户无法再进行正常设置或运行正常功能
  • 在用户不知情或未授权的情况下,对用户文件、系统文件或其它非恶意软件进行病毒感染、劫持、篡改、删除、卸载、或限制运行等
  • 应用安装后无法卸载
  • 应用索取ROOT权限,或存在功能非ROOT手机无法使用的情况

十三、应用涉及诱骗欺诈

应用自动通过伪造、篡改、劫持短信、彩信、邮件、通讯录、通话记录、收藏夹、桌面等方式,诱骗用户,而达到不正当目的。包括但不限于:

  • 伪造、篡改、劫持短信,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持彩信,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持邮件,以诱骗用户,而达到不正当目的
  • 伪造、篡改通讯录,以诱骗用户,而达到不正当目的
  • 伪造、篡改收藏夹,以诱骗用户,而达到不正当目的
  • 伪造、篡改通讯记录,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持用户文件,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持用户网络交易数据,以诱骗用户,而达到不正当目的
  • 冒充国家机关、金融机构、移动终端厂商、运营商或其它机构和个人,以诱骗用户,而达到不正当目的
  • 伪造事实,诱骗用户退出、关闭、卸载、禁用或限制使用其它合法产品或退订服务

十四、应用存在流氓行为

应用执行后对系统没有直接损害,也不对用户个人信息、资费造成侵害的其它恶意行为统称为流氓行为。危险后果主要表现为,间接的对用户手机造成影响,使用户不能方便的使用手机,给用户手机带来安全隐患等。包括但不限于:

  • 应用存在模仿系统通知或警告的广告行为
  • 应用存在影响正常功能使用的广告(频繁弹出、弹出但无法立即关闭、弹框占屏幕50%以上且无法立即关闭等)
  • 在用户不知情或未授权的情况下,长期占用移动终端中央处理器计算资源
  • 在用户不知情或未授权的情况下,自动捆绑安装
  • 激活设备管理器,在用户不知情或未授权的情况下,删除或修改备份用户数据
  • 应用存在强制用户下载应用获取积分等行为
  • 在用户不知情或未授权的情况下,长期驻留系统内存
  • 在用户不知情或未授权的情况下,自动添加、修改、删除收藏夹、快捷方式
  • 导致用户按 back 键无法正常退出程序
  • 在应用内部,通过非强制下载但无下载过程、无法终止的方式下载推荐第三方应用

十五、应用功能存在问题及性能能耗不达标

应用功能存在问题,或在未经授权的情况下严重损害用户在终端设备上的使用体验。包括但不限于以下情况:

  • 应用频繁出现崩溃、闪退、停止运行、冻结等非正常运行现象
  • 应用无法正常安装、启动、升级、卸载
  • 应用的功能失效,或点击后无响应,或程序本身存在错误
  • 应用的分辨率适配未达标,导致画面失真、模糊或像素化
  • 支持横竖屏方向的应用,在两种方向所展现的功能不等同
  • 支持帐户登录功能的应用无法正常帐户登录
  • 应用在小米终端上,给系统造成重启、死机等,导致不能正常使用的影响
  • 应用的版本不是最新稳定版本,或低于小米应用商店检测到的同包名应用版本
  • 应用在冷启动时,加载时间超过1000毫秒,且未向用户提供响应反馈(进度提醒或同类提示信息)
  • 应用在热启动时,加载时间超过500毫秒,且未向用户提供响应反馈(进度提醒或同类提示信息)
  • 应用在页面跳转、功能切换等情况时, 加载时间超过600毫秒
  • 应用运行时占用CPU过高或者异常,导致小米终端卡顿、ANR现象
  • 应用运行时占用内存过高或者异常,导致小米终端卡顿、ANR现象
  • 同等条件下,应用的前后台功耗指标超过其行业同类应用平均水平的5%
  • 除用户主动选择的业务,开启与业务无关的设备资源
  • 应用进入后台后,仍有服务在运行(该服务与用户正在使用的应用功能相关,且是必要服务的不受此限制)
  • 应用进入后台后,未经用户选择,私自启动
  • 应用进入后台后,有持锁行为
  • 应用进入后台后,占用设备资源(比如,无线网络,摄像头等)
  • 应用进入后台后,伪装成前台应用
  • 应用存在菜单功能、付款功能、音视频播放等问题
  • 应用下载后无法正常使用,存在停止运营、闪退、黑白屏、花屏、安装失败等严重影响用户使用的问题
  • APP不维护、无网络连接、无内容完全无法使用等

十六、应用传播或分发其他风险应用

应用存在下载、安装风险应用的代码或者传播和分发《本标准》规定的风险应用类别。包括但不限于:

  • 应用已经含有风险应用
  • 包含可以下载、安装风险应用的代码

十七、应用涉及违规热更新

应用修改代码进行迭代后,被检测为《本标准》规定的风险应用类别。

若第三方应用属于《本标准》规定的风险应用类别,小米将在用户下载、安装、使用应用的过程中,视检测情况和风险严重程度采取包括不限于以下措施,以保障用户安全:

  • 进行风险提示和安全引导
  • 安装需通过小米账号、锁屏密码、指纹等方式验证
  • 收回应用权限使用权
  • 禁止安装或使用应用
  • 下架应用
  • 提示用户进行应用卸载

小米开发平台风险应用审查标准

小米开发平台风险应用审查标准

为保障外部来源的应用在小米终端设备上具备良好的使用体验,小米统一对第三方移动智能终端应用软件(下称“应用”)及其下载渠道(含提供应用下载功能的第三方应用)在小米终端设备上的应用下载、安装等行为进行检测和管理。根据《网络安全法》、《互联网信息服务管理办法》、《移动智能终端应用软件预置和分发管理暂行规定》、《移动应用(APP)数据安全与个人信息保护白皮书》等法律法规、相关政策和通信行业标准,小米制定了《风险应用审查标准》(下称本标准),规定了风险应用类别,即存在下列行为的应用即为风险应用,可能会给用户的设备、数据、隐私或用户财产安全造成负面影响。

小米将通过安全中心内置的应用风险检测服务、用户举报、上架人工审核等渠道进行风险识别,在终端用户下载、安装应用的过程中,依据检测情况和风险严重程度进行相应的风险提示、安全引导、下载或安装限制、小米应用商店已检测版本安装提醒等操作。包括但不限于以下风险应用类别:

一、应用涉及政治敏感内容

应用内容涉及政治敏感、破坏社会稳定的信息。包括但不限于:

  • 对国家领导人诽谤、人身攻击或者侮辱性的内容
  • 含有关于宗教、种族、性取向、性别或其他目标群体的诽谤或恶意内容
  • 含有政治谣言、涉及反政府、反社会以及其他涉及政治敏感内容

二、应用涉及违禁品内容或违禁品交易

应用存在法律明确规定的违禁品内容或相关交易。包括但不限于:

  • 爆炸物品
  • 剧毒物品
  • 麻醉剂
  • 放射性物品
  • 香烟售卖
  • 枪支器械及其交易
  • 其他违禁品及其交易

三、应用涉及血腥暴力内容

应用含有血腥、暴力等引起用户不适的内容。包括但不限于:

  • 过分描述暴力
  • 对血腥场面过度展示
  • 含有虐待、侮辱性内容

四、应用涉及色情内容

应用包含色情内容或色情服务,如性器官的过分展示。包括但不限于:

  • 应用涉及色情内容
  • 允许应用使用者发布含有色情内容的文字、图片、视频、音频等
  • 应用内含有色情服务

五、应用涉及非法交易和非法金融行为

应用内含有法律违禁的交易和非法金融行为,包括但不限于:

  • 应用含有非法金融行为,包括但不限于违法私募基金、地下钱庄、高利贷、期货等
  • 应用含有非法金钱交易,包括但不限于违规销售彩票、赌博行为或其他法律禁止的金钱交易
  • 应用提供虚拟币交易或支付,包括但不限于如比特币、以太坊、其他虚拟币等

六、应用提供违规VPN服务

应用含违规支持境外软件访问的VPN相关功能,通过VPN功能导致违规内容传播。

七、应用存在病毒

应用内含有病毒等恶意代码,危害用户的安全。包括但不限于:

  • 木马
  • 蠕虫
  • 后门
  • 混合型恶意软件

八、应用涉及恶意扣费

在用户不知情或未授权的情况下,通过隐蔽执行、欺骗用户点击等手段,订购各类收费业务或使用移动终端支付。包括但不限于:

  • 在用户不知情或未授权的情况下,自动订购付费服务或者自动扣费
  • 应用通过非正常手段,如模拟系统窗口、替换按钮功能诱导用户点击、故意隐藏关键订购协议诱导用户同意付费等,直接进行扣费
  • 无二次确认的情况下,直接扣费
  • 诱导用户付费或者强制付费后未完整履行付费服务
  • APP造成用户财产损失且有持续、大范围扩散风险,且APP开发者不介入解决用户损失问题
  • 用户付费后未完整履行付费服务,或提供的付费服务与承诺存在偏差

九、应用隐私不合规

应用涉及在用户不知情或未授权的情况下侵犯个人隐私。包括但不限于:

  • 应用的隐私政策未向用户进行明示;
  • 应用的隐私政策未详细向用户说明,应用收集使用的个人信息目的、类型、方式
  • 应用内存在默认或强制用户同意隐私协议行为
  • 应用存在超范围收集个人信息及系统权限行为
  • 应用内强制用户授权,存在“不给权限不让用”的行为
  • 应用存在未用户同意收集个人信息行为
  • 应用实际收集使用个人信息行为与声明不一致
  • 应用未经用户同意向第三方企业提供个人信息
  • 应用未提供删除、更正或投诉举报的功能或渠道
  • 应用未提供有效的注销用户账号途径,或针对用户注销设置障碍
  • 应用存在强制收集用户个人信息,强迫用户使用定向推送功能

详情可参考:《应用隐私合规标准

十、应用含有恶意广告

应用以用户不希望的方式显示广告,包括损害或干扰设备功能的可用性,或在未经充分同意的情况下在触发应用环境之外的展示。包括但不限于:

  • 应用内广告不得频繁出现以弹窗、横幅、视频形式影响用户正常使用
  • 应用内广告需提供可关闭按钮,不得设置关闭障碍
  • 应用内广告不得欺骗误导用户,不得虚假宣传等诱导方式欺骗误导用户
  • 应用内广告不得存在“极限词”、涉黄等违反国家广告法相关内容
  • 应用广告不得抢占锁屏、桌面,影响用户正常使用

十一、应用涉及远程控制

应用在用户不知情或未授权的情况下,能够接受远程控制端指令并进行相关操作 ,具有远程控制属性。包括但不限于:

  • 在未经用户许可的情况下操作和篡改系统相关设置
  • 远程控制拍照录音上传

十二、应用存在系统破坏情况

应用通过感染、劫持、篡改、删除、终止进程等手段,导致移动终端或其它非恶意软件部分或全部功能、用户文件等无法正常使用;干扰、破坏、阻断移动通信网络、网络服务或其它合法业务正常运行。包括但不限于:

  • 导致移动终端硬件无法正常工作(黑屏、耗电异常等)
  • 导致移动终端操作系统无法正常运行(系统重启、无响应等)
  • 导致移动终端其它非恶意软件无法正常运行
  • 导致运营商通信网络无法正常工作
  • 在用户不知情或未授权的情况下,对系统设置进行修改(辅助功能、设备管理器、系统时间、系统角标等),导致用户无法再进行正常设置或运行正常功能
  • 在用户不知情或未授权的情况下,对用户文件、系统文件或其它非恶意软件进行病毒感染、劫持、篡改、删除、卸载、或限制运行等
  • 应用安装后无法卸载
  • 应用索取ROOT权限,或存在功能非ROOT手机无法使用的情况

十三、应用涉及诱骗欺诈

应用自动通过伪造、篡改、劫持短信、彩信、邮件、通讯录、通话记录、收藏夹、桌面等方式,诱骗用户,而达到不正当目的。包括但不限于:

  • 伪造、篡改、劫持短信,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持彩信,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持邮件,以诱骗用户,而达到不正当目的
  • 伪造、篡改通讯录,以诱骗用户,而达到不正当目的
  • 伪造、篡改收藏夹,以诱骗用户,而达到不正当目的
  • 伪造、篡改通讯记录,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持用户文件,以诱骗用户,而达到不正当目的
  • 伪造、篡改、劫持用户网络交易数据,以诱骗用户,而达到不正当目的
  • 冒充国家机关、金融机构、移动终端厂商、运营商或其它机构和个人,以诱骗用户,而达到不正当目的
  • 伪造事实,诱骗用户退出、关闭、卸载、禁用或限制使用其它合法产品或退订服务

十四、应用存在流氓行为

应用执行后对系统没有直接损害,也不对用户个人信息、资费造成侵害的其它恶意行为统称为流氓行为。危险后果主要表现为,间接的对用户手机造成影响,使用户不能方便的使用手机,给用户手机带来安全隐患等。包括但不限于:

  • 应用存在模仿系统通知或警告的广告行为
  • 应用存在影响正常功能使用的广告(频繁弹出、弹出但无法立即关闭、弹框占屏幕50%以上且无法立即关闭等)
  • 在用户不知情或未授权的情况下,长期占用移动终端中央处理器计算资源
  • 在用户不知情或未授权的情况下,自动捆绑安装
  • 激活设备管理器,在用户不知情或未授权的情况下,删除或修改备份用户数据
  • 应用存在强制用户下载应用获取积分等行为
  • 在用户不知情或未授权的情况下,长期驻留系统内存
  • 在用户不知情或未授权的情况下,自动添加、修改、删除收藏夹、快捷方式
  • 导致用户按 back 键无法正常退出程序
  • 在应用内部,通过非强制下载但无下载过程、无法终止的方式下载推荐第三方应用

十五、应用功能存在问题及性能能耗不达标

应用功能存在问题,或在未经授权的情况下严重损害用户在终端设备上的使用体验。包括但不限于以下情况:

  • 应用频繁出现崩溃、闪退、停止运行、冻结等非正常运行现象
  • 应用无法正常安装、启动、升级、卸载
  • 应用的功能失效,或点击后无响应,或程序本身存在错误
  • 应用的分辨率适配未达标,导致画面失真、模糊或像素化
  • 支持横竖屏方向的应用,在两种方向所展现的功能不等同
  • 支持帐户登录功能的应用无法正常帐户登录
  • 应用在小米终端上,给系统造成重启、死机等,导致不能正常使用的影响
  • 应用的版本不是最新稳定版本,或低于小米应用商店检测到的同包名应用版本
  • 应用在冷启动时,加载时间超过1000毫秒,且未向用户提供响应反馈(进度提醒或同类提示信息)
  • 应用在热启动时,加载时间超过500毫秒,且未向用户提供响应反馈(进度提醒或同类提示信息)
  • 应用在页面跳转、功能切换等情况时, 加载时间超过600毫秒
  • 应用运行时占用CPU过高或者异常,导致小米终端卡顿、ANR现象
  • 应用运行时占用内存过高或者异常,导致小米终端卡顿、ANR现象
  • 同等条件下,应用的前后台功耗指标超过其行业同类应用平均水平的5%
  • 除用户主动选择的业务,开启与业务无关的设备资源
  • 应用进入后台后,仍有服务在运行(该服务与用户正在使用的应用功能相关,且是必要服务的不受此限制)
  • 应用进入后台后,未经用户选择,私自启动
  • 应用进入后台后,有持锁行为
  • 应用进入后台后,占用设备资源(比如,无线网络,摄像头等)
  • 应用进入后台后,伪装成前台应用
  • 应用存在菜单功能、付款功能、音视频播放等问题
  • 应用下载后无法正常使用,存在停止运营、闪退、黑白屏、花屏、安装失败等严重影响用户使用的问题
  • APP不维护、无网络连接、无内容完全无法使用等

十六、应用传播或分发其他风险应用

应用存在下载、安装风险应用的代码或者传播和分发《本标准》规定的风险应用类别。包括但不限于:

  • 应用已经含有风险应用
  • 包含可以下载、安装风险应用的代码

十七、应用涉及违规热更新

应用修改代码进行迭代后,被检测为《本标准》规定的风险应用类别。

若第三方应用属于《本标准》规定的风险应用类别,小米将在用户下载、安装、使用应用的过程中,视检测情况和风险严重程度采取包括不限于以下措施,以保障用户安全:

  • 进行风险提示和安全引导
  • 安装需通过小米账号、锁屏密码、指纹等方式验证
  • 收回应用权限使用权
  • 禁止安装或使用应用
  • 下架应用
  • 提示用户进行应用卸载

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

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

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

一、相关内容须知

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

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

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

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

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

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

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

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

二、免责承诺函提交方法

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

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

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

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

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

承诺函-理财类.docx

承诺函-医疗类.docx

承诺函-盲盒类.docx

承诺函通用版本.docx

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

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

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复测入口)

小米开发平台 应用下架、删除操作指南

小米开发平台 应用下架、删除操作指南

本文档介绍了应用删除下架适用范围和操作指南,您可在了解文档内容后,自行对名下应用进行下架删除。

应用下架、删除须知:

1、适用对象:

本操作流程只适用于应用,游戏如需下架删除,请联系mi-gamebd@xiaomi.com处理。

2、适用状态:

当您的应用处于上架状态,可申请应用下架。当您的应用申请下架后,或在未发布状态下,可以申请应用删除。

3、应用下架与应用删除的区别:

  • 应用下架:应用下架后仍存在后台的数据库中,只是未上线,其他开发者不能上传相同包名的应用且应用所在开发者账号不能上传同版本号的应用。
  • 应用删除:应用删除后会在开发者后台显示“未发布”字样,应用的数据会在开发者后台完全消失,在不更换包名的情况下重新创建应用并上线后,下载量、评分等数据可以自动恢复(暂不支持版本保存, 删除即为删除整个应用)。应用删除后包名仍会保留在该开发者账号上,若想在其他账号下新建,只能通过更换包名或认领操作。

4、应用删除与下架适用的场景:

  • 应用下架:适用于应用不再维护、出现BUG需要暂时下架、应用更换包名等。
  • 应用删除:适用于签名更换或丢失、版本回滚、targetSdkVersion降级等。

操作方法/路径

1、已上架应用下架

1.1 登录开发者站,点击应用管理,进入应用详情页,点击“申请下架”按钮;

1.2 进入应用下架详情页,填写下架原因,同时上传与开发者账号注册公司主体相同的营业执照,个人开发者上传手持个人身份证正面的照片或扫描件,确认信息无误后点击“提交审核”按钮。

1.3 提交成功后,应用状态将变更为“下架申请审核中”,我们的审核人员会在1-3个工作日内审核完毕,您可以在开发者站查看审核结果,同时也会将审核结果邮件至您的开发者账号注册邮箱及联系邮箱中。

注:应用下架后如果需重新上架,可参考应用更新、修改操作指南的流程。

2、已下架应用删除

2.1 进入应用详情页,选择需要删除的应用,点击“删除应用”按钮。

2.2 点击后,会跳出“提示”弹框,请仔细阅读弹框内容,确认无误后,点击“确认”按钮,即可删除应用。

注:应用删除后如果需再次上架,可参考应用创建操作指南重新创建。

3、未发布应用删除

3.1 进入应用详情页,选择“删除应用”按钮,后续流程如上方“已下架应用删除”,确认相关信息无误后,即可进行删除。

4、无法自行下架&删除

如果开发者无法自行下架或删除应用,请您先确认无法操作的原因,若原因为无法登陆开发者账号,请参考开发者账号资料修改操作指南文档找回您的账号。

以上是应用下架与删除的相关内容,如您仍有问题,可进入问题工单系统,与我们取得联系。

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

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

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

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 应用适配指南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提供方。

小米开发平台openGL ES glFinish使用规范

小米开发平台openGL ES glFinish使用规范

1.背景

在高通最新的平台上,为了进一步提升性能,启用了 CompressTexturesOnUpload 功能,如果应用不遵循 openGL glFinish 规范,会​进一步增加应用渲染数据出现异常的概率。

2.规范说明

应用在修改更新纹理后,openGL 规范要求应用程序执行完 glFinish 后, 其他地方才能去操作使用此纹理(注意高通平台目前只需要 glFlush, 但对于 openGL 规范,需要执行 glFinish,详见 OpenGL ES 3 specification section D “Propagating changes to objects”)。

3.案例分析

  • 美图秀秀相机预览人像扭曲
  • 美颜相机预览画面偏暗
  • 问题原因

应用的 thread 6 和 thread 7 共享 GL Context,然后 thread 6 对 thread 7 上传的纹理(texture13)进行采样,但是在 thread7 中,纹理更新时没有 进行 glFinish 或 glFlush,导致数据渲染出现问题。所以 thread7 应该在纹理更新后调用 glFinish 或 glFlush,然后 thread 6 再使用 texture13 来渲染。

小米开发平台应用删除前台服务通知导致的闪退问题说明

小米开发平台应用删除前台服务通知导致的闪退问题说明

  • 近期发现较多应用出现闪退现象,具体trace如下:
AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: Process: com.xxx.app, PID: 25339
AndroidRuntime: java.lang.SecurityException: Not allowed to delete channel XXX with a foreground service
AndroidRuntime:         at android.os.Parcel.createExceptionOrNull(Parcel.java:2376)
AndroidRuntime:         at android.os.Parcel.createException(Parcel.java:2360)
AndroidRuntime:         at android.os.Parcel.readException(Parcel.java:2343)
AndroidRuntime:         at android.os.Parcel.readException(Parcel.java:2285)
AndroidRuntime:         at android.app.INotificationManager$Stub$Proxy.deleteNotificationChannel(INotificationManager.java:4040)
AndroidRuntime:         at android.app.NotificationManager.deleteNotificationChannel(NotificationManager.java:909)
AndroidRuntime:         at androidx.core.app.NotificationManagerCompat.deleteNotificationChannel(SourceFile:2)
AndroidRuntime:         at com.gyf.cactus.ext.c$a.run(SourceFile:1)
AndroidRuntime:         at android.os.Handler.handleCallback(Handler.java:938)
AndroidRuntime:         at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime:         at android.os.Looper.loop(Looper.java:236)
AndroidRuntime:         at android.app.ActivityThread.main(ActivityThread.java:8142)
AndroidRuntime:         at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime:         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
AndroidRuntime:         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
AndroidRuntime: Caused by: android.os.RemoteException: Remote stack trace:
AndroidRuntime:         at com.android.server.notification.NotificationManagerService$10.enforceDeletingChannelHasNoFgService(NotificationManagerService.java:3427)
AndroidRuntime:         at com.android.server.notification.NotificationManagerService$10.deleteNotificationChannel(NotificationManagerService.java:3440)
AndroidRuntime:         at android.app.INotificationManager$Stub.onTransact(INotificationManager.java:1737)
AndroidRuntime:         at android.os.Binder.execTransactInternal(Binder.java:1160)
AndroidRuntime:         at android.os.Binder.execTransact(Binder.java:1129)
  • 原因是受Google的一笔安全校验Patch影响:https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java;l=3413
private void enforceDeletingChannelHasNoFgService(String pkg, int userId,
                String channelId) {
            if (mAmi.hasForegroundServiceNotification(pkg, userId, channelId)) {
                Slog.w(TAG, "Package u" + userId + "/" + pkg
                        + " may not delete notification channel '"
                        + channelId + "' with fg service");
                throw new SecurityException("Not allowed to delete channel " + channelId
                        + " with a foreground service");
            }
        }

也就是Google限制了存在前台服务时,不允许应用删除与前台服务绑定的channel。

以上,请开发者检查处理,感谢支持!

小米开发平台 应用频繁调用getSubscriberId/getDeviceId优化说明

应用频繁调用getSubscriberId/getDeviceId优化说明

getSubscriberId/getDeviceId返回null情况说明

Android 10隐私权变更应用无法通过以下方法获取设备标识符:

Build

getSerial()

TelephonyManager 

getImei()
getDeviceId()
getMeid()
getSimSerialNumber()
getSubscriberId()

具体参见:https://developer.android.com/about/versions/10/privacy/changes?hl=zh-cn

由于Android 10隐私权限变更导致应用无法获取设备标识符,应用无法获取设备标识符后一直频繁调用相关接口尝试获取,从而导致系统相关进程binder占满,引发一系列问题:如手机重启,应用黑屏卡顿等问题。因此建议App优化,不要频繁调用以上接口。

小米开发平台应用调用Camera预览效果适配说明

小米开发平台应用调用Camera预览效果适配说明

1.应用中拍摄或扫一扫功能预览页面出现拉伸现象

由于不同手机屏幕尺寸比例不尽相同,或许应用在调用Camera预览实现方法不标准或第三方SDK维护不及时,提供的预览窗口宽高比例和Camera输出图像的宽高比例不一致,以至于应用在使用拍摄或扫一扫功能时预览页面就可能出现拉伸现象。

在此建议应用开发者使用的预览窗口宽高比例和Camera输出图像的宽高比例尽量保持一致,这样预览显示的画面即可以正常显示。为了解决应用频繁适配工作,希望开发者参考标准的Camera预览使用示例实现功能。

2.Camera预览接口使用示例

2.1.获取Camera支持的预览图像输出分辨率

//Camera API1
Camera mCamera = Camera.open(cameraId);
List<Size> supportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes()
 
//Camera API2
Size[] supportedPreviewSizes = CameraManager.getCameraCharacteristics(cameraId).get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputSizes(klass)

2.2.根据预览窗口Surface的宽高来选取最佳Camera图像输出尺寸

  • Camera API1:
//获取预览窗口的宽高
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // We purposely disregard child measurements because act as a
    // wrapper to a SurfaceView that centers the camera preview instead
    // of stretching it.
    final int width = resolveSize(getSuggestedMinimumWidth(),
            widthMeasureSpec);
    final int height = resolveSize(getSuggestedMinimumHeight(),
            heightMeasureSpec);
    setMeasuredDimension(width, height);
 
    if (mSupportedPreviewSizes != null) {
        mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width,
                height);
    }
 
    if (mCamera != null) {
      Camera.Parameters parameters = mCamera.getParameters();
      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
 
      mCamera.setParameters(parameters);
    }
}
//得到最佳Camera图像输出尺寸
public Camera.Size getOptimalSize(@NonNull List<Camera.Size> sizes, int w, int h) {
    final double ASPECT_TOLERANCE = 0.1;
    double targetRatio = (double) w / h;
    Camera.Size optimalSize = null;
    double minDiff = Double.MAX_VALUE;
 
    int targetHeight = h;
 
    for (Camera.Size size : sizes) {
      double ratio = (double) size.width / size.height;
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
      if (Math.abs(size.height - targetHeight) < minDiff) {
        optimalSize = size;
        minDiff = Math.abs(size.height - targetHeight);
      }
    }
 
    if (optimalSize == null) {
      minDiff = Double.MAX_VALUE;
      for (Camera.Size size : sizes) {
        if (Math.abs(size.height - targetHeight) < minDiff) {
          optimalSize = size;
          minDiff = Math.abs(size.height - targetHeight);
        }
      }
    }
 
    return optimalSize;
  }

详细实现见:https://cs.android.com/android/platform/superproject/+/master:development/samples/HoneycombGallery/src/com/example/android/hcgallery/CameraFragment.java

  • Camera API2:
//获取预览窗口的宽高
private final TextureView.SurfaceTextureListener mSurfaceTextureListener
        = new TextureView.SurfaceTextureListener() {
 
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) {
        openCamera(width, height);
    }
 
    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) {
        configureTransform(width, height);
    }
 
    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) {
        return true;
    }
 
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture texture) {
    }
 
};
//得到最佳Camera图像输出尺寸
private static Size chooseOptimalSize(Size[] choices, int textureViewWidth,
        int textureViewHeight, int maxWidth, int maxHeight, Size aspectRatio) {
 
    // Collect the supported resolutions that are at least as big as the preview Surface
    List<Size> bigEnough = new ArrayList<>();
    // Collect the supported resolutions that are smaller than the preview Surface
    List<Size> notBigEnough = new ArrayList<>();
    int w = aspectRatio.getWidth();
    int h = aspectRatio.getHeight();
    for (Size option : choices) {
        if (option.getWidth() <= maxWidth && option.getHeight() <= maxHeight &&
                option.getHeight() == option.getWidth() * h / w) {
            if (option.getWidth() >= textureViewWidth &&
                option.getHeight() >= textureViewHeight) {
                bigEnough.add(option);
            } else {
                notBigEnough.add(option);
            }
        }
    }
 
    // Pick the smallest of those big enough. If there is no one big enough, pick the
    // largest of those not big enough.
    if (bigEnough.size() > 0) {
        return Collections.min(bigEnough, new CompareSizesByArea());
    } else if (notBigEnough.size() > 0) {
        return Collections.max(notBigEnough, new CompareSizesByArea());
    } else {
        Log.e(TAG, "Couldn't find any suitable preview size");
        return choices[0];
    }
}

详细实现见:https://cs.android.com/android/platform/superproject/+/master:development/samples/browseable/Camera2Basic/src/com.example.android.camera2basic/Camera2BasicFragment.java

2.3.将获取到的最佳图像输出尺寸设置到Camera

//Camera API1
mCameraParameters.setPreviewSize(size.getWidth(), size.getHeight())
 
//Camera API2
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight())