我正在从github上构建一个应用程序,并且我需要在同一设备上安装两个不同版本的应用程序。 要成为其他应用,一个应用必须至少有多少不同? 我想要一个小的更改,而不是在任何地方重命名软件包。
注意:没有任何问题。我是在设备本身上(使用termux)来做的,这没有问题。 该应用程序本身具有一些本机代码和一些不同的程序包。
看来, AndroidManifest.xml 中的 package 名称必须不同,当然, AndroidManifest.xml 中明确引用的所有类也必须存在。
但是足够了吗?具体来说,以下内容是否可以相同:
AndroidManifest.xml 中的所有其他内容?
主包中的所有其他类?
我猜清单中的所有其他名称都只是装饰,不能识别应用程序。因此,例如不同的应用在主屏幕上可能具有相同的名称。
软件包名称用于命名应用安装目录,因此其所有其他数据(例如dex类,本机库等)都是不同的。
对于Android来说,使用不同的类加载器加载每个应用程序是明智的,因此不同的应用程序可以具有相同的程序包。这样可以避免在使用相同(流行)库(使用静态/类字段)的不同应用的常见情况下发生冲突。
我的猜测是从以下答案得出的: https://android.stackexchange.com/a/20793/108921
如果是这样,我可以制作一个新程序包,将引用的类移动到其中,并在 AndroidManifest.xml 中使用此新程序包名称。 (这些类访问以前属于同一软件包的其他类可能会出现问题,但我想那是一个不同的问题。)
答案 0 :(得分:0)
难以置信...包名称就像ID,我想... Google Play商店也使用包名称作为ID ...每个应用在每个设备上都具有唯一的ID,最后我可以说它不可能可以在1台设备上安装2个具有相同软件包名称的应用程序
答案 1 :(得分:0)
您只需要更改AndroidManifest.xml中的package属性( manifest包)。这可能与代码库的Java包不同。
有一些警告。 aapt
工具使用清单包来生成R.java
。使用清单包将AndroidManifest.xml中的任何(活动等的)相对名称都完整化为绝对名称。为避免这种情况,只需使用绝对名称即可。
为方便起见,--rename-manifest-package
工具的aapt
选项可以做到这一点。即填写所有相对名称,然后将清单包更改为给定的参数。
我已经用一个简单的项目对其进行了测试,并确认它可以在同一设备上安装同一应用程序的不同版本。
我还没有测试更复杂的项目...可能还有其他警告,包括构成公共API的AndroidManifest.xml的各个方面,以及 explicit <引用的活动,服务,ContentProviders和BroadcastReceivers / strong>意图。 Things That Cannot Change 20 June 2011
文档确认您可以更改原始Java包;并且您可以为同一应用创建不同的版本(风味)。不幸的是,它是在gradle如何读取和更新AndroidManifest.xml的另一层上讨论的,而不是直接自己做: Set the application ID