安卓 - 白标应用

9

注意: 这是一个旧问题,相应的旧答案可能已经不再相关 - 请参考有关构建变量(也称为应用程序风格)的新答案。

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

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

因此,鉴于我想保持单个代码库,这里的最佳实践是什么?

7个回答

8
据我所知,在市场上无法使用相同的包名发布两个应用程序。为了避免共享代码、布局、可绘制等的复制粘贴,我建议将这些资源放入一个库项目中,然后从你提到的应用程序A和B中引用该项目,并在这些应用程序中仅覆盖你想要更改的值。
有关库项目的更多信息,请参见官方文档

当然,这就是库项目的设计初衷。我们只需要将一个应用程序转化为“完整版+轻量级版”的模式,将原始项目转换为库项目并将其拆分为两个项目非常容易。 - Felix
感谢@johan - 另外作为参考,也可以在build.xml中使用aapt的--custom-package命令行参数,如此描述:http://blog.elsdoerfer.name/2010/04/29/android-build-multiple-versions-of-a-project/ - 对我来说,长期来看,库方法听起来更好。 - Kevin
给定的链接已损坏 :( - Moorthy

3
这是一个相当古老的问题。然而,我认为目前最好的方法是使用新的gradle构建系统,通过产品风味来开发Android应用。
对于每个风味,您可以定义applicationId。在packageNameapplicationId之间存在差异。ApplicationId唯一地标识设备上和Google Play商店中的应用程序,而后者是代码命名空间。您可以在此处详细了解: https://developer.android.com/studio/build/application-id.html 对于每个风味,您可以使用特定文件夹中的不同drawable、字符串和其他xml文件。您只需要将这些资产放入与main文件夹中的资产不同的新文件中。然后,您可以在build.gradle中为每个风味定义buildConfigField,并从Java文件中访问它们作为每个白标的配置。
您还可以为每个风味从那里定义resValue
您还可以使用manifestPlaceholders使您的AndroidManifest.xml可配置化,以用于密钥等。

3
请参阅此博客文章:blog.javia.org/android-package-name/
[编辑]为了避免链接失效导致信息丢失:这是一篇关于应用程序包定义和java包定义之间差异的文章。可以在不触及源代码中的java包的情况下更改应用程序包(在清单文件中)。[/编辑]

2

johan的回答是正确的。在我们公司,我们建立了一个小脚本,可以从一个“基础”应用程序创建多个“品牌”应用程序,不仅应用新资源,而且还创建自定义的包名并修补相应的XML文件。


请问您能否指导我如何编写创建品牌的脚本? - Developer

1
你需要的是构建变体(也称应用程序风格)。
你可以在这里阅读相关信息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。使用Build / Generate signed APK中的向导。
附:以下是如何为Debug版本设置不同的软件包名称:
buildTypes {
    release {
    }
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '.debug'
    }
}

1
我知道我有点晚了,但是您可以通过以下方式完成此操作:
1)在项目属性中添加一行manifestmerger.enabled=true 2)在清单文件中更改您的包名。
3)更新/更改资源、可绘制对象、字符串等。
4)将主项目标记为库,并在白标项目中设置其依赖项。完成,白标完成!

1
我同意Reflog所说的,我的公司使用了一个ant脚本来更改每个品牌的包名,并根据需要替换资源。我编写了基础应用程序,并考虑了默认行为,为每个附加品牌创建了文件夹,其中仅包含与基础不同的文件,就像具有不同dpi大小的多个drawable文件夹(“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),可能会出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接