Android - whitelabel app

  注意:这是一个古老的问题,相应的旧的upvoted答案可能不相关 - 请参阅有关Build Variants(a.k.a. App Flavors)的更新答案。 我有一个关于向市场发布的问题。 公司X为A& A公司提供类似的服务。 B,A和A都是B想在市场上买一个应用程序。公司X只想编写一个应用程序,并在编译时使用适当的徽标,配置设置和语言字符串来区分它们。但是,在发布时,应用程序具有相同的应用程序包名称(使用共享代码库)。该应用程序将被维护 所以,鉴于我想保留一个代码库,这里的最佳做法是什么?     
已邀请:
据我所知,你不能在Market上拥有两个具有相同包名的应用程序。为了避免共享代码,布局,drawable等的复制粘贴,我建议将这些资源放入库项目,然后从你提到的应用程序A和B中引用这个项目,在这些应用程序中只是覆盖你想要更改的值。 更多关于官方文档中的图书馆项目。     
请参阅此博客文章blog.javia.org/android-package-name/。 [编辑]为了避免在此链接死亡时丢失信息:它是关于应用程序包定义和java包定义之间差异的帖子。它可以在不触及源代码的java包的情况下更改应用程序包(在清单中)。[/ edit]     
约翰的回答是正确的。在我的公司,我们只是构建了一个小脚本,通过一个“基础”应用程序创建“品牌”应用程序,不仅应用新资源,还创建自定义包名称并修补相应的XML文件。     
我同意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)可能会有问题。     
我知道我参加聚会有点晚了,但你可以这样做: 1)通过添加行
manifestmerger.enabled=true
来更改project.properties 2)更改您的包名称 表现。 3)更新/更改您的资源,绘图,字符串等等。 4)将您的主项目标记为库,并在白标项目中设置它的依赖关系。瞧,白色标签!     
这是一个非常古老的问题。但是现在我认为最好的方法是使用新的gradle构建系统来使用Android的Product Flavors。 对于每种口味,您可以定义
applicationId
packageName
applicationId
之间存在差异。 ApplicationId可在设备和Google Play商店中唯一标识您的应用。后者用于代码名称空间。您可以在这里阅读更多内容:https://developer.android.com/studio/build/application-id.html 对于每种风味,您可以使用不同的drawables,字符串,使用特定文件夹的其他xml文件。您只需将这些资源放入新文件中,这与
main
文件夹中的资产不同。然后有
buildConfigField
你可以在
build.gradle
中定义每种风味,可以从Java文件中访问这些风格作为每个白标签的配置。 你也可以从那里为每种口味定义
resValue
。 您还可以使用manifestPlaceholders为键等配置
AndroidManifest.xml
。     
你需要的是Build Variants(a.k.a. 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。使用Build / Generate signed APK中的向导。 附:以下是如何为Debug版本提供不同的包名称:
buildTypes {
    release {
    }
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '.debug'
    }
}
    

要回复问题请先登录注册