我有一个应用程序(这里),除其他功能外,允许共享APK文件。
为此,它通过访问packageinfo.applicationinfo.sourcedir(此处为docs链接)的路径到达文件,并只是共享文件(如我在这里所用的那样,在需要时使用ContentProvider)。
这在大多数情况下都很好,特别是从Play Store或独立的APK文件安装APK文件时,但是当我使用Android-Studio本身安装应用程序时,我会在这个路径上看到多个APK文件,而且没有一个是可以毫无问题地安装和运行的有效文件。
在试用了“Alerter”github repo的示例后,下面是该文件夹内容的截图:
我不确定这个问题是从什么时候开始的,但至少在我的Nexus5X和Android7.1.2上确实发生过。也许以前就有。
这似乎仅仅是由于IDE上启用了即时运行这一事实造成的,这样它就可以帮助更新应用程序,而不需要重新构建它:
禁用后,我可以看到有一个单独的APK,就像过去一样:
您可以看到正确的APK和拆分的APK之间文件大小的差异。
此外,似乎有一个API可以获取到所有拆分的APK的路径:
真的需要以某种方式将它们合并吗?
从文件上看,这似乎是有可能的:
指向零个或多个拆分APK的完整路径,当这些APK与sourceDir中定义的基本APK组合在一起时,就形成了一个完整的应用程序。
但正确的做法是什么,有没有快速高效的做法?也许没有真正创建一个文件?
是否有一个API可以从所有拆分的APK中得到一个合并的APK?或者这样的APK在其他路径中已经存在了,不需要合并?
编辑:刚刚注意到,我尝试过的所有第三方应用程序都应该共享一个已安装的应用程序的APK,但在这种情况下却无法做到这一点。
我是谷歌Android Gradle插件的技术负责人,假设我理解你的用例,让我来回答你的问题。
首先,一些用户提到您不应该共享您启用了InstantRun的构建,他们是正确的。应用程序上的即时运行构建是针对当前设备/仿真器映像进行高度定制的。所以基本上,假设你为一个运行21的特定设备生成了一个启用IR的应用程序构建,如果你试图在一个运行23的设备上使用这些完全相同的APK,它将会失败得很惨。如果需要,我可以进行更深入的解释,但只需说我们生成的字节码是在Android.jar中的API上定制的(当然是特定于版本的)。
所以我不认为共享这些APK是有意义的,您应该使用一个IR禁用的构建或者一个发布的构建。
现在要了解一些细节,每个切片APK包含1+dex文件,所以理论上,没有什么可以阻止您解压缩所有那些切片APK,获取所有dex文件并将它们塞回base.APK/rezip/辞职,它应该就可以工作了。然而,它仍将是一个启用IR的应用程序,因此它将启动小型服务器来侦听IDE请求,等等。我想不出这样做有什么好理由。
希望这有帮助。
我已经编写了一个库,过去我使用自编的Makefile编译它,但现在我想切换到cmake。树是这样的(我删除了所有不相关的文件): 我只是想把它编译到一个共享的文件库中。 我发现的大多数示例都使用一些共享库编译可执行文件,但绝不仅仅是一个普通的共享库。如果有人能告诉我一个使用cmake的非常简单的库,那也会很有帮助,所以我可以用这个作为例子。
我想为消息驱动的EJB创建一个主题上的共享、非持久订阅,并想知道如何使用@MessageDriven和@ActivationConfigProperty来实现这一点。 我发现一篇文章描述了类似的事情,但我不确定这是否适用于我的问题: 订阅的共享依赖于客户端id的设置,不仅对于持久订阅(总是需要客户端id),对于非持久订阅(通常不需要客户端id)也是如此。如果订阅是由资源适配器创建的,以供消息驱动b
JMS 2.0规范引入了共享持久订阅的概念。我有一个用例,我必须在服务器启动时以编程方式创建订阅。我们有集群的JBoss服务器。因此,每个JBoss都有类似的配置,每个JBoss都有将创建持久订阅者的应用程序(消息提供者是WMQ)。由于持久订阅必须有一个唯一的名称,我想到了使用共享订阅。现在的问题是Spring的4.0.6.RELEASE支持JMS 2.0中的新功能,但是我没有找到通过Spring
我的目标是在内部存储上创建一个XML文件,然后通过share Intent发送它。 我能够使用以下代码创建XML文件 我一直在尝试检索输出文件的Uri以共享它。我首先尝试通过将文件转换为Uri来访问该文件 此返回file:///data/data/com.my.package/files/myfile.xml但我似乎无法将此附加到电子邮件、上载等。 如果我手动检查文件长度,它是正确的,并显示有一个
我希望能够处理从必须在页面中访问的源读取的java流。作为第一种方法,我实现了一个分页迭代器,它在当前页面用尽条目时简单地请求页面,然后使用< code > stream support . stream(iterator,false)获取迭代器上的流句柄。 因为我发现获取我的页面非常昂贵,所以我想通过并行流的方式访问页面。此时,我发现由于java直接从迭代器提供的spliterator实现,我的
问题内容: 如何在method内部创建方法?当我创建其显示错误时: 令牌无效@上的语法错误 如果不能在方法内部创建方法,那么请告诉我如何在方法外部创建方法,并从方法中传递方法。 问题答案: *请注意,应使用没有不等号的实际类型(例如“ int”和“ short”)替换此类标记。