【问题标题】:How can I install another version of my app on the same device? [no gradle]如何在同一设备上安装我的应用程序的另一个版本? [没有等级]
【发布时间】:2018-12-27 02:32:40
【问题描述】:

我正在从 github 源代码构建一个应用程序,我需要在同一设备上使用它的两个不同版本。 一个应用程序必须有什么不同才能成为不同的应用程序? 我想要一个小改动,而不是到处重命名包。

注意:没有 gradle。我在设备本身(使用 termux)上做它,它缺少 gradle。 该应用程序本身有一些本机代码和一些不同的包。

似乎 AndroidManifest.xml 中的 package 名称必须不同,当然任何引用的类都在 AndroidManifest.xml 中显式引用也必须存在。

但这足够了吗?具体来说,以下是否可以相同:

  • AndroidManifest.xml 中的其他内容

  • 主包中的所有其他类?

  • 应用中的其他包?
  • 原生库?

我猜清单中的所有其他名称都只是装饰,并不能识别应用程序。所以例如不同的应用程序可以在主屏幕上具有相同的名称。

包名用于命名应用程序的安装目录,因此它的所有其他数据 - dex 类、本机库等 - 都是不同的。

android 使用不同的类加载器加载每个应用程序是明智的,因此不同的应用程序可以具有相同的包。这避免了使用相同(流行)库的不同应用程序使用静态/类字段的常见场景中的冲突。

我的猜测来自这个答案: https://android.stackexchange.com/a/20793/108921

如果是这样...我可以创建一个新包,将引用的类移到其中,然后在 AndroidManifest.xml 中使用这个新包名。 (这些类访问以前在同一个包中的其他类可能存在问题,但我认为这是一个不同的问题。

【问题讨论】:

    标签: android build apk android-manifest


    【解决方案1】:

    您只需要更改 AndroidManifest.xml 中的包属性(manifest 包)。这可能与您的代码库的 java 包不同。

    有一些警告。 aapt 工具使用清单包生成R.java。 AndroidManifest.xml 中的任何相对名称(活动等)都使用清单包完成为绝对名称。为避免这种情况,只需使用绝对名称即可。

    为方便起见,aapt 工具的 --rename-manifest-package 选项可以做到这一点。即完成任何相对名称,然后将清单包更改为给定的参数。

    我已经用一个简单的项目对此进行了测试,并确认它可以在同一设备上安装同一应用的不同版本。

    我还没有测试过更复杂的项目......可能还有更多的警告,AndroidManifest.xml 构成公共 API 的各个方面,以及由 explicit 意图。 Things That Cannot Change 20 June 2011

    文档确认您可以更改原始 Java 包;并且您可以创建同一应用程序的不同版本(口味)。不幸的是,它是根据 gradle 如何读取和更新 AndroidManifest.xml 的额外层来讨论的,而不是直接自己做: Set the application ID

    【讨论】:

      【解决方案2】:

      很难相信...包名就像我认为的 ID...google play store 也使用包名作为 ID...每个应用程序在每个设备中都必须有唯一的 ID,最后我可以说你不可能可以在 1 个设备上安装 2 个具有相同包名的应用

      【讨论】:

      • 我的问题建议使用不同的包名。
      • 如果您查看问题的其余部分,我建议保留与清单中引用的相同的包 except(请参阅最后一段)。跨度>
      猜你喜欢
      • 1970-01-01
      • 2022-07-16
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      相关资源
      最近更新 更多