Android 依赖项集成

本指南介绍如何将常见的 Android 库正确集成到您的插件项目中。遵循这些步骤可确保您的插件与最与 Corona 兼容的库版本一起使用,并保证您的插件与其他依赖于同一库的插件兼容。

背景

当 Corona 最初开放 Corona 市场 接受第三方内容时,插件开发者可以上传运行其插件所需的任何 .jar 文件。这导致提交的插件包含 Android 支持库Google Play 服务 的版本。这些 .jar 文件的版本通常是插件最初开发时可用的最新版本,但在发布插件的新版本时,它们通常不会更新。

实际上,由于插件内部存在不同版本的库,因此在需要例如 Google Play 服务 8.4 版的插件与需要 Google Play 服务 4.2 版的另一个插件之间会发生不兼容的情况。

依赖插件

在 Corona 中,**依赖插件**是特殊的插件,用于解决多个插件可能具有的依赖项之间的版本不兼容问题。它们包含 Corona 支持的特定库最新版本的所有资源,以及有助于集成和正确使用库的任何其他资源。

如果您的项目依赖于常见的 Android 库,例如 Android 支持库Google Play 服务,则需要包含一个依赖插件才能将该库合并到您的插件提交中。这是为了确保与可能依赖于这些库的其他插件兼容。

下表概述了 Corona 支持哪些库作为依赖插件。在开发满足上述条件的插件时,您应该针对依赖插件中封装的库版本对其进行测试。

依赖插件名称 版本
Android Support v4 shared.android.support.v4 27.1.1
Android Support v7 – AppCompat shared.android.support.v7.appcompat 27.1.1
Android Support v7 – CardView shared.android.support.v7.cardview 27.1.1
Android Support v7 – RecyclerView shared.android.support.v7.recyclerview 27.1.1
Google Actions, Base Client Library shared.google.play.services.base 15.0.1
Google Analytics(分析) shared.google.play.services.analytics 15.0.1
Google Cloud Messaging(云消息传递) shared.google.play.services.gcm 15.0.1
Google Drive(云端硬盘) shared.google.play.services.drive 15.0.1
Google Location(位置服务) shared.google.play.services.location 15.0.1
Google Mobile Ads (AdMob)(移动广告) shared.google.play.services.ads 15.0.1
Google Play Games Services(游戏服务) shared.google.play.services.games 15.0.1

Android 支持库

任何依赖插件名称包含 `shared.android.support` 的库都是 Google 的 Android 支持库 的一部分。这些依赖插件封装了此处列出的相应组件,类似于将以下内容添加到项目 `build.gradle` 的 `dependencies` 块中:

compile 'com.android.support:[COMPONENT_NAME]:[VERSION_NUMBER]'

Google Play 服务

任何依赖插件名称包含 `shared.google.play.services` 的库都是 Google Play 服务 的一部分。这些依赖插件封装了此处列出的相应组件,类似于将以下内容添加到项目 `build.gradle` 的 `dependencies` 块中:

compile 'com.google.android.gms:play-services-[COMPONENT_NAME]:[VERSION_NUMBER]'

基础逻辑层

`shared.google.play.services.base` 依赖插件还包括一个基础逻辑层,该层将检查设备上的环境是否安全,以便使用 Google Play 服务,并尝试解决使用 Google Play 服务 `apk` 的任何问题。这是为了遵循 Google 关于确保设备具有 Google Play 服务 APK准则。尝试通过显示警报或通知来解决问题,其中包含有关问题及其解决方法的上下文。通过警报,最终用户可以点击按钮并被带到设备上的其他位置来解决问题。通过通知,点击它将启动应用程序并显示具有类似上下文的警报。

行为变更

当包含 `shared.google.play.services.base` 依赖插件时,您的应用程序的 `main.lua` 将不会开始执行,直到最终用户解决任何使用 Google Play 服务的环境问题。如果在应用程序执行期间发生影响 Google Play 服务的环境更改(例如最终用户在其设备上禁用了 Google Play 服务),则最终用户将看到与应用程序初始启动时类似的警报或通知,在 `main.lua` 执行之前。

如果最终用户刚刚重新启用了 Google Play 服务,并且他们仍然需要下载 Google Play 服务的更新,则您的应用程序将显示一个警报,请求最终用户重新启动其设备。如果您的应用程序包含 `"android.permission.RECEIVE_BOOT_COMPLETED"` 权限,则严格强制执行此重新启动。在这种情况下,您的应用程序将无法绕过此警报,直到最终用户重新启动设备。如果您的应用程序**未**请求 `"android.permission.RECEIVE_BOOT_COMPLETED"` 权限,它将建议用户重新启动其设备,但无法强制执行。建议重新启动以避免 Google Play 商店在更新 Google Play 服务时出现潜在的DF-DLA-15错误。

限制

请注意,基础逻辑层**不**考虑尝试连接到 Google Play 服务并使用 Google API 时可能发生的问题。它只会保证应用程序始终可以访问正确版本的 Google Play 服务 `.apk`。当您的插件需要连接到 Google Play 服务时,请务必遵循访问 Google API运行时权限指南。

Solar2D Native 常见问题

要将基础逻辑层与 Solar2D Native 项目一起使用,您需要确定 Google Play 服务的哪些组件正在与<meta-data>标记一起使用,位于应用程序 `AndroidManifest.xml` 的 `<application>` 块中。这些标记用于标识可能需要额外处理的 Google Play 服务组件。这些<meta-data>标记的格式如下:

<meta-data android:name="usesGooglePlayServicesComponent[PascalCase_NAME_OF_COMPONENT]" android:value="true" />

在这里,`[PascalCase_NAME_OF_COMPONENT]` 对应于在项目 `build.gradle` 的 `dependencies` 块中指定的 `[COMPONENT_NAME]`。例如,如果 `build.gradle` 的 `dependencies` 块包含`compile 'com.google.android.gms:play-services-ads:15.0.1'`,则需要在 `AndroidManifest.xml` 的 `<application>` 块中包含以下内容:

<meta-data android:name="usesGooglePlayServicesComponentAds" android:value="true" />

包含依赖插件

要在 提交插件 时包含依赖插件,请在插件 `android/metadata.lua` 的`coronaManifest` → `dependencies`表中添加一个条目。

local metadata =
{
    plugin =
    {
        -- ...
    },
    coronaManifest = {
        dependencies = {
            ["shared.google.play.services.ads"] = "com.coronalabs",
        },
    },
}

return metadata
注意
  • 所有依赖插件的发布者 ID 都是 `"com.coronalabs"`,因此 `dependencies` 表中的条目应始终采用以下格式:`["DEPENDENCY_PLUGIN_NAME"] = "com.coronalabs",`.

  • 在 `dependencies` 表中包含一个依赖插件还将包含它具有的任何依赖项。有关更多信息,请参阅依赖插件链部分。

需要一个当前不支持的公共库?在提交插件时,请告知我们您正在使用的任何可能需要封装为依赖插件的公共库,例如Google Play 服务的其他组件。

针对依赖项进行测试

大多数依赖插件只是包装了可从Android SDK 管理器访问的库分发。在这种情况下,只需在插件的`build.gradle (Module: plugin)`文件的 `dependencies` 块中包含正确版本的库就足够了。例如,依赖于CardView库的插件可以通过添加`compile 'com.android.support:cardview-v7:27.1.1'``build.gradle (Module: plugin)`文件的 `dependencies` 块中进行准确测试。

其他依赖插件可能需要额外的资源来进行测试。属于此类别的任何依赖插件都将在 Solar2D Native 发行文件中提供的插件压缩包中包含一个条目。对于具有此要求的依赖插件,请务必

依赖插件链

正如您的插件可能依赖于依赖插件一样,依赖插件本身也可能依赖于其他依赖插件。以下流程图说明了依赖插件之间的链式关系:

依赖插件和权限

使用依赖插件时,某些权限可能会自动添加到您的应用中。下表说明了为哪些依赖插件添加了哪些权限。

依赖插件 权限
google.play.services.ads `"android.permission.ACCESS_NETWORK_STATE"`
`"android.permission.INTERNET"`
google.play.services.analytics `"android.permission.ACCESS_NETWORK_STATE"`
`"android.permission.INTERNET"`
`"android.permission.WAKE_LOCK"`
google.play.services.gcm `"com.google.android.c2dm.permission.RECEIVE"`
`"android.permission.INTERNET"`