9

注意:这是一个老问题,相应的旧答案可能不相关 - 请参阅有关 Build Variants(又名 App Flavors)的较新答案。

我有一个关于发布到市场的问题。

公司 X 为公司 A 和 B 提供类似的服务,并且 A 和 B 都希望在市场上有一个应用程序。X 公司只想编写一个应用程序,并在编译时使用适当的徽标、配置设置、语言字符串来区分它们。但是,在发布时,应用程序具有相同的应用程序包名称(使用共享代码库)。该应用程序将被维护和

那么,鉴于我想保留一个代码库,这里的最佳实践是什么?

4

7 回答 7

8

据我所知,您不能在 Market 上拥有两个具有相同软件包名称的应用程序。为避免复制粘贴共享代码、布局、可绘制对象等,我建议将这些资源放入库项目中,然后从您提到的应用程序 A 和 B 中引用该项目,并在这些应用程序中覆盖您想要更改的值.

官方文档中有关库项目的更多信息。

于 2010-12-22T09:54:29.347 回答
4

请参阅此博客文章blog.javia.org/android-package-name/

[编辑] 如果此链接失效,为了避免信息丢失:这是一篇关于应用程序包定义和 java 包定义差异的帖子。它可以更改应用程序包(在清单内)而不接触源的 java 包。[/edit]

于 2010-12-22T08:43:34.283 回答
2

约翰的回答是正确的。在我的公司,我们刚刚构建了一个小脚本,它通过一个“基础”应用程序创建应用程序的“品牌”,不仅应用新资源,还创建自定义包名称并修补适当的 XML 文件。

于 2010-12-22T12:34:43.087 回答
2

这是一个相当古老的问题。但是现在我认为最好的方法是使用新的 gradle 构建系统来使用Product Flavors for Android。

  • 对于您可以定义的每种风味applicationIdpackageName和之间有区别applicationId。ApplicationId 在设备上和 Google Play 商店中唯一标识您的应用程序。后者用于代码命名空间。您可以在这里阅读更多内容:https ://developer.android.com/studio/build/application-id.html
  • 对于每种风味,您可以使用不同的可绘制对象、字符串和其他 xml 文件,使用该风味的特定文件夹。您只需要将这些资产放入与文件main夹中的资产不同的新文件中。然后,您可以为每个可以从 Java 文件访问的buildConfigField风格定义为每个白标签的配置。build.gradle
  • 您也可以resValue从那里定义每种口味。
  • 您还可以使用manifestPlaceholdersAndroidManifest.xml对键等进行配置。
于 2017-03-14T21:05:55.183 回答
1

我知道我参加聚会有点晚了,但你可以通过以下方式做到这一点:

1)通过添加行更改您的 project.propertiesmanifestmerger.enabled=true

2)在清单中更改您的包名称。

3) 更新/更改您的资源、可绘制对象、字符串等。

4)将您的主项目标记为库,并在您的白标项目中为其设置依赖项。瞧,白标!

于 2015-03-24T18:38:29.627 回答
1

我同意Reflog的说法,我公司使用了一个ant脚本来更改每个品牌的包名,并且根据需要替换资源。我在编写基本应用程序时考虑了默认行为,并为每个附加品牌创建了仅包含与基本不同的文件的文件夹,就像具有不同 dpi 大小的多个可绘制文件夹(“drawable”、“drawable-hdpi”。 ..)。其他更改包括修改每个品牌的字符串文件以获取适当的颜色和法律文本。

通过以本地化风格命名它们(例如“drawable-en-rAA-hdpi”、“layout-en-rBB”...),我可以通过打开“自定义区域设置”应用程序在多个模拟器中快速进行测试在每个模拟器中,并根据需要将语言环境设置为“en_AA”、“en_BB”。通过保存基本 AVD 的多个副本,我能够保存这些设置,因此我不必在模拟器中切换来测试所有最终品牌。

这种方法的一个警告是,该应用程序的模拟版本将包含 .apk 中的所有文件,而 ant 脚本会删除重复项。此外,虽然此“完整”.apk 将安装在设备上,但它只会显示默认行为,除非您可以在设备上设置区域设置以匹配品牌区域设置。(我的任何物理设备上都没有安装自定义区域设置。)如果您有意使用现有的命名区域设置(en_AU、en_CA、en_GB),这很有效,但对于自定义名称(en_B1、en_XX)可能会出现问题。

于 2012-07-18T18:35:08.647 回答
1

您需要的是 Build Variants(又名 App Flavors)。

你可以在这里阅读它https://developer.android.com/studio/build/build-variants.html

简而言之,这允许您拥有共享部分代码和资源的应用程序的不同变体,但也可以有自己的替代品。您可以为每个变体指定不同的包名称/ID,以及其他内容(如徽标、颜色、启动屏幕甚至 java 代码)。

defaultConfig {
    applicationId "com.example.example"
    minSdkVersion 16
    targetSdkVersion 25
    versionCode 1
    versionName "1.0.0"
}

productFlavors {
    variantone {
            applicationId 'com.company1.example'
    }
    varianttwo {
            applicationId 'com.company2.example'
    }
}

您可以使用变体名称创建资源文件夹,您可以在其中放置替代资源或源代码。例如,src/variantone/res

在 Android Studio 中切换构建变体不会导致文件更改(您只需选择“输出”)。您可以同时为所需的所有变体构建 APK。使用构建/生成签名 APK 中的向导。

PS 以下是如何为 Debug 构建使用不同的包名称:

buildTypes {
    release {
    }
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '.debug'
    }
}
于 2017-08-16T08:07:52.803 回答