app制作难嘛?APP制作有没有大家都会准守的APP开发标准?

app制作难嘛?APP制作有没有大家都会准守的APP开发标准?

  移动应用应用现如今对于用户来看,不是什麽新鲜事了,人手一台智能手机,智

能手机装着主人各种各样日常移动应用应用,不过,对于一种即将给自己产品制作移动应用应用的企业来看,或者是从事移动应用应用制作的新手来看,必须的了解移动应用应用制作的标准流程,这样企业才能制作出自己满意的移动应用应用,从事移动应用制作的新手才能在职场得心应手。

  第一,做一款好的移动应用应用,是既要符合自己的产品,又要符合用户的体验。

所以,先要依据自己的行业、自己的产品,确认移动应用应用类型,移动应用应用要实现的效果,从而确认移动应用应用的功能。

  在移动应用应用功能以及类型确认后期,这个时候想要PM产品经理进行项目评审,PM产品经理要依据移动应用应用功能以及移动应用类型等商量好的因素,对移动应用应用功能、费用、工期等关键因素进行评审。

首先步确认一种项目初步的排期。

在一系列的准备工作做好后,想要向企业项目需求人交流认可。

认可后,就想要移动应用应用制作涉及到的各个岗位人工明确任务,设计部门想要研究UIUX和UE的,针对企业对移动应用应用的开展设计,做出初步的效果图,与企业确定。

  然后进入研发阶段,研发阶段是耗时最长的阶段,想要制作工程师和其他技术人工相互配合,不断调试,最终移动应用应用根本成型的时候,还想要测试人工进行移动应用测试,最终移动应用应用没有bug的时候。

就能够上报企业,等待企业确定。

  企业确定好后,移动应用想要依据访问数量,用户数量等数据,确认选用合适的服务器后就要app产品框架准备上架发布啦,服务器的选用也是非常关键的,服务器的质量直接会影响到移动应用应用用户的体验,好的服务器用户在使用移动应用应用时加载速度块,流畅性好,反之,服务器不好,移动应用应用会出现卡动,打不开页面等不好的体验。

  App应用由于分为ios版本和安卓版本,分别想要上架发布到苹果的移动应用 store和国内众多的安卓市场官方上,苹果的移动应用 store审核想要大概一周上下的时间,国内安卓各大官方通常审核大概想要三天上下的时间,假设移动应用上架发布时间已经确认了,这么就想要测试提前去完成,给上架发布预备时间。

将html页面封装app内意见只上架发布一些大官方即可,小官方移动应用应用市场会去大的移动应用应用市场去抓取,不必要大小官方亲自去传。

  上架发布各大官方的规则根本相当,各种所想要的资料,以及上架发布注意事项自己搭建app,各移动应用应用市场官方都会有相应提示。

按照诉求就可上架发布相应官方。

  更多移动应用应用制作消息,请关注www.yimenapp.com

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提供方。

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

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

3.1.1.3 豁免

系统会针对特定类型的应用提供几种级别的豁免,下面几部分将介绍这些豁免。

豁免针对的是应用而不是进程。如果系统豁免了应用中的一个进程,则该应用中的所有其他进程也会被豁免。注意

:即使是设备上预装的应用,也必须至少满足下面一个部分中的条件才能获得豁免。

a. 完全不会显示在 FGS 任务管理器中

以下应用可以运行前台服务,而完全不会显示在任务管理器中:

b. 免于被用户停止当以下类型的应用运行前台服务时,它们会显示在 FGS 任务管理器中,但应用名称旁边没有可以供用户按的停止按钮:

3.1.1.4 测试

如需测试应用在用户停止应用的过程中和之后的行为是否符合预期,请在终端窗口中运行以下 adb 命令:

adb shell cmd activity stop-app PACKAGE_NAME

3.1.2 使用 JobScheduler 改进预提取作业处理

利用 JobScheduler,应用可使用JobInfo.Builder.setPrefetch()将特定作业标记为“预提取”作业,这意味着,理想情况下这些作业应该在应用下一次启动前提前一点运行,以提升用户体验。过去,JobScheduler 仅使用该信号让预提取作业有机会使用免费或多余的数据。

在 Android 13 中,系统现在会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业。应用应尝试使用预提取作业来完成他们想要在下次应用启动前完成的任何工作。

3.1.2.1 代码示例
JobScheduler mJobScheduler = (JobScheduler) this.getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder mBuilder = new JobInfo.Builder(mJobId++, new ComponentName(this,MyJobService.class));
mBuilder.setPrefetch(true) //赋值为true
mJobScheduler.schedule(mBuilder.build());

3.1.3 电池资源利用率

Android 13 引入了以下省电措施:

  • 更新了有关系统何时将您的应用放入“受限”应用待机模式存储分区的规则
  • 对于您的应用在以下情况下可以执行的操作制定了新限制:用户因您应用的后台电池用量过高而将其置于“受限”状态。
  • 新增了系统通知,用于就后台电池用量过高长时间运行的前台服务向用户发出警告。
3.1.3.1 关于应用何时会进入“受限”应用待机模式存储分区的规则更新

除非您的应用符合豁免条件,否则当您的应用出现以下任何行为时,系统就会将其放入受限存储分区:

  • 用户有 8 天没有与您的应用互动。如果用户与另一个绑定到您应用的服务的应用互动,系统也会将您的应用视为“使用过”。

注意

:设备处于关闭状态的时间不会计入互动限制。

  • 您的应用在 24 小时内调用了过多的广播绑定
  • 您的应用在 24 小时内消耗了大量的设备电池电量。对于低 RAM 设备,此阈值可能会有所不同。

在衡量应用对设备电池续航时间的影响时,系统会考虑应用在几个不同方面执行的操作,包括:

  • 作业(包括加急作业)
  • 广播接收器
  • 后台服务
  • 系统是否已缓存应用的进程

用户互动可让您的应用退出“受限”存储分区:

当用户与您的应用互动时(包括通过以下几种方式互动),系统会将应用从受限存储分区中移出,并放入另一个应用待机模式存储分区

  • 用户点按您的应用发送的通知。

注意

:如果用户在不点按通知的情况下滑开通知,系统不会

将该操作视为与您的应用“互动”。

  • 用户在属于您应用的 widget 中执行操作。
  • 用户通过按媒体按钮影响您应用的前台服务。
  • 用户在与 Android Automotive OS 互动时连接到您的应用(您的应用在此过程中使用了前台服务或CONNECTION_TYPE_PROJECTION)。
  • 您的应用在画中画 (PiP) 模式下可见。
  • 您的应用是屏幕上当前运行的应用之一。(主要适用于大屏设备。)
3.1.3.2 关于受限后台电池用量的新限制

注意

:只有在您的应用以 Android 13 为目标平台时,此变更才会生效。

使用现有 Android 版本的用户能够调整应用在后台运行时可以执行的工作量。系统设置中的电池用量页面上会显示以下选项:

  • 无限制:允许后台工作,这可能会消耗更多电量。
  • 优化(默认):根据用户与应用互动的方式,优化应用执行后台工作的能力。
  • 受限:更注重延长设备的电池续航时间,而不是实现应用的全面功能。对于应用可以在后台执行的操作施加了更多限制。

注意

:如果用户在将您的应用置于“受限”状态之后启动了该应用,系统会暂时将该应用视为处于“优化”状态。当用户停止与您的应用互动并开始与另一个应用互动时,系统会将您的应用重新置于“受限”状态。

自 Android 9(API 级别 28)起,处于“受限”状态的应用具有以下限制:

  • 无法启动前台服务
  • 现有的前台服务会从前台移除
  • 不会触发闹钟
  • 不会执行作业

当您的应用以 Android 13 为目标平台时,除非应用因其他原因启动,否则系统不会传送以下任何广播:

  • BOOT_COMPLETED
  • LOCKED_BOOT_COMPLETED
3.1.3.3 与后台电池用量过高相关的系统通知

Android 13 引入了一个新的系统通知,当您的应用在 24 小时内消耗了大量设备电池电量时,就会显示该通知。这个新通知会针对搭载 Android 13 的设备上的所有应用显示,无论应用采用何种目标 SDK 版本都不例外。注意

:如果系统在应用显示与前台服务相关的通知时检测到应用的电池用量较高,系统会等到用户关闭通知,或前台服务完成,并且仅在您的应用继续消耗大量设备电池电量时才会显示该通知。

在衡量应用对设备电池续航时间的影响时,系统会考虑应用在几个不同方面执行的操作,包括:

如果针对您的应用显示了此通知,则至少在 24 小时后,才会再次在同一设备上显示该通知。

3.1.3.4 与长时间运行的前台服务相关的系统通知

如果系统检测到您的应用长时间运行某项前台服务(在 24 小时的时间段内至少运行 20 小时),便会发送通知邀请用户与前台服务 (FGS) 任务管理器互动。该通知包含以下内容:

 APP is running in the background for a long time. Tap to review.

注意

:如果系统针对您的应用显示了此通知,则至少在 30 天后才会再次显示类似通知。如果前台服务的类型为FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK或FOREGROUND_SERVICE_TYPE_LOCATION

,系统将不会显示此通知。

此外,如果您的应用在 24 小时内运行超过 4 小时的前台服务属于FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK或FOREGROUND_SERVICE_TYPE_LOCATION类型,则系统不会针对您的应用启动的任何前台服务发送长时间运行通知。

3.1.3.5 豁免

存在以下情况的应用不会受到 Android 13 中引入的任何省电措施的影响:

在以下情况下,您的应用可以免于进入“受限”应用待机模式存储分区,并可以绕过“8 天无活动”触发器:

在以下情况下,您的应用可以不受 Android 13 中引入的大多数省电措施的影响,但系统仍然会发送针对长时间运行的前台服务的通知

3.1.3.6 测试

以下几个部分将介绍几种测试 Android 13 中引入的省电措施会对应用产生何种影响的方式。

禁止在后台使用

如需禁止您的应用在后台运行,请在终端窗口中运行以下命令:

adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND deny

将应用放入受限存储分区

如需强制系统将您的应用放入受限存储分区,请在终端窗口中运行以下命令:

adb shell am set-standby-bucket PACKAGE_NAME restricted

3.2 行为变更:以Android 13为目标平台的应用

3.2.1 通知运行时权限

Android 13 中引入了新的运行时权限,用于从应用发送非豁免通知:POST_NOTIFICATIONS。此更改有助于用户专注于最重要的通知。

强烈建议您尽快以 Android 13 为目标平台,以获享此功能提供的额外控制和灵活性。如果您继续以 12L(API 级别 32)或更低版本为目标平台,您将失去在应用功能环境中请求权限

的机会。

应用的影响总结如下:

Target SDK应用权限弹窗临时授权
Android 13 pre新安装创建第一个通知渠道时
现有首次启动Activity一直有效,直到权限弹窗中明确选择
Android 13新安装应用自行控制
现有应用自行控制首次启动Activity为止
3.2.1.1 使用新权限

如需向应用请求新的通知权限,请将应用更新为以 Android 13 为目标平台,并完成与请求其他运行时权限类似的流程,如以下几个部分所述。需要在应用的清单文件中声明的权限会显示在以下代码段中:

<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>    <application ...>
        ...
    </application>
</manifest>
3.2.1.2 应用功能取决于用户在权限对话框中所做的选择

在此对话框中,用户可执行以下操作:

注意

:如果用户点按不允许

,即使仅点按一次,系统也不会再次提示用户,除非他们卸载并重新安装您的应用。

下面几个部分介绍了根据用户操作的不同,应用会有哪些不同的行为表现。

a. 用户选择“允许”如果用户选择允许选项,您的应用可以执行以下操作:

b. 用户选择“不允许”如果用户选择不允许选项,您的应用将无法发送通知。除了几个特定角色之外,所有通知渠道都会被屏蔽。这类似于用户在系统设置中手动关闭应用的所有通知后发生的行为。

c. 用户滑开对话框

如果用户滑开对话框(即他们既没有选择允许,也没有选择不允许),会发生以下行为:

3.2.1.3 对新安装的应用的影响

如果用户在搭载 Android 13 的设备上安装您的应用,应用的通知默认处于关闭状态。在您请求新的权限且用户向您的应用授予该权限之前,您的应用都将无法发送通知。

权限对话框的显示时间取决于应用的目标 SDK 版本:

  • 如果您的应用以 Android 13 或更高版本为目标平台,应用将可以完全自行控制权限对话框的显示时间。您可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。
  • 如果您的应用以 12L(API 级别 32)或更低版本为目标平台,系统会在您创建第一个通知渠道时显示权限对话框。这通常是在应用启动时。
3.2.1.4 对现有应用更新的影响

注意

:请考虑下面这种情形,即应用安装在搭载 12L 或更低版本的旧设备上,用户在该设备上允许接收通知,但想淘汰该设备。用户现在使用的是搭载 Android 13 的新设备,并通过备份和恢复功能恢复了应用。

在这种情况下,系统会将您的应用视为“现有应用”,因此该应用会获得发送通知的临时权限。

为最大限度地减少与新通知权限相关的中断,系统会自动向系统升级到 Android 13 之前用户设备上已安装的所有符合条件的应用临时授予新通知权限。此临时授权的持续时间取决于应用的目标 SDK 版本:

  • 如果应用以 Android 13 或更高版本为目标平台,则临时授权将持续到应用首次启动 activity 为止。

您的应用可以完全自行控制权限对话框的显示时间。您可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。

  • 如果您的应用以 12L 或更低版本为目标平台,则临时授权将一直有效,直到用户在通知权限运行时对话框中明确选择一个选项。也就是说,如果用户在未做出选择的情况下关闭了权限提示,系统会保留应用的临时授权。
3.2.1.5 获得临时授权的资格要求

您的应用要获得临时授权必须满足以下条件:应用必须已具有通知渠道,并且用户未在搭载 12L 或更低版本的设备上明确停用应用的通知。

如果用户在搭载 12L 或更低版本的设备上停用了应用的通知,当设备升级到 Android 13 或更高版本后,该停用会继续有效。

3.2.1.6 豁免

媒体会话有关的通知不受此行为变更的影响。

3.2.1.7 最佳做法

本部分将介绍几种在应用中最有效地使用新通知权限的方式。

a. 更新应用的目标 SDK 版本

为了让应用更灵活地显示权限对话框,请将应用更新为以 Android 13 为目标平台。

b. 等待一段时间再显示通知权限提示

等到用户熟悉您的应用之后,再请求他们授予任何权限。

新用户可能想要探索您的应用,并切身体会每项通知请求可以带来的好处。您可以通过用户操作触发权限提示。下面列举了几个适合显示通知权限提示的时机:

  • 用户点按“提醒铃铛”按钮时。
  • 用户选择关注他人的社交媒体帐号时。
  • 用户提交外卖订单时。

下图显示了请求通知权限的建议工作流程。或者,您也可以设置一个请求以在应用启动时显示,但仅在应用第 3 次或第 4 次启动后才显示。

c. 在上下文中请求权限

在应用内请求通知权限时,请在正确的上下文中请求,以便用户明确了解通知的用途以及应该选择接收通知的原因。例如,电子邮件应用可能包含为每封新邮件发送通知的选项,或仅为用户是唯一收件人的邮件发送通知的选项。

借此机会明确向用户表明您的意图,有助于鼓励用户向您的应用授予通知权限。

d. 检查您的应用能否发送通知

用户必须为您的应用启用通知,您的应用才能发送通知。要确认用户是否已启用通知,请调用areNotificationsEnabled()

e. 以负责任的方式使用权限

获得发送通知的许可后,请负责任地使用该权限。用户可以查看您的应用每天发送的通知数量,并且可以随时撤消该权限

3.2.2 针对附近 Wi-Fi 设备的新运行时权限

Android 13 引入了NEARBY_WIFI_DEVICES运行时权限,该权限属于NEARBY_DEVICES权限组,适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。借助此权限,您可以更轻松地说明应用为何访问附近的 Wi-Fi 设备;在以前的 Android 版本中,这类应用需要声明ACCESS_FINE_LOCATION权限。

如果您的应用以 Android 13 为目标平台并调用多个不同的 Wi-Fi API,则必须从用户处获得这项新权限。

如果您的应用尝试在未获得适当权限的情况下调用 Wi-Fi API,则会发生SecurityException

3.2.2.1 受影响的用例

这项新权限会影响几个不同的 Wi-Fi 用例,包括以下用例:

  • 查找或连接到附近的设备,如打印机或媒体投射设备。通过该工作流,您的应用可以完成以下类型的任务: 通过带外方式(例如通过 BLE)接收 AP 信息。
  • 使用仅限本地使用的热点,通过 Wi-Fi 感知和连接功能发现并连接到设备。
  • 通过 Wi-Fi 直连发现和连接到设备。
  • 发起与已知 SSID(例如汽车或智能家居设备)的连接。
  • 开启仅限本地使用的热点。
  • 连接到附近的 Wi-Fi 感知设备。
3.2.2.2 该权限属于“附近的设备”权限组

NEARBY_WIFI_DEVICES权限是附近的设备

权限组的一部分。此权限组在 Android 12(API 级别 31)中添加,还包含与蓝牙和超宽带相关的权限。如果您的应用请求此权限组中的多项权限,用户会看到一个运行时对话框,其中会请求用户批准您的应用访问附近的设备。在系统设置中,用户必须以组的形式启用和停用附近的设备权限;例如,针对给定应用,用户无法既停用其 Wi-Fi 访问权限,但又保持启用其蓝牙使用权限。

3.2.2.3 坚定地声明您的应用不会推导物理位置

在以 Android 13 为目标平台时,请考虑您的应用是否会通过 Wi-Fi API 推导物理位置;如果不会,则应坚定声明此情况。如需做出此声明,请在应用的清单文件usesPermissionFlags属性设为neverForLocation,如以下代码段所示。此过程类似于您声明绝不会将蓝牙设备信息用于获取位置信息时的过程:

<manifest ...>
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"                     android:usesPermissionFlags="neverForLocation" />    <application ...>
        ...
    </application>
</manifest>
3.2.2.4 保持后向兼容性

由于NEARBY_WIFI_DEVICES权限仅适用于 Android 13 或更高版本,因此您应保留对ACCESS_FINE_LOCATION的所有声明,以便在您的应用中提供向后兼容性。不过,只要您坚定声明应用不会使用 Wi-Fi API 推导物理位置信息,就可以将此权限的最高 SDK 版本设为32,如下以下代码段所示:

<manifest ...>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="32" />    <application ...>
        ...
    </application>
</manifest>
3.2.2.5 某些 API 仍需要位置信息权限

有几个 Wi-Fi API 仍然需要ACCESS_FINE_LOCATION权限才能获取位置信息,就像它们在 12L 及更低版本上的一样。示例包括WifiManager类中的以下方法:

3.2.2.6 检查需要新权限的 API

如果您的应用以 Android 13 或更高版本为目标平台,您必须声明NEARBY_WIFI_DEVICES权限才能调用以下任何 Wi-Fi API:

3.2.3 在后台使用身体传感器需要新的权限

Android 13 中引入了“在使用时”访问身体传感器(例如心率、体温和血氧饱和度)的概念。此访问模式与Android 10(API 级别 29)系统为位置信息引入的模式非常相似。

如果您的应用以 Android 13 为目标平台,并且在后台运行时需要访问身体传感器信息,那么除了现有的BODY_SENSORS权限外,您还必须声明新的BODY_SENSORS_BACKGROUND权限。注意

:这是受到“硬性限制”的权限,除非设备的安装程序针对您的应用将该权限列入了许可名单,否则您的应用将无法获得此权限。如需了解详情,请参阅有关受限权限的指南。

3.2.4 intent 过滤器会屏蔽不匹配的 intent

当您的应用向以 Android 13 或更高版本为目标平台的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的<intent-filter>元素匹配时,系统才会传送该 intent。换言之,系统会屏蔽所有不匹配的 intent,但以下情况除外:

  • 发送给其他应用的未声明任何 intent 过滤器的组件的 intent。
  • 发送给您应用中的其他组件的 intent。
  • 由系统发送的 intent。
  • 由具有根级特权的用户发送的 intent。

3.2.5 更安全地导出上下文注册的接收器

为了帮助提高运行时接收器的安全性,Android 13 允许您指定您应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。如果导出广播接收器,其他应用将可以向您的应用发送不受保护的广播。此导出配置在以 Android 13 或更高版本为目标平台的应用中可用,有助于防止一个主要的应用漏洞来源。

在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。

要实现此安全增强措施,请执行以下操作:

a. 启用DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED兼容性框架更改。

b. 在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播,如以下代码段所示:

// This broadcast receiver should be able to receive broadcasts from other apps.
// This option causes the same behavior as setting the broadcast receiver's
// "exported" attribute to true in your app's manifest.
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
    RECEIVER_EXPORTED);
// For app safety reasons, this private broadcast receiver should **NOT**
// be able to receive broadcasts from other apps.
context.registerReceiver(privateBroadcastReceiver, intentFilter,
    RECEIVER_NOT_EXPORTED);

注意

:如果启用了DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED

兼容性框架更改,则必须

为每个广播接收器指定RECEIVER_EXPORTED或RECEIVER_NOT_EXPORTED。否则,当您尝试注册广播接收器时,系统会抛出SecurityException

为了帮助检测这种情况,Android Studio 将会采用一个 lint 规则,而即将发布的ContextCompat将会检查接收器配置是否正确。

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

2.新功能和API

2.1 照片选择器

Android 13 包含对新照片选择器工具的支持。此工具为用户提供了一种安全的内置媒体文件选择方式,让其无需向应用授予对整个媒体库的访问权限。注意

:即将发布的 Google Play 系统更新预计会包含与照片选择器有关的新功能。在一项此类更新中,该库将增加对以 Android 11(API 级别 30)或更高版本为目标平台的应用(不包括 Android Go 设备)的支持。

2.1.1 选择媒体

照片选择器提供了一个可浏览、可搜索的界面,其中按日期(从最近到最早)顺序向用户呈现其媒体库中的文件。您可以指定用户只能看到照片或只能看到视频,并且默认情况下,允许的媒体选择量上限设置为 1。

2.1.2 定义分享限制

应用可以声明android.provider.extra.PICK_IMAGES_MAX的值,该值表示在向用户显示时照片选择器中显示的媒体文件数量上限。例如,如果您提示用户为其帐号选择要求的个人资料照片,请将一张照片设置为分享要求上限。注意

:如果您选择的上限为 1 张,照片选择器会以半屏模式打开。

如需在单选模式下启动照片选择器,请执行以下操作:

// Launches photo picker in single-select mode.
// This means that the user can select one photo or video.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
startActivityForResult(intent, PHOTO_PICKER_REQUEST_CODE);

2.1.3 选择多张照片或多个视频

如果应用的用例需要用户选择多张照片或多个视频,您可以使用EXTRA_PICK_IMAGES_MAX extra 指定照片选择器中应显示照片的数量上限,如以下代码段中所示:

// Launches photo picker in multi-select mode.
// This means that user can select multiple photos/videos, up to the limit
// specified by the app in the extra (10 in this example).
final int maxNumPhotosAndVideos = 10;
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxNumPhotosAndVideos);
startActivityForResult(intent, PHOTO_PICKER_MULTI_SELECT_REQUEST_CODE);

请注意,可指定为文件数量上限的最大数字存在平台限制。如需访问此限制,请调用MediaStore#getPickImagesMaxLimit()。

2.1.4 处理照片选择器结果

照片选择器启动后,使用新的ACTION_PICK_IMAGES intent 来处理结果。该选择器会返回一组 URI:

// onActivityResult() handles callbacks from the photo picker.
@Override
protected void onActivityResult(
    int requestCode, int resultCode, final Intent data) {
    if (resultCode != Activity.RESULT_OK) {
        // Handle error
        return;
    }
    switch(requestCode) {
        case REQUEST_PHOTO_PICKER_SINGLE_SELECT:
            // Get photo picker response for single select.
            Uri currentUri = data.getData();
            // Do stuff with the photo/video URI.
            return;
        case REQUEST_PHOTO_PICKER_MULTI_SELECT:
            // Get photo picker response for multi select
            for (int i = 0; i < data.getClipData().getItemCount(); i++) {
                Uri currentUri = data.getClipData().getItemAt(i).getUri();
                // Do stuff with each photo/video URI.
            }
            return;
    }
}

默认情况下,照片选择器会既显示照片又显示视频。您还可以在 setType() 方法中设置 MIME 类型,以便按“仅显示照片”或“仅显示视频”进行过滤。例如,如需在照片选择器中仅显示视频,请将video/*传入setType():

// Launches photo picker for videos only in single select mode.
Intent intent = new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.setType("video/*");
startActivityForResult(intent, );
// Apps can also change the mimeType to allow users to select
// images only - intent.setType("images/*");
// or a specific mimeType - intent.setType("image/gif");

注意:您的应用不能持续访问从此 intent 返回的 URI。当应用的进程结束后,该应用将无法访问 URI。

2.2 应用内语言选择器

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:

使用自定义应用内语言选择器的应用应当使用这些新 API,以确保无论用户通过何种方式选择其语言偏好设置,都能获得一致的用户体验。这些新的 API 还有助于减少样板代码的编写。

为了向后兼容以前的 Android 版本,我们还会从Appcompat 1.6.0-alpha01开始在 AndroidX 中提供这些 API。

  • 允许用户为每个应用选择首选语言的系统设置

不支持多种语言的应用不受这些变更的影响。

2.2.1 API 实现

对于当前未使用自定义应用内语言选择器的应用,无需执行任何其他操作。

对于具有或想要使用应用内语言选择器的应用,请使用这些新 API(而非应用的自定义逻辑)来处理相关设置和获取用户对应用的首选语言设置。

使用 AndroidX 支持库来实现

为了向后兼容以前的 Android 版本,建议使用 AndroidX 支持库来实现应用内语言选择器。使用Appcompat 1.6.0-alpha01或更高版本中提供的setApplicationLocales()方法。

例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:

LocaleListCompat appLocale = LocaleListCompat.forLanguageTags("xx-YY");
// Call this on the main thread as it may require Activity.restart()
AppCompatDelegate.setApplicationLocales(appLocale);

使用 Android 框架 API 来实现

您还可以通过setApplicationLocales()getApplicationLocales()方法,使用 Android 框架 API 来实现应用内语言选择器。

例如,如需设置用户的首选语言,您需要让用户在语言选择器中选择语言区域,然后在系统中设置该值:

// 1. Inside an activity, in-app language picker gets an input locale "xx-YY"
// 2. App calls the API to set its localem
Context.getSystemService(LocaleManager.class).setApplicationLocales(newLocaleList(Locale.forLanguageTag("xx-YY")));
// 3. The system updates the locale and restarts the app, including any configuration updates
// 4. The app is now displayed in "xx-YY" language

如需获取用户当前的首选语言以显示在语言选择器中,您的应用可以从系统中取回该值:

// 1. App calls the API to get the preferred locale
LocaleList currentAppLocales = mContext.getSystemService(LocaleManager.class).getApplicationLocales();
// 2. App uses the returned LocaleList to display languages to the user

2.2.2 面向用户的系统设置

用户可以通过新的系统设置为每个应用选择首选语言。他们可以通过以下两种方式访问这些设置:

  • 通过系统设置访问

设置 > 系统 > 语言和输入法 > 应用语言 >(选择应用)

  • 通过应用设置访问

设置 > 应用 >(选择一款应用)> 语言

已知问题

在测试应用时,有一些已知问题需要注意。

  • 可用语言列表中可能不包含您的应用支持的语言。
  • 如果您的应用使用拆分 APK,当应用语言区域发生变化时,系统不会自动下载这些 APK。
  • 现在的界面只是一个初步版本,在后续版本中会不断更改。

2.2.3 DEMO演示

2.3 可由开发者降级的权限

从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。

如需撤消特定运行时权限,请将该权限的名称传入revokeSelfPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入revokeSelfPermissionsOnKill()。撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。

系统只有在安全的情况下才会触发撤消操作。具体而言,当有应用组件仍在前台运行,或者有另一个应用正在访问您应用的组件(如 content provider)时,不会发生撤消。如果您想立即撤消权限,可以调用exit()。但是,对exit()进行此类调用可能会导致当前正在访问您应用的其他应用出现未定义的行为或崩溃。注意

:为了让系统设置表明您的应用不会访问特定权限组中的数据,您必须撤消该权限组中的所有

权限。在这种情况下,调用revokeSelfPermissionsOnKill()

会很有帮助。

2.4 可编程的着色器

Android 13 添加了对可编程RuntimeShader对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。改写自此GLSL 着色器的 AGSL 动画着色器:

基于可编程着色器实现的一个简单的绘制效果如下:

2.5 更快断字

断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您现在可以在TextView中启用断字功能,这几乎不影响渲染性能。如需启用更快断字功能,请在setHyphenationFrequency()中使用新的fullFastnormalFast频率。

2.5.1 API变化

Android 13在已有断字模式基础上新增两种Fast模式:fullFastnormalFast,在原有基础上测量更快。

2.5.2 使用建议

在布局中添加属性android:hyphenationFrequency:

<!--少量快速断字模式-->
<TextView android:hyphenationFrequency="fullFast"/>
<!--标准快速断字模式-->
<TextView android:hyphenationFrequency="normalFast"/>

代码中直接设置:

//标准快速断字模式
mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL_FAST)
//少量快速断字模式
mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL_FAST)

3.影响应用的行为变更

3.1 行为变更:所有应用

3.1.1 前台服务 (FGS) 任务管理器

无论应用采用何种目标 SDK 版本,Android 13 都允许用户从抽屉式通知栏中停止前台服务。这项新功能称为前台服务 (FGS) 任务管理器,它会显示当前正在运行前台服务的应用列表。此列表的标签为使用中的应用。每个应用旁边都有一个停止按钮。

下图说明了搭载 Android 13 的设备上的 FGS 任务管理器的工作流程:

3.1.1.1 用户操作会停止您的整个应用

当用户在 FGS 任务管理器中按您应用旁边的停止按钮时,系统会停止您的整个应用,而不仅仅是正在运行的前台服务。

比较“向上滑动”用户操作和“强行停止”用户操作的行为:

请参见下表中 FGS 任务管理器与现有功能的比较:从最近用过屏幕“向上滑动”和“强行停止”出现异常的应用

用户从 FGS 任务管理器停止应用时,不会发送任何回调。

当用户按停止按钮时,系统不会向您的应用发送任何回调。当应用启动备份时,建议您检查一下现有ApplicationExitInfoAPI 中的新REASON_USER_REQUESTED原因,这可能会很有帮助。

3.1.1.2 与长时间运行的前台服务相关的系统提示

如果系统检测到您的应用长时间运行某项前台服务(在 24 小时的时间段内至少运行 20 小时),便会发送通知邀请用户与 FGS 任务管理器互动。详细了解就长时间运行的前台服务提醒用户的新系统通知

Android 13 应用适配指南

1.获取Android 13

1.1 小米手机升级Android13

如果您已错过小米社区发布的关于MIUI基于Android 13的升级公开招募,可前往开发者内测申请权限,或请您联系自己公司商务或运营同学,联系我们,我们会为您开通有关权限并指导升级。

目前支持升级Android 13的MIUI开发版的机型有(有序更新中):

小米:小米12、小米12 Pro(高通平台)

Redmi: K50G(电竞版)、K40S、Note 11T Pro/Pro+

1.2 小米云测平台已上线

今年我们提供了足量的云测设备来供开发者适配,小米云测平台

提示:如果发现云测平台没有权限,可以通过小米云测平台权限申请

1.3 Google原生机升级Android 13

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

1.3 Android 模拟器

在 Android Studio 中,您可以按如下方式安装 Android 13 SDK:

  • 依次点击 Tools > SDK Manager。
  • 在“SDK Platforms”标签页中,选择 Android 13。
  • 在 SDK Tools 标签页中,选择 Android SDK Build-Tools 33。

点击OK安装 SDK。

如需访问 Android 13 API 并测试您的应用与 Android 13 的兼容性,请打开模块级build.gradle或build.gradle.kts文件,并使用 Android 13 所对应的值对它们进行更新:如何设置这些值的格式取决于您所使用的 Android Gradle 插件 (AGP) 版本。

注意:如果您尚未准备好完全支持 Android 13,您仍然可以使用可调试的应用、Android 13 设备和兼容性框架来执行应用兼容性测试,而无需更改应用以使其与预览版 SDK 兼容或以此为目标平台。

vivo Android 13应用适配指南

1. Android 13上的主要变更

1.1 兼容性

1.1.1 使用 JobScheduler 改进预提取作业处理

说明:利用 JobScheduler,应用可使用 JobInfo.Builder.setPrefetch() 将特定作业标记为“预提取”作业,这意味着,理想情况下这些作业应该在应用下一次启动前提前一点运行,以提升用户体验。过去,JobScheduler 仅使用该信号让预提取作业有机会使用免费或多余的数据。

在 Android 13 中,系统现在会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业。应用应尝试使用预提取作业来完成他们想要在下次应用启动前完成的任何工作。

影响范围:运行于Android 13上的所有应用。

1.1.2 停止使用共享用户 ID

说明:如果应用使用已废弃的 android:sharedUserId 属性,并且不再依赖于该属性的功能,可以将 android:sharedUserMaxSdkVersion 属性设置为 32。

这个新属性会告知系统,应用不再依赖于共享用户 ID。如果应用声明 android:sharedUserMaxSdkVersion 并且首次安装在搭载 Android 13 或更高版本的设备上,则应用的行为就像从未定义过 android:sharedUserId 一样,更新后的应用仍会使用现有的共享用户ID。

如果已在清单中定义了 android:sharedUserId 属性,请不要将其移除。这样做会导致应用更新失败。

共享用户 ID 会在软件包管理器中导致具有不确定性的行为。应用应使用适当的通信机制(例如服务和 content provider),在共享组件之间实现互操作性。

影响范围:运行于Android 13上的所有应用。

1.2 用户体验

每次Android系统的升级,几乎都会在交互体验上带来一些变化,此次Android 13也不例外。

1.2.1 前台服务(FGS)任务管理器

无论应用targetSdkVersion为多少,Android 13 都允许用户从抽屉式通知栏中停止前台服务。这项新功能称为前台服务 (FGS) 任务管理器,它会显示当前正在运行前台服务的应用列表。此列表的标签为使用中的应用,每个应用旁边都有一个停止按钮。

1.2.2 放置快捷设置图块API

借助新的图块放置API,应用现在可以提示用户直接将自定义图块添加到通知栏中的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。

1.2.3 按应用设置的语言偏好设置

在许多情况下,多语言用户会将其系统语言设置为某一种语言,但又想为特定应用选择其他语言。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:

1. 应用可在运行时在界面中设置使用其他语言

2. 用户可在系统设置里为每个应用选择首选语言

1.3 图形、图像和媒体

1.3.1 可编程的着色器

Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果、模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。

1.3.2 蓝牙低功耗音频

低功耗 (LE) 音频是新一代无线音频,旨在取代传统蓝牙并支持新的使用情形和连接拓扑。通过该技术,用户能够与朋友和家人分享音频内容以及播放音频给他们听,也可以订阅信息、娱乐或无障碍用途的公共广播内容。这项新技术可以确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换,这是传统蓝牙技术无法实现的。

1.4 安全性与隐私

1.4.1 通知运行时权限

说明:Android 13 中引入了新的运行时权限,用于从应用发送非豁免通知:POST_NOTIFICATIONS。

1. 限对话框中可执行以下操作:

 ●  选择“允许”

如果用户选择允许选项,应用可以执行以下操作:

①发送通知。可以使用所有通知渠道。

②发送与前台服务相关的通知。这些通知会显示在抽屉式通知栏中。

 ●  用户选择“不允许”

如果用户选择不允许选项,应用将无法发送通知。除了几个特定情况之外,所有通知渠道都会被屏蔽。这类似于用户在系统设置中手动关闭应用的所有通知后发生的行为。

 ●  用户滑开对话框

滑开对话框(即既没有选择允许,也没有选择不允许),会发生以下行为:

①如果应用符合获得临时通知授权的条件,系统会保留临时授权。

②如果应用没有临时授权,则将无法发送通知。

2. 安装的应用的影响

在搭载 Android 13 的设备上安装应用,应用的通知默认处于关闭状态。在请求新的权限且用户向应用授予该权限之前,应用都将无法发送通知。

权限对话框的显示时间取决于应用的目标 SDK 版本:

 ●  应用targetSdkVersion为33或者更高版本时,应用将可以完全自行控制权限对话框的显示时间。应用可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。

 ●  应用targetSdkVersion低于33时,系统会在应用创建第一个通知渠道时显示权限对话框。这通常是在应用启动时。

3. 对已安装应用的影响

为最大限度地减少与新通知权限相关的中断,系统会自动向系统升级前用户设备上已安装的所有符合条件的应用临时授予新通知权限。此临时授权的持续时间取决于应用的目标 SDK 版本:

 ●  如果应用targetSdkVersion为33或者更高版本时,则临时授权将持续到应用首次启动 activity 为止。

     应用可以完全自行控制权限对话框的显示时间。应用可以借此机会向用户说明应用需要此权限的原因,进而鼓励他们授予该权限。

 ●  如果应用targetSdkVersion低于33时,则临时授权将一直有效,直到用户在通知权限运行时对话框中明确选择一个选项。也就是说,如果用户在未做出选择的情况下关闭了权限提示,系统会保留应用的临时授权。

影响范围:运行于Android 13上的所有应用。

适配建议:

1. 更新应用的目标 SDK 版本。

2. 等待一段时间再显示通知权限提示。等到用户熟悉您的应用之后,再请求他们授予任何权限。新用户可能想要探索您的应用,并切身体会每项通知请求可以带来的好处。

3. 在上下文中请求权限。在应用内请求通知权限时,请在正确的上下文中请求,以便用户明确了解通知的用途以及应该选择接收通知的原因。

4. 检查您的应用能否发送通。用户必须为应用启用通知,应用才能发送通知。要确认用户是否已启用通知,请调用 areNotificationsEnabled()。

5. 以负责任的方式使用权限。获得发送通知的许可后,请负责任地使用该权限。用户可以查看您的应用每天发送的通知数量,并且可以随时撤消该权限。

1.4.2 针对附近 Wi-Fi 设备的新运行时权限

说明:在以前的 Android 版本中,用户需要向应用授予 ACCESS_FINE_LOCATION 权限,应用才能完成与热点相关的多个常见 Wi-Fi 用例、Wi-Fi 直连、Wi-Fi RTT 等。

由于用户很难将位置信息权限与 Wi-Fi 功能相关联,因此 Android 13 在 NEARBY_DEVICES 权限组中引入了新的运行时权限,适用于管理设备与附近 Wi-Fi 接入点连接情况的应用。此权限 (NEARBY_WIFI_DEVICES) 可满足这些 Wi-Fi 用例。

只要应用不会通过 Wi-Fi API 推导物理位置,那么当targetSdkVersion为33或更高版本的应用使用Wi-Fi API时,就可以请求 NEARBY_WIFI_DEVICES 而不是 ACCESS_FINE_LOCATION。

影响范围:targetSdkVersion为33的应用。

1.4.3 在后台使用身体传感器需要新的权限

说明:Android 13 中引入了“在使用时”访问身体传感器(例如心率、体温和血氧饱和度)的概念。如果应用targetSdkVersion为33并且在后台运行时需要访问身体传感器信息,那么除了现有的 BODY_SENSORS 权限外,还必须声明新的 BODY_SENSORS_BACKGROUND 权限。

影响范围:targetSdkVersion为33的应用。

1.4.4 intent 过滤器会屏蔽不匹配的 intent

说明:当应用向targetSdkVersion为33或更高版本的其他应用的导出组件发送 intent 时,仅当该 intent 与接收应用中的 <intent-filter> 元素匹配时,系统才会传送该 intent。系统会屏蔽所有不匹配的 intent,以下情况除外:

 ●  发送给其他应用的未声明任何 intent 过滤器的组件的 intent。

 ●  发送给应用中的其他组件的 intent。

 ●  由系统发送的 intent。

 ●  由具有根级特权的用户发送的 intent。

影响范围:targetSdkVersion为33的应用。

1.4.5 更安全地导出上下文注册的接收器

说明:为了帮助提高运行时接收器的安全性,Android 13 允许指定应用中的特定广播接收器是否应被导出以及是否对设备上的其他应用可见。如果导出广播接收器,其他应用将可以向应用发送不受保护的广播。

在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。要实现此安全增强措施,请执行以下操作:

 ●  启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改。

 ●  在应用的每个广播接收器中,明确指明其他应用是否可以向其发送广播。

注意:如果启用了 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED 兼容性框架更改,则必须为每个广播接收器指定 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。否则,当注册广播接收器时,系统会抛出 SecurityException。

影响范围:targetSdkVersion为33的应用。

1.4.6 可主动降级的权限

说明:从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。如需撤消特定运行时权限,请将该权限的名称传入 revokeOwnPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeOwnPermissionsOnKill()。撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。

系统只有在安全的情况下才会触发撤消操作。当有应用组件仍在前台运行,或者有另一个应用正在访问应用的组件时,不会发生撤消。如果想立即撤消权限,可以调用 exit()。但是,对 exit() 进行此类调用可能会导致当前正在访问应用的其他应用出现未定义的行为或崩溃。

1.4.7 使用精确闹钟的新权限

说明:应用可以使用自动授予应用的 USE_EXACT_ALARM 权限。不过,应用若要使用此权限,必须至少满足以下条件之一:

1.应用是闹钟应用或计时器应用。

2.应用是日历应用,可显示即将进行的活动的通知。

即将推出的 Google Play 政策会阻止应用使用 USE_EXACT_ALARM 权限,除非应用满足前面列表中显示的任一情况。

影响范围:targetSdkVersion为33的应用。

1.4.8 精细媒体权限

说明:如果应用以 Android 13 为目标平台,则必须请求一项或多项新权限,而不是 READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE 权限。

请求的权限集取决于您的应用需要访问的媒体类型:

媒体类型请求许可
图片和照片READ_MEDIA_IMAGES
视频READ_MEDIA_VIDEO
音频文件READ_MEDIA_AUDIO

如果用户之前授予应用READ_EXTERNAL_STORAGE权限,系统会自动将每个新权限授予您的应用。否则,当应用请求上表中显示的任何权限时,系统会显示一个面向用户的对话框。在下图 中,应用程序请求READ_MEDIA_AUDIO权限。如果同时请求 READ_MEDIA_IMAGES权限和READ_MEDIA_VIDEO权限,则只会出现一个系统权限对话框。

2. 参考链接

[1]Android 13开发者预览版:https://developer.android.com/about/versions/13/overview

vivo Android 13 开发者体验版

1、计划概览

欢迎加入vivo Android 13 开发者体验版,此计划将给开发者提供适配 Android 13系统的体验。

注:vivo Android 13 开发者体验版本仅面向开发者,极客用户,对于普通用户,我们强烈建议不要使用。

● 硬件和系统

开发者体验版本可以在iQOO 10、iQOO 10 Pro、X80 Pro设备系统上运行并体验。

● 开发和测试

如果您在vivo Android 13 开发者体验版本进行开发和测试工作, 您将可以针对新的软件变更测试您的应用,请参阅迁移指南,了解让应用与新平台兼容的简单步骤。更多详细的Android 13 相关的介绍,点击这里

感谢您加入vivo Android 13 开发者体验版!

2、获取vivo Android 13 开发者体验版

您可以通过如下方式下载使用iQOO 10、iQOO 10 Pro、X80 Pro设备的软件包固件,然后升级测试自己的应用。

注意:为避免在vivo设备上安装开发者体验版出现异常,升级前请务必先备份数据。

2.1 下载Android 13 开发者体验版

如下升级包下载链接:

设备下载链接MD5校验值
iQOO 10PD2217_A_13.1.7.10.W10.V000L1-update-full.zipd60e54b4ab3d3562f1a15f11d800f2c7
iQOO 10 ProPD2217_A_13.1.7.10.W10.V000L1-update-full.zipd60e54b4ab3d3562f1a15f11d800f2c7
X80 ProPD2185_A_13.0.12.6.W10.V000L1-update-full.zip594caad95190b4454b3237359186df26

2.2 升级Android 13 开发者体验版

您可以将下载到的开发者体验版本软件包固件,按照以下步骤,烧写到对应的vivo设备。手动烧写固件的步骤以X80 Pro为例,具体如下:

(1)下载X80 Pro开发者体验版本软件包固件。

(2)设备连接电脑后将手机USB设置切换到文件传输模式,将已下载好的软件包固件拷贝到X80 Pro手机存储根目录。

(3)按照以上步骤,在设置->系统升级->本地升级中点击升级包,待校验完成后开始升级。

(4)等待手机自动升级完成。

2.3 回退Android 13 开发者体验版

如果您已经手动升级到iQOO 10、iQOO 10 Pro、X80 Pro的开发者体验版,想对应降级到Android 12.0正常系统版本,请使用降级工具进行降级工作,具体请参考:

https://bbs.vivo.com.cn/newbbs/thread/32215628?show_title=1

3、反馈

如果您在使用中遇到严重问题,请进入对应的群进行反馈,群验证信息请填写手机的IMEI号

iQOO 10、iQOO 10 Pro QQ群 : 854374916

X80 Pro QQ群 : 759578505

4、Android 13 特性:

新增特性功能,包括但不限于:

  • 照片选择器

提供了一种更安全的媒体共享方式,而无需向应用授予整个媒体库的访问权限。

  • 控制中心

允许应用主动添加开关至控制中心,方便用户便捷地添加应用的控制中心开关。

  • 前台服务管理器

新增 前台服务管理功能,您可以通过控制中心查看运行中的前台服务及服务的运行时长,并随时停用前台服务。

5、已知问题

iQOO 10、iQOO 10 Pro:

1、当前系统版本有较多常用三方应用与 Android 13 不兼容,升级后可能会出现第三方应用无法正常使用的情况(如闪退、卡顿、黑屏、耗电等),建议您谨慎升级。

2、下拉状态栏,低概率背景透明,自动恢复。

3、健康APP概率定位异常,无法形成轨迹。

4、部分应用未同步深色模式。

X80 Pro:

1、当前系统版本有较多常用三方应用与 Android 13 不兼容,升级后可能会出现第三方应用无法正常使用的情况(如闪退、卡顿、黑屏、耗电等),建议您谨慎升级。

2、部分系统弹框主题样式不一致

3、分屏时,移动分屏,存在低概率性动画不连贯,出现黑屏

4、连续快速多次人像拍摄时,手机相机出现低概率的闪退

企业在开发APP之前如何选择好一个开发工具平台?

企业在开发APP之前如何选择好一个开发工具平台?

在现如今这个四G网络、智能手机多到烂大街的社会中,用户对移动应用客户端的使用量早已超越了传统的浏览器。

很多企业都看到了移动客户端不可估量的前景,深知它能为企业带来巨大的利润。

所以越来越多的企业愿意紧跟时代潮流,决定制作具有自身特色的移动应用。

但对于众多不具互联网背景的企业来看,自己制作移动应用是无可能的,盲目的尝试只会浪费更多的人力、物力和财力。

于是明智的企业选用与移动应用外包官方合作。

这样的合作是不可以免的,这么究竟怎么选用一种合适的移动应用外包官方呢?以下这两点是重中之重。

一.丰富的制作经验

第一企业在选用一种合适的移动应用外本地网页打包APK包开发公司前,必须了解该公司之前合作过的企业,另外制作移动客户端的案例。

这就相当于在评审该公司的制作能力能不能达到企业真正所想要的程度。

是因为企业真正需要的移动应用开发成功后,核心是为了使用,若是制成的移动应用推广后不便于使用,也不能带来效益,这么企业何必费尽心力开发一种无用的东西。

所谓“知己知彼,方能百战不胜”,先了解将要合作的移动应用外包开发公司过往做过的制作案例,然后依据自身的特点选用最合适的企业的制作团队,是企业选用合适的移动应用外包开发公司的首先步。

一门APP集标准化、专业化于一身,有着丰富的制作经验,制作过英特尔、春秋航空等众多知名企业的APP,在移动应用行业具有举足轻重的地位。

二.优秀的制作团队

当然选用了一家移动应用外包开发公司后,企业是想要与该公司保持长期的合作的。

从外包开发公司了解企wapapp业的构思和需求并为企业提供相应的案例到移动应用制作成功后的试用、培训与今后维护的整个过程中,与企业交流最多的并不是外包开发公司,而是该公司委派的专门性制作团队。

对于制作团队,我们想android apk h5要研究的是其制作经验、服务态度、创新能力。

经验丰富的制作团队能依据多年的经验和企业的现状了解客户真实的想要,并提出合理的制作意见,制定出可行性制作方式。

制作团队的服务态度将影响到客户体验,从前期的交流与沟通,到今后的维护都想要耐心的制作团队为客户提供优质的服务。

而创新能力对于一种制作团队来看,它是整个团队的灵魂,为满足不同类型客户的需求,在制作移动应用时除建立基础模块,还想要提供更为具特色与实用性的模块。

一门APP的制作团队有多年制作移动应用的经历,同时一门APP就这一方面,早已形成一套完整的定制体系,验收体

系,售后体系,可为有想要的客户提供一对一的客户服务。

应用商店不是移动应用推广的唯一渠道

在中国乃至亚洲,应用商店搜索和社交个人推荐是用户发现新移动应用的核心渠道。

在东南亚的一些国家,应用商店中的搜索下载排行对于用户的参考价值更是高于亲友之间的推荐。

基于这样的情况,大部分移动应用运营推广团队将预算投入到了应用商店的排名上。

虽然应用商店推广效果非凡,但逐渐高昂的价格也令移动应用运营者大呼吃不消。

其实应用商店推广并不是移动应用推广的唯一渠道。

例如被许多人视为已经过时的网页浏览器搜索,就是众多用户发现新移动应用的另一种有效渠道。

统计表明,至少二0%的亚洲移动应用用户会使用网页浏览器来搜索需要寻找的移动应用。

在制定移动应用推广渠道规划时,要认真思考目标用户发现移动应用的渠道接触点,然后有重点地挑选高性价比、高后续扩展性的渠道进行投放。

例如能够通过搜索引擎的覆盖展示移动应用的广告,利用搜索引擎的巨大流量入口来覆盖更多的用户。

还有,还能够采用浏览器加载广告来展现移动应用,这些都是应用商店之外的有效且性价比高的渠道。

应用商店之因此成为移动应用推广的主流,核心在于官方上聚集了最大量的需要寻找移动应用的用户。

但应用商店只能反映移动应用的下载量,对于后续的用户行为,如移动应用内购买,转发分享,推荐等行为无法直接推进。

而对于肩负收益变现任务的移动应用来看,获取新用户固然关键,找到并留住高价值的用户更关键。

运营者要把眼光放长远,在关注下载量之外要准确找到更多的目标用户。

需要找到关键的用户,首先步要定义好什麽样的行为在移动应用内是最富有价值的。

移动应用内付费购买固然关键,但这并不是运营者想要研究的唯一一个有价值行为。

例如对于电商移动应用来看,浏览特定的推荐商品是富有价值的行为;而换到游戏移动应用,在游戏中达到一定级别才是富有价值的行为;而对于社群移动应用来看,分享推荐是最富有价值的行为。

维持用户与移动应用之间一种较高的互动量,也是留住用户的关键手段。

移动应用想要在正确的时间覆盖正确的用户。

为了达到这一点,移动应用运营者一般会使用通知推送来维持用户对移动应用的关注。

不过这种推送在初期效果明显,随着时间的流逝效果会打折扣,这就想要运营者采用多种吸引用户注意的手段来联动,例如DSP定向广告等,在正确的时间、正确的场景吸引正确的用户留存。

      更多资讯,请关注:www.yimenapp.com/    

      提交App定制需求,了解报价和时间周期:https://app.yimenapp.com/index?uzchannel=五00

Android系统会向PC端衍生?Android 13系统居然支持桌面端排版

最近Android13系统推出了开发者版本,不少安卓Android资深开发者都下载体验尝鲜了,有一位非常特别的小伙伴居然在Android13开发模式下捣鼓出了桌面端系统才有的窗口排版样式,这实在令人很惊喜!

(图:Android 13桌面版窗口)

一看到这个图,是不是第一会想到这是一个电脑端才有的桌面窗口视窗,这完全就是一个PC视窗嘛!

嗯,获取在不久的将来Android 系统会真的支持电脑版桌面呢!

但是目前来看这只是开发版本安装到桌面电脑上才能调试出来的桌面自定义窗口,应该只是为了方便开发者在PC端查看和操作而已,并且仅仅停留在Android开发阶段而已。

如果您是Android开发者,赶快去官方下载Android开发版本体验尝鲜把!

Android 13新版功能尝鲜体验,快节奏的更新让人有点受不了啦

Android 13他来了,就问您香不香!

谷歌安卓系统这几年的更新速度实在有点让人受不了,感觉就是一下就更新了,一不高兴就更新了,更新太快了!

安卓app系统的快速更新可把国内的厂家给整不会了,以前咋们一个安卓系统内核可以使用5年,但是现在呢,半年就要更新了,以前厂家还可以深度定制UI,各种美观的,酷炫的UI,安卓系统内核不变,改动起来也还是挺不错的。但是现在就很苦恼了,动不动就系统级升级!

这节奏是要厂家跟不上,最终把低版本的定制,甚至深度定制的厂家系统给拖死!

(图:Android 13操作系统)

回到主题,我们先来尝鲜体验一下安卓13新系统的一些全新体验

首先是全新的媒体控件和全新输出选择器

(图:全新的媒体控件和全新输出选择器)

其次是全新的壁纸特效

(图:全新的壁纸特效)

最后是全新的前台任务管理器

(图:全新的前台任务管理器)

总体来说目前安卓13的新系统从视觉体验上已经越来越棒了,一些非常人性化的功能也在不断的更新迭代。做为安卓app开发者您可以从安卓官方站点获取到尝鲜体验包,有兴趣的小伙伴可以去试一试哦,记得带把梯子。

当然安卓APP13系统的正式发布还会有一段时间,对于普通用户来说咋们就坐着吃瓜呗,当娱乐了!