其他分享
首页 > 其他分享> > 如何在Android内部共享使用即时运行时创建的拆分APK?

如何在Android内部共享使用即时运行时创建的拆分APK?

作者:互联网

背景

我有一个应用程序(here),除了其他功能,允许共享APK文件.

为了做到这一点,它通过访问packageInfo.applicationInfo.sourceDir(docs link here)的路径到达文件,并且只是共享文件(在需要时使用ContentProvider,因为我使用过here).

问题

这在大多数情况下都可以正常工作,尤其是从Play商店或独立的APK文件安装APK文件时,但是当我使用Android-Studio本身安装应用程序时,我在此路径上看到多个APK文件,而且没有一个是有效的,可以安装和运行没有任何问题.

在尝试“Alerter” github repo中的示例之后,这是此文件夹内容的屏幕截图:

enter image description here

我不确定这个问题何时开始,但至少在我的Nexus 5x和Android 7.1.2上确实发生过.也许甚至以前.

我发现了什么

这似乎只是因为在IDE上启用了即时运行这一事实,因此它可以帮助更新应用程序,而无需一起重新构建它:

enter image description here

禁用它后,我可以看到有一个APK,就像过去一样:

enter image description here

您可以在正确的APK和分割的APK之间看到文件大小的差异.

此外,似乎有一个API来获取所有分裂的APK的路径:

https://developer.android.com/reference/android/content/pm/ApplicationInfo.html#splitPublicSourceDirs

这个问题

分享APK的最简单方法是什么,必须分成多个?

真的需要以某种方式合并它们吗?

根据the docs,似乎有可能:

Full paths to zero or more split APKs that, when combined with the
base APK defined in sourceDir, form a complete application.

但是这样做的正确方法是什么,并且有一种快速有效的方法吗?也许没有真正创建文件?

是否有一个API可以从所有拆分的APK中获得合并的APK?或者也许这样的APK已经存在于其他路径中,并且不需要合并?

编辑:刚刚注意到,我尝试过的所有第三方应用程序都应该共享已安装的应用程序的APK,在这种情况下无法执行此操作.

解决方法:

我是Android Gradle插件的技术主管@Google,让我试着回答你的问题,假设我理解你的用例.

首先,一些用户提到您不应该共享启用InstantRun的构建,并且它们是正确的.基于应用程序的Instant Run构建是针对您部署到的当前设备/模拟器映像进行高度自定义的.所以基本上,假设你为运行21的特定设备生成了一个支持IR的应用程序版本,如果你尝试使用那些完全相同的APK,就会说运行23的设备会失败.如果有必要,我可以进行更深入的解释.足以说我们生成在android.jar中找到的API上定制的字节码(当然是特定于版本的).

因此,我不认为共享这些APK是有意义的,您应该使用IR禁用版本或发布版本.

现在有一些细节,每个切片APK包含1个dex文件,所以理论上,没有什么可以阻止你解压缩所有这些切片APK,把所有的dex文件重新填充到base.apk / rezip / resign它应该工作.但是,它仍然是一个支持IR的应用程序,因此它将启动小型服务器以侦听IDE请求等等……我无法想象这样做的一个很好的理由.

希望这可以帮助.

标签:android,apk,android-instant-run
来源: https://codeday.me/bug/20190930/1835050.html