如何在Android内部共享使用即时运行时创建的拆分APK?
作者:互联网
背景
我有一个应用程序(here),除了其他功能,允许共享APK文件.
为了做到这一点,它通过访问packageInfo.applicationInfo.sourceDir(docs link here)的路径到达文件,并且只是共享文件(在需要时使用ContentProvider,因为我使用过here).
问题
这在大多数情况下都可以正常工作,尤其是从Play商店或独立的APK文件安装APK文件时,但是当我使用Android-Studio本身安装应用程序时,我在此路径上看到多个APK文件,而且没有一个是有效的,可以安装和运行没有任何问题.
在尝试“Alerter” github repo中的示例之后,这是此文件夹内容的屏幕截图:
我不确定这个问题何时开始,但至少在我的Nexus 5x和Android 7.1.2上确实发生过.也许甚至以前.
我发现了什么
这似乎只是因为在IDE上启用了即时运行这一事实,因此它可以帮助更新应用程序,而无需一起重新构建它:
禁用它后,我可以看到有一个APK,就像过去一样:
您可以在正确的APK和分割的APK之间看到文件大小的差异.
此外,似乎有一个API来获取所有分裂的APK的路径:
这个问题
分享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