准备你的应用(Android免安装应用)


最好的免安装应用体验专注于帮助用户快速完成任务(例如观看视频或进行购买).您可以开始使用此应用程序列表来准备Android免安装应用。这里的许多考虑被认为是Android应用程序的最佳做法.

从你的应用里删除无用的体积


去除所有的未知或未使用的权限,未使用的组件,不必要的第三方依赖关系和库删除这些items可以显着减少应用程序的大小,并显着提高性能。

有关如何识别应用程序清单中指定的权限的更多信息, 请查看<uses-permission> 和 App Manifest.

有关如何识别和删除应用程序中不需要的组件的更多信息, 请查看Reduce APK Size.

支持Android 应用Links


Android免安装应用对所有的导航都使用 URLs. 当用户点击您免安装应用的链接时,他们会转到您应用中的特定Activity. 如果链接失败或用户在不支持的设备上点击链接,浏览器将打开并显示你的网站. 此外,在免安装应用上activity无法直接启动另一个activity; 相反,它必须请求与该activity相对应的URL地址。

在你的免安装和可安装版本的应用上都必须实现Android 6.0中引入的Android 应用 Links功能。App Links提供了将URL连接到应用程序中的离散的activities的主要机制。建议你的应用支持www和非www域。要使用APP Links,请查看 Handling Android App Links.

此外,免安装应用无法直接在另一个功能中打开activity;相反,它必须请求与另一个其他功能的activity入口点相对应的URL地址。有关详细信息,请查看 Implement app links.

如有必要,重新构建你的应用程序


Android免安装应用需要模块结构化为4MB大小的URL-addressable 。对于应用程序大于4MB的,开发者必须将应用程序重构为更小的模块,可以根据URL导航独立下载和运行。开发者可以自由选择每个模块中包含的内容
,但建议将不同的用户流程隔离成不同的模块。这在流程中提供了快速和响应的体验,并且仅当用户切换流程时才下载附加模块。例如,在构建零售体验时,您可以将应用程序分为四个模块:浏览,搜索,项目详细信息和结帐,以允许用户根据需要在整个采购流程中下载模块。
.

从Android 6.0开始,实现运行时权限


Android免安装应用需要使用Android 6.0中引入的运行时权限runtime permissions(API级别23)。Android免安装应用框架可确保这些功能在早期版本的Android上正常工作。因此,请确保您的应用程序的目标是Android 6.0+,并使用运行时权限。

有关如何更新应用程序以使用Android 6.0权限以及如何在运行时请求权限的更多信息,请查看 Requesting Permissions at Run Time.

如果您的应用程序对用户进行身份验证,请执行智能密码锁


对于包含登录的免安装应用程序,开发人员必须集成Smart Lock(密码专用)。该功能允许用户使用其保存的凭据快速而安全的登录,并且在每次访问应用时保持登录状态。

有关如何在您的应用程序中实现 Smart Lock, 请查看 Smart Lock for Passwords on Android.

接受使用Google 支付 API付款


为了接受付款,Android免安装应用与实际商品和服务的Google Payment API兼容

实现Google 支付 API

Google 支付 API 表面上跟Android Pay类似。  PAYMENT_GATEWAY 令牌化类型是Android免安装应用必须的,目前,支持开发者使用 BraintreeStripe, or Vantiv处理支付。有了Google 支付 API,你的应用程序就可以从用户的谷歌账户中请求任何信用卡或借记卡,以及Android支付凭证。.

即使 Google 支付 API跟 Android Pay非常相似,这里有一些区别仍然需要记住:

  • 对于 Android Pay,你必须调用 Wallet.Payments.isReadyToPay() 来检测设备上Android Pay 是否可用。 Google 支付 API 不需要检测这个。你应该始终使用Google 支付 API 来请求付款凭证,而不管 Wallet.Payments.isReadyToPay() 返回的值如何。这是因为用户仍然可以使用信用卡或借记卡付款,即使他们还没有设置Android Pay。
  • 如果你正在使用Android Pay 在你的已安装的应用里,你可能正在使用 WalletFragment 这个类. 由于这是一个Android支付按钮,为了避免混淆,您必须用自己的“结账”、“买”、“购买”或其他按钮来替换它,以调用谷歌支付API。下面的代码显示了如何定义一个事件监听器来处理此类按钮的点击事件,并创建一个 MaskedWalletRequest
@Override
public void onClick(View view) {
    MaskedWalletRequest request = createMaskedWalletRequest(cartTotal);
    Wallet.Payments.loadMaskedWallet(mGoogleApiClient, request,
        REQUEST_CODE_MASKED_WALLET);
}

private MaskedWalletRequest createMaskedWalletRequest(String cartTotal) {

    // This creates parameters needed to work with the Stripe payment
    // processors. It is always best to check with your payment processor
    // (including stripe) to get the configuration that is required.
    //
    // Also note that PAYMENT_GATEWAY is required for the payment API and
    // the other option of NETWORK_TOKEN is not supported.
    PaymentMethodTokenizationParameters params =
            PaymentMethodTokenizationParameters.newBuilder()
                .setPaymentMethodTokenizationType(
                     PaymentMethodTokenizationType.PAYMENT_GATEWAY)
                .addParameter(“gateway”, stripe”)
                .addParameter(“stripe:publishableKey”, KEY)
                .addParameter(“stripe:version”, version)
                .build();

    // Convert our cart to a list of LineItem that is used to build
    // the MaskedWalletRequest. Note: Implementation not shown.
    List<LineItem> lineItems = buildLineItems();

    MaskedWalletRequest request = MaskedWalletRequest.newBuilder()
        .setMerchantName(YOUR_NAME_HERE)
        .setPhoneNumberRequired(true)
        .setShippingAddressRequired(true)
        .setCurrencyCode(“USD”)
        .setEstimatedTotalPrice(cartTotal)
        .setCart(Cart.newBuilder()
                     .setCurrencyCode(“USD”)
                     .setTotalPrice(cartTotal)
                     .setLineItems(lineItems)
                     .build())
        .setPaymentMethodTokenizationParameters(params)
        .build();
    return request;
}

更多关于实现 Android Pay的信息,请查看 Android Pay developers site.

为你的应用定义一个入口点


为了 Google Play 和 Android launcher 能够检测到你的app,你最少提供一个activity作为你的应用的入口点。在你的app的清单文件中,入口点的activity必须包括有 CATEGORY_LAUNCHER and ACTION_MAIN intents的 <intent-filter> 元素。

你的APP也必须定义了一个默认的URL。在与你的入门点activity相同的Android清单中,您可以通过添加具有值属性的 <meta-data> 元素来定义应用的默认URL,该属性提供可以有效处理的HTTPS URL。此外,此默认网址也必须是已安装的应用中 CATEGORY_LAUNCHER activity的intent filter的一部分。 

以下代码片段显示了一个Android清单,它定义了免安装应用的入门点activity和默认网址。

<activity
  android:name=".MainActivity">
    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter android:autoVerify="true">
      <action android:name="android.intent.action.VIEW" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.BROWSABLE" />
      <data android:scheme="http" />
      <data android:scheme="https" />
      <data android:host="example.com" />
    </intent-filter>
    <meta-data
      android:name="default-url"
      android:value="https://www.example.com/index.html" />
</activity>

识别测试兼容的库


没有在此列表的其他库没有经过测试和验证,是否与Android免安装应用程序兼容。

当调试没有在上述列表中的库的免安装应用程序时,可能会在调试输出中看到API_UNAVAILABLE 错误。API_UNAVAILABLE 错误表示该库尚未被批准在Android免安装应用中使用。

有关其他支持,请查看 Android Instant Apps posts on StackOverflow.

识别允许的隐式广播意图


免安装应用可以接收以下播放意图:

准备 Android O


从 Android O Developer Preview 2开始,Android O 镜像支持免安装应用开发。除了本页面和Android免安装应用文档中其他地方列出的其他要求外,您还必须执行以下操作来准备Android O免安装应用程序:

  • 你的免安装应用中所有声明的 intent filters 都必须支持HTTPS和HTTP协议
  • 所有声明的intent filters 都必须有 CATEGORY_BROWSABLE and CATEGORY_DEFAULT类别。
  • 所有声明的 web intent filters 都必须有 ACTION_VIEW 操作。
  • 你的应用程序的可安装版本必须是免费的,不能绑定到工作资料,不能被指定为子应用程序。
  • 您必须使用APKsignature scheme v2签署具有相同证书的免安装和可安装的应用。 

识别受限和不受支持的功能


用户可能期望安装的应用跟通过URL访问的应用不同 。因此,安装的应用的某些功能不适用于免安装应用。使用以下功能的开发人员必须重构其应用程序,将不支持的功能移动到单独的库模块中,以便仅包含在已安装的应用程序中。

处理额外的应用需求


除了本页面和Android 免安装应用文档中其他地方列出的其他要求之外,还必须执行以下操作来准备免安装应用程序:

  • 在你的免安装应用中声明的所有 intent filters 都必须支持 HTTPS and HTTP 协议。
  • 所有声明的intent filters都必须包含 CATEGORY_BROWSABLE and CATEGORY_DEFAULT类别。
  • 所有声明的 web intent filters 都必须包含 ACTION_VIEW 操作。
  • 您的应用程序的可安装版本必须是免费的,不能绑定到工作资料,并且不能被指定为子的应用程序。
  • 你必须使用APK signature scheme v2签署具有相同证书的 你的免安装应用和安装版应用


限制功能


  • 在用户不注意的情况下运行设备。提供前台服务。免安装应用程序只能通过支持 APP Links 启动activity,因此, services, content providers or broadcast receivers 将无法启动你的应用程序。
  • 免安装应用目前不支持推送通知。
  • 访问设备的外部存储。不过,免安装应用可以暂时使用APP私有的内部存储。
  • 发现设备上的已安装应用。除非已安装应用让它们被免安装应用发现。
  • 创建一个没有关联用户界面的activity。
  • 访问设备标识符:

    1. 免安装应用更持久(免安装应用停止后仍然持续的)。
    2. 用户无法重置的,包括版本序列号, Mac 地址, IMEI, IMSI。免安装应用可以访问广告ID.
  • 更改设备设置,比如更改设备的壁纸。

  • 运行未认证的代码, 运行任意的native代码或动态加载代码,而不是由免安装应用运行时提供的代码。

注意: 一个免安装应用不能使用替代方法绕过上述限制。不要尝试使用自定义API或设备制造商提供的功能。 Google 会移除违反这些限制的APP。

不支持的功能


  • 长时间运行的后台服务
  • 清单文件注册的广播
  • 外部可访问的content providers
  • 重新订阅的通知
  • Content providers

硬件加速


Android 免安装应用支持 OpenGL ES 2.0 ,但是,上下文共享组除外。支持一下扩展

  • GL_OES_texture_external
  • EGL_ANDROID_image_native_buffer
  • EGL_ANDROID_recordable
  • EGL_KHR_fence_sync


官方文档:https://developer.android.com/topic/instant-apps/prepare.html

猜你喜欢

转载自blog.csdn.net/ecliujianbo/article/details/77651263