本指南介绍如何将常见的 Android 库正确集成到您的插件项目中。遵循这些步骤可确保您的插件与最
当 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 |
任何依赖插件名称包含 `shared.android.support` 的库都是 Google 的 Android 支持库 的一部分。这些依赖插件封装了此处列出的相应组件,类似于将以下内容添加到项目 `build.gradle` 的 `dependencies` 块中:
compile 'com.android.support:[COMPONENT_NAME]:[VERSION_NUMBER]'
任何依赖插件名称包含 `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 服务时出现潜在的
请注意,基础逻辑层**不**考虑尝试连接到 Google Play 服务并使用 Google API 时可能发生的问题。它只会保证应用程序始终可以访问正确版本的 Google Play 服务 `.apk`。当您的插件需要连接到 Google Play 服务时,请务必遵循访问 Google API 和运行时权限指南。
要将基础逻辑层与 Solar2D Native 项目一起使用,您需要确定 Google Play 服务的哪些组件正在与<meta-data>
<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'`
<meta-data android:name="usesGooglePlayServicesComponentAds" android:value="true" />
要在 提交插件 时包含依赖插件,请在插件 `android/metadata.lua` 的
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)`
`compile 'com.android.support:cardview-v7:27.1.1'`
`build.gradle (Module: plugin)`
其他依赖插件可能需要额外的资源来进行测试。属于此类别的任何依赖插件都将在 Solar2D Native 发行文件中提供的插件压缩包中包含一个条目。对于具有此要求的依赖插件,请务必
包含名称与依赖插件相同的 `.jar` 文件。例如,`shared.google.play.services.base` 依赖插件包含一个 `shared.google.play.services.base.jar` 文件,该文件应包含在您的项目中。
将 `metadata.lua` 的 `manifest` 表的内容合并到您项目的 `AndroidManifest.xml` 中。需要合并的部分应包含一个注释,将其标识为依赖插件包名称的一部分,例如`-- For share-google-play-services-base package`
`-- From play-services-basement package`
`compile 'com.google.android.gms:play-services-base:15.0.1'`
`build.gradle (Module: app)`
的 `dependencies` 块时,这些部分将包含在已编译的应用程序中。将依赖插件包的任何资源添加到您的项目中。如果依赖插件在 `resources` 文件夹中包含多个包,请查找包含依赖插件包名称的 `package.txt` 文件,并将 `res` 文件夹的内容添加到您项目的 `res` 文件夹中。
正如您的插件可能依赖于依赖插件一样,依赖插件本身也可能依赖于其他依赖插件。以下流程图说明了依赖插件之间的链式关系:
使用依赖插件时,某些权限可能会自动添加到您的应用中。下表说明了为哪些依赖插件添加了哪些权限。
依赖插件 | 权限 |
---|---|
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"` |