为了账号安全,请及时绑定邮箱和手机立即绑定

Android 即时功能:这种方法是否存在根本缺陷?

Android 即时功能:这种方法是否存在根本缺陷?

达令说 2021-12-30 20:54:47
在从 google gradle 插件 3.1.4 更新到现在最新的 3.2.1 之后,我试图让我的应用程序再次构建,我认为我首先让我的 Instantapp 工作的方法可能有问题,所以我发布此问题以丢弃或确认该问题,并在这种情况下要求采用不同的方法。简而言之,我的应用程序是一个在资产文件夹中有许多图形的游戏。为了使 Instantapp 符合 Google Play 规定的 10 MB 限制,我必须删除一些我在免安装版本中不需要的资产以及具有更高分辨率的资产,同时保留其余资产。此外, Instantapp 的代码与安装的代码略有不同,因此我覆盖了那里的一些方法和类。最小的 com.android.instantapp 模块似乎不能包含资产和代码,所以我创建了一个中间功能模块来保存这些。因此,经过一番努力(主要是使用 firebase 和 com.google.gms.google-services 插件)后,我想出了这种方法,最终在 3.1.4 版的 gradle 插件(com.android.tools.构建:gradle:3.1.4)唯一奇怪的是,我必须将标志“baseFeature”设置为 android_instant_feature 和 android_common 功能模块。但它奏效了,我终于可以发布我的游戏的即时版本,而安装的版本也继续构建得很好。现在,一旦我更新到 google gradle 插件的 3.2.1 版,即使我没有更改任何其他内容,问题也会开始。在对 gradle 脚本进行一些调整后,包括从 android_instant_feature 模块中删除 baseFeature true 标志,我得到了一个更简短的错误,但我真的不能说我是否比以前更好。错误是这样的:预期配置 ':android_instant_feature:debugFeatureCompileClasspath' 只包含一个文件,但是它不包含任何文件。现在我只是被挡在了这里,不知道该做什么或下一步该往哪里看,所以我想知道我的方法是否存在根本性的缺陷,因为我经过一些反复试验想出了它,但我没有确定没问题,在这种情况下,我可以使用哪种其他方法来满足我的要求和 Google 的要求,无论它们是什么。根据@TWL 的要求,这些是我用于这些模块的 Gradle 文件。我已经用 com.myapp.id 替换了真实的应用程序 ID,其余的正是我所拥有的,包括很多我认为与问题无关的 libGDX 内容,尽管我更愿意以准确性的名义将其留在那里
查看完整描述

1 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

感谢您提供 gradle 文件,看起来您的 gradle 依赖项被混淆了。


包含 的com.android.feature模块baseFeature true应该是其依赖项也包含application project()和 的模块feature project()。这是您错误的主要原因:


预期配置 ':___:debugFeatureCompileClasspath' 只包含一个文件,但它不包含任何文件。


因此,从您提供的内容来看,您的application project()和feature project()是分开的。


要解决此问题,您的“基础”android_common应该是:


application project(':android')

feature project(":android_instant_feature")

你的“非基本特征”android_instant_feature应该是:


implementation project(':android_common)

这不会改变您项目的整体结构。


您com.android.application将使用以下库进行编译:core和android_common.

您com.android.instantapp将使用免安装应用 apks:android_common.apk和android_instant_feature.apk.

现在,为什么它baseFeature以前使用 2x ?不知道,不应该...


曾经有一个页面 @ https://g.co/instantapps解释了免安装应用的结构,但您可以参考我之前的一篇文章,其中涉及概述和参考链接:如何访问来自另一个功能模块的活动


旁注:我注意到implementation project(":core")你的模块中有一个共同点(减去 Instantapp)。如果那纯粹是一个像 的库com.android.library,那么你不应该像那样设置它。您实际上可以将它放在您的基础中:api project(":core")并删除其他地方的所有其他引用。将它声明为api意味着任何也实现了基类的模块也将暴露于这个依赖项。(试试看,在一些罕见的情况下,这取决于您core拥有的其他库,但请尝试查看)。


查看完整回答
反对 回复 2021-12-30
  • 1 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号