Android – приложение для whitelabel

ПРИМЕЧАНИЕ. Это старый вопрос, и соответствующий старый ответ может быть неактуальным – см. Более новые ответы о вариантах сборки (например, App Flavors).

У меня вопрос о публикации на рынке.

Компания X предоставляет аналогичные услуги для компаний A & B, и оба A & B хотят приложения на рынке. Компания X хочет написать только одно приложение и провести различие между ними, используя соответствующие логотипы, настройки конфигурации, языковые строки во время компиляции. Однако, когда дело доходит до публикации, приложения имеют одинаковое имя пакета приложений (с использованием общей базы кода). Приложение будет поддерживаться и

Итак, учитывая, что я хочу сохранить единую базу кода, какая здесь лучшая практика?

Насколько я знаю, у вас не может быть двух приложений на рынке с таким же именем пакета. Чтобы избежать копирования вставки общего кода, макетов, чертежей и т. Д., Я бы рекомендовал разместить эти ресурсы в проект библиотеки, а затем ссылаться на этот проект из приложений A и B, которые вы упомянули, и в этих приложениях просто переопределить значения, которые вы хотите изменить ,

Подробнее о библиотечных проектах в официальной документации .

См. Это сообщение в блоге, blog.javia.org/android-package-name/ .

[Edit] Во избежание потери информации, если эта ссылка замирает: ее сообщение об отличии определения пакета приложения и определения пакета java. Его можно изменить пакет приложения (внутри манифеста), не касаясь пакета java из источников. [/ Edit]

Ответ правителя правильный. В моей компании мы просто создали небольшой скрипт, который создает «бренды» приложения из одного «базового» приложения, не только применяя новые ресурсы, но и создавая собственное имя пакета и исправляя соответствующие файлы XML.

Я согласен с тем, что сказал Reflog, моя компания использовала скрипт ant для изменения имени пакета для каждой марки, а также для замены ресурсов по мере необходимости. Я написал базовое приложение с учетом поведения по умолчанию и создал папки для каждого дополнительного бренда, содержащие только те файлы, которые отличались от базы, так же, как несколько папок с возможностью рисования с разными размерами dpi («drawable», «drawable-hdpi». ..). Другие изменения включали изменение файлов строк для каждой марки для соответствующих цветов и юридического текста.

Назвав их в стиле локализации (например, «drawable-en-rAA-hdpi», «layout-en-rBB» …), я смог быстро протестировать это в нескольких эмуляторах, открыв приложение «Custom Locale» В каждом эмуляторе и при необходимости устанавливая языковой стандарт «en_AA», «en_BB». Сохраняя несколько копий базового AVD, я смог сохранить эти настройки, поэтому мне не пришлось переключаться в эмулятор, чтобы протестировать все конечные бренды.

Одно из предостережений в этом подходе заключается в том, что эта эмулированная версия приложения будет включать все файлы в .apk, в то время как ant-скрипт удаляет дубликаты. Кроме того, хотя этот «полный» .apk будет установлен на устройствах, он покажет только поведение по умолчанию, если вы не можете установить локаль на устройстве в соответствии с локалией бренда. (Пользовательский локаль не был установлен ни на одном из моих физических устройств.) Это хорошо работает, если вы намеренно используете существующие именованные локали (en_AU, en_CA, en_GB), но могут быть проблематичными для пользовательских имен (en_B1, en_XX).

Я знаю, что я немного опаздываю на вечеринку, но вы можете это сделать:

1) Измените свои project.properties, добавив строку manifestmerger.enabled=true

2) Измените имя пакета в манифесте.

3) Обновите / измените свои ресурсы, чертежи, строки, что угодно.

4) Отметьте свой мастер-проект как библиотеку и установите для нее зависимость в проекте с белой меткой. Вуала, белая этикетка!

Это довольно старый вопрос. Однако теперь я думаю, что лучшим подходом будет использование Product Flavors для Android с использованием новой системы построения градиентов.

  • Для каждого аромата вы можете определить applicationId . Существует различие между packageName и applicationId . ApplicationId уникально идентифицирует ваше приложение на устройстве и в Google Play Store. Последнее относится к пространству имен кода. Вы можете прочитать здесь: https://developer.android.com/studio/build/application-id.html
  • Для каждого аромата вы можете иметь разные рисунки, строки, другой файл xml, используя определенную папку для аромата. Вам нужно только поместить эти активы в новые файлы, которые отличаются от активов в main папке. Затем есть buildConfigField вы можете определить для каждого аромата в build.gradle которому можно получить доступ из файлов Java в качестве ваших конфигураций для каждого белого символа.
  • Также вы можете определить resValue для каждого аромата.
  • Вы также можете настроить свой AndroidManifest.xml для ключей и т. Д., Используя manifestPlaceholders .

Вам нужны варианты сборки (например, 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 подписанный APK.

PS Вот как вы можете иметь другое имя пакета для сборки Debug:

 buildTypes { release { } debug { applicationIdSuffix '.debug' versionNameSuffix '.debug' } }