Instant App 常见问题官方指南 | Android 开发者 FAQ Vol.6

简介: 我们被大家的热情惊到了 —— 事实上我们发出上一篇 Instant App 的文章没几天就收到了一大堆问题。由于涉及到的类目太多,我们这里简单归纳了一下,方便大家查看。


我们被大家的热情惊到了 —— 事实上我们发出上一篇 Instant App 的文章没几天就收到了一大堆问题。由于涉及到的类目太多,我们这里简单归纳了一下,方便大家查看。如果还有更多问题也请随时通过留言的方式与我们取得联系。



1. 基础类问题


Q: 哪些设备兼容 Android Instant App?

A: Android Instant App 在运行 Android 6.0(API 级别 23)或更高版本的设备上可用,此外还计划为 Android 5.0(API 级别 21)添加额外的支持。例如,现在您可以在 Google Pixel、Google Nexus、Samsung Galaxy S7 等人气设备上开发 Instant App。


Q: 哪些国家和地区支持 Android Instant App?

A: 您可以在支持页面中找到完整的支持国家和地区列表:

(https://support.google.com/googleplay/android-developer/answer/7381861#production)


Q: 开发者现在需要构建两套不同的 Android 应用吗?

A: 正相反,开发者只需使用一个源代码树维护一个项目即可。通过对项目进行配置,创造出两套架构工件:可安装版本和免安装版本。在可安装应用基础上添加免安装支持需要的工作量大小取决于可安装应用的当前架构。

* 请注意,免安装应用的版本号必须等于或小于上次发布的可安装应用版本。


Q: Instant App 都能使用什么 Android API 和功能?

A: Android Instant App 设计的目的是扩展现存 App 的使用场景,而非取代它们。所以Android Instant App 使用同样的 Android API,同样的项目,同样的源代码。当然,由于Android Instant App 的 “免安装” 特性,可能会无法符合用户针对 “已安装” 应用所抱有的一些期待。例如,免安装应用无法使用后台服务,无法激活后台通知,也无法使用设备唯一标识符。


Q: 用户可以选择永久安装应用吗?

A: 当然!开发者可以允许用户从 Google Play 安装应用。在安装完成后,当用户离开应用时,它仍会留在用户的手机上 —— 就和现在大家正在做的事情一样。 


Q: Android Instant App 的权限需求是怎样的?

A: Android Instant App 使用自 Android 6.0 (API 级别 23)以来采用的运行时权限。


Q: 免安装应用可以获取哪些权限?

A:免安装应用可以使用下列 Android 权限。没有出现在下方列表中的权限将无法在免安装应用中使用。

  • BILLING

  • ACCESS_COARSE_LOCATION

  • ACCESS_FINE_LOCATION

  • ACCESS_NETWORK_STATE

  • CAMERA

  • INSTANT_APP_FOREGROUND_SERVICE 仅限 Android O

  • INTERNET

  • READ_PHONE_NUMBERS 仅限 Android O

  • RECORD_AUDIO

  • VIBRATE


Q:免安装应用对网络访问有哪些限制?

A:来自免安装应用的一切网络流量均必须使用 HTTPS,不支持 HTTP。


Q:开发者要如何发布这些应用?

A:开发者需要经由 Google Play Console 发布免安装应用,这一点与现有的 Android 应用并无两样。想要了解更多信息,请参阅 “发布您的免安装应用” :

(https://support.google.com/googleplay/android-developer/answer/7381861)


Q:免安装应用必须使用 Smart Lock 么?

A:是的,我们规定在免安装中的登录体验必须使用 Smart Lock。想要进一步了解如何在应用中使用 Smart Lock,请参阅 “为您的 Android 密码使用 Smart Lock” :

(https://developers.google.cn/identity/smartlock-passwords/android/)


Q:我能不能在没有可安装版本 Android 应用的情况下实现一个免安装应用?

A:不能。您必须首先在 Google Play 中拥有一个该 App 的可安装版本。


Q:我们能在里面使用 WebP 图片格式吗?

A:当然可以,我们推荐使用 WebP 格式的图片。想要了解更多信息,请参阅 “如何缩减下载图片的大小” :

(https://developer.android.google.cn/topic/performance/network-xfer.html#webp)


Q:免安装应用在 Google 网页搜索中将会如何呈现?

A:免安装应用与可安装应用的搜索显示结果并无不同。在搜索结果中,免安装应用会显示出应用图标,如果该 URL 已与免安装应用相关联,则还会显示 “Instant” 标签,正如搜索结果中的可安装应用会在图标上显示 “Installed” 标签一样。


Q:我能使用 Android Instant App 的形式来承载我的游戏吗?

A:游戏是极为特别的一类应用,它们通常拥有独特的工具库和庞大的资产库,对性能表现的要求也很高。即使如此,我们对探索游戏用户的使用案例也充满兴趣。请前往 StackOverflow 浏览有关 Android Instant App 的帖子,不少人也在讨论这个话题。

2. 项目结构、功能和架构


Q:免安装应用和可安装应用是否拥有不同的 build.gradle 文件?

A:如果您的可安装应用和免安装应用来自同一个 Android Studio 项目,那么答案是肯定的,两种应用需要不同的 build.gradle 文件。您必须使用符合 com.android.application 构建规则的模块来构建您的可安装应用,而当您构建免安装应用时则需要使用符合 com.android.instantapp 构建规则的模块。想要了解更多信息,请参阅 “项目结构” :

(https://developer.android.google.cn/topic/instant-apps/getting-started/structure.html#structure_of_a_basic_instant_app)


Q:我能独立编译可安装与免安装应用吗?

A:正如上面 “项目结构” 中所展示的那样,我们推荐采用的工程结构应该优先将独立的功能封装成模块,这样可安装应用和免安装应用都可以依赖这些库模块。如果您遵循我们推荐的工程结构,您就可以独立编译每个功能而不涉及其他。


Q:我应该如何在免安装应用中的不同页面之间进行导航?

A:您可以通过进入一条目标页面的 URL 来导航过去。由于这个原因,免安装应用中的页面均需满足这个条件:可被 URL 寻址。想要了解更多如何让app页面可被 URL 寻址的内容,请参阅 “如何从 Google Play 请求功能” :

(https://developer.android.google.cn/topic/instant-apps/overview.html#play_store)

和 “实现应用链接” :

(https://developer.android.google.cn/topic/instant-apps/getting-started/index.html#app-links)


Q:我能在我的主应用里处理深度链接(Deep Link),然后再调用其他免安装应用的页面吗?

A:免安装应用需要在功能上实现模块化,通过主应用集中处理与此相矛盾。使用 App Link 即可进行您需要的链接跳转功能,同时保持免安装应用的模块化特性。


Q:我能在一个功能内包含多个页面吗?

A:您可以在一个功能内包含多个页面。但您需要留意的是,免安装应用下载有 4MB 的大小限制。同时,每个功能都需要用一个页面作为入口。


Q:我能在不同功能之间共享资源吗?

A:可以,基本功能(Base Feature)内的资源可以被所有功能分享。包含在附加功能之内的资源则只能被这个功能所使用。想要了解更多关于如何搭建您的项目资源,以及如何在不同功能之间共享资源,请参阅上面提到的 “项目结构”。

额外再说一点,您必须把位于附加功能和基本功能之间的资源 ID 区分开来。例如,如果您的基本功能提供了一个名为 R.id.feature_layout 的资源 ID,但您的附加功能却定义了另一个同 ID 资源,那么免安装应用就会使用来自基本功能的资源,而不会使用来自附加功能的资源。

此外,所有随着功能模块的产生而被引用的资源都必须在基本功能模块内出现。


Q:如果应用内有两个功能,它们是否会共享存储?

A:会,多个功能会在同一进程中运行,并共享应用上下文,只要它们属于同一个免安装应用。但是,免安装应用相较于可安装 APK 而言拥有一些限制。想要了解更多信息,请参阅 “了解受限和不受支持的功能” :

(https://developer.android.google.cn/topic/instant-apps/prepare.html#restricted)


Q:我能在同一页面内的 view-pager 中拥有多个分段(Fragment)吗?

A:可以,您能在单一页面中拥有多个分段,并在功能内定义与页面相关的分段。但请记住分段不能与深链接相关,并且不能独立于页面启动。


Q:免安装应用应该拥有独立的应用图标吗?

A:不,免安装应用和可安装应用应该使用同一个图标。可安装应用和免安装应用应该为用户提供一致的体验,因此它们应该使用同样的视觉元素(如图标)。

想要了解更多关于如何关联免安装应用和可安装应用的信息,请参阅 “同一个应用,安装前与安装后”:

(https://developer.android.google.cn/topic/instant-apps/ux-best-practices.html#instant-v-installed)


Q:我如何才能分辨出我的应用正在以可安装模式还是免安装模式运行?

A:您可以使用静态的 InstantApps.isInstantApp ( ) 方法。如果接受测试的进程属于一个免安装应用,这个方法的返回值将为 True 。


Q:我要如何鼓励用户从免安装应用中安装我的应用?

A:您可以使用静态的 InstantApps.showInstallPrompt ( ) 方法。这种方法会鼓励用户安装常规 APK 版本的应用。


Q:为各种功能使用的不同的 APK 会不会在 Google Play 里显示为不同的产品?

A:不会,免安装应用与可安装应用共享相同的包装名和产品列表。


Q:我在免安装应用内为功能命名时,会不会受到限制?

A:功能模块遵循 Java 命名规则。例如,您不能在功能名称中使用连字符。想要了解更多关于 Java 命名规则的内容,请参阅对应的 Java 文献:

(https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html)



3. Google 分析、Google Play 与部署


Q:我能让我的免安装应用只在限定的几个国家内发布吗?

A:免安装应用的使用范围限定于相应的可安装应用所在的国家和地区。在这些国家和地区的范围内,开发者可以选择在特定地区内发布自己的免安装应用。


Q:如果我想要通过 Google Play 在发布前测试我的免安装应用,我还需要首先发布可安装应用的 APK 吗?

A:想要通过 Google Play 在开发阶段测试您的免安装应用的部署情况,您就必须在 Google Play Console 中拥有 “草稿” 形式的可安装版本应用。

想要了解更多关于对您的免安装应用的进行部署,以及对其部署情况进行测试的信息,请参阅上面提到的 “发布您的免安装应用”。



4. 应用大小


Q:4MB 的总下载限制是什么意思?

A:免安装应用的大小(基本功能加上任何附带的附加功能)应该越小越好。您的应用越小,用户下载使用起来就越容易。但是,当您的免安装应用已经运行在用户的设备上时,您就可以使用用户的设备来下载并储存额外的数据。如果是用这种方式在用户的设备上使用数据,则不存在 4MB 的硬限制。

想要计算应用大小的话,只需解压免安装应用的 APK 并检查 APK 文件。您可以使用 APK 文件的磁盘容量,或是打开 APK Analyzer 并观察 Raw File Size 值。

对于那些拥有多个功能的免安装应用,您必须把基本功能 APK 的大小与单一功能 APK 合并计算。基本功能与单一功能 APK 文件大小之和必须小于 4MB


Q:用户每次下载同一个免安装应用时都需要下载基本功能 APK 和附加功能 APK 吗?

A:当用户首次下载免安装应用时,他们会下载基本功能和附加功能两个 APK。当用户请求其他功能的 APK 时,用户只会收到与所请求功能的 APK。在这种情况下,基本功能 APK 不需要被重复下载。

* 注意:系统会在垃圾整理期间根据需要清理免安装应用的缓存。如果手机重启,缓存会清空。如果免安装应用的缓存被清空,用户就必须重新下载基本功能的 APK。


Q:何时会触发 4MB 验证?

A:当您在制作阶段将免安装应用上传到 Google Play Console 时就会触发验证。



5. 应用链接、深链接与 URL 处理


Q:用户从一些应用点击链接时,链接并没有打开我的免安装应用,而是在应用内浏览器中打开了。有没有办法能保证用户被带到免安装应用里面去?

A:App Link 只是普通的 URL,所以应用可以强迫它们在应用内浏览器中打开。请考虑使用 Firebase Dynamic Links 来包装您的 URL,确保用户在点击您的链接时总能被带到您的免安装应用里去。


Q:我的主应用 manifest 里包括其他 URL 和其他 URL 域名,但我并不拥有这些域名。这样会产生什么后果?

A:很遗憾,如果一个 URL 的域名所有权未经确认,则会导致免安装应用发布失败。



6. 在设备上运行免安装应用


Q:用户能否放弃使用 Android Instant App?

A:能。用户在首次启动免安装应用时可以选择放弃。用户还可以选择打开 Settings 并点击 Google > Instant Apps 进行设置。


Q:两个免安装应用可以同时运行吗?

A:可以。免安装应用可以同时运行,用户可以在多个应用之间切换。只有位于前台的免安装应用会在通知栏内显示图标。


Q:用户能否在 “最近使用” 栏和设备主屏上结束和重启免安装应用的进程?

A:免安装应用可以从 “最近使用” 栏重启,用户还可以点击之前运行过的启动 URL 来重启应用。

当用户停止与免安装应用互动时,免安装应用的进程即被终止。但是,应用的内部存储,如 SQLite DB 还有共享偏好会保留下来。如果设备存储空间告急,免安装应用可能会被删除,它的内部存储也会一同被删除。虽然这种情况不太可能出现,但当它出现的时候还想恢复用户的使用状态和偏好信息的话,开发者需要从服务端解决。


Q:免安装应用能不能启动用户设备上安装的其他应用?

A:免安装应用可以通过发出隐式意图 (implicit intent) 来启动一个可安装应用,但无法使用显式意图 (explicit intent) 来启动大多数可安装应用。但可安装应用可选择对那些发出显式意图的免安装应用开放。


Q:如果用户安装了较旧版本的应用,并点击了与较新版本免安装应用相关联的 URL,会打开哪个应用?

A:可安装应用永远优先于免安装应用打开。


Q:用户如何接收我的免安装应用的最新版本? Google 会不会在用户的设备上自动对它进行更新?

A:最新版本的免安装应用将提供给新用户使用,现有用户的免安装应用缓存过期时,也会获取最新版本的应用。



以上就是这一次的 FAQ 内容。想要打造良好的免安装体验,请点击 “阅读原文” 进一步查阅我们的最佳案例。如果您手里已经有安装版本的应用,何不试试再进一步,让您的应用无需安装即可使用呢?

相关文章
|
7月前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
860 0
|
5月前
|
XML 自然语言处理 Android开发
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
【7月更文挑战第28天】在全球化背景下,实现Android应用的国际化与本地化至关重要 for 用户基础扩展。本文通过旅游指南App案例,介绍全攻略。步骤包括资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗及进行详尽测试。采用Android Studio支持,创建如`res/values-en/strings.xml`等多语言资源文件夹,使用灵活布局解决文本长度差异问题,并通过用户反馈迭代优化。最终,打造一款能无缝融入全球各地文化的App。
200 3
|
5月前
|
消息中间件 Android开发 开发者
🔍深度剖析Android内存泄漏,让你的App远离崩溃边缘,稳如老狗!🐶
【7月更文挑战第28天】在 Android 开发中,内存管理至关重要。内存泄漏可悄无声息地累积,最终导致应用崩溃或性能下滑。它通常由不正确地持有 Activity 或 Fragment 的引用引起。常见原因包括静态变量持有组件引用、非静态内部类误用、Handler 使用不当、资源未关闭及集合对象未清理。使用 Android Studio Profiler 和 LeakCanary 可检测泄漏,修复方法涉及使用弱引用、改用静态内部类、妥善管理 Handler 和及时释放资源。良好的内存管理是保证应用稳定性的基石。
87 4
|
5月前
|
存储 数据库 Android开发
🔥Android Jetpack全解析!拥抱Google官方库,让你的开发之旅更加顺畅无阻!🚀
【7月更文挑战第28天】在Android开发中追求高效稳定的路径?Android Jetpack作为Google官方库集合,是你的理想选择。它包含多个独立又协同工作的库,覆盖UI到安全性等多个领域,旨在减少样板代码,提高开发效率与应用质量。Jetpack核心组件如LiveData、ViewModel、Room等简化了数据绑定、状态保存及数据库操作。引入Jetpack只需在`build.gradle`中添加依赖。例如,使用Room进行数据库操作变得异常简单,从定义实体到实现CRUD操作,一切尽在掌握之中。拥抱Jetpack,提升开发效率,构建高质量应用!
71 4
|
5月前
|
XML 缓存 Android开发
🎯解锁Android性能优化秘籍!让你的App流畅如飞,用户爱不释手!🚀
【7月更文挑战第28天】在移动应用竞争中,性能是关键。掌握Android性能优化技巧对开发者至关重要。
45 2
|
4月前
|
安全 开发者 UED
欧盟新规:苹果App Store开发者需公开联系方式,透明度提升还是隐私挑战?
欧盟加强数字服务监管,苹果宣布自10月16日起,欧盟区App Store实施新规:开发者须公开联系方式,提升透明度。政策区分个人与公司开发者信息要求,旨在改善用户体验和服务质量,但引发隐私担忧。苹果需采取措施保护隐私,新规亦考验市场竞争与用户权益平衡。
55 0
|
6月前
|
ARouter IDE 开发工具
Android面试题之App的启动流程和启动速度优化
App启动流程概括: 当用户点击App图标,Launcher通过Binder IPC请求system_server启动Activity。system_server指示Zygote fork新进程,接着App进程向system_server申请启动Activity。经过Binder通信,Activity创建并回调生命周期方法。启动状态分为冷启动、温启动和热启动,其中冷启动耗时最长。优化技巧包括异步初始化、避免主线程I/O、类加载优化和简化布局。
83 3
Android面试题之App的启动流程和启动速度优化
|
5月前
|
Android开发
Android面试题经典之如何全局替换App的字体
在Android应用中替换字体有全局和局部方法。全局替换涉及在`Application`的`onCreate`中设置自定义字体,并创建新主题。局部替换则可在布局中通过`ResourcesCompat.getFont()`加载字体文件并应用于`TextView`。
80 2
|
6月前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
92 9
|
6月前
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
98 3