Поддержка как бесплатной, так и профессиональной версии приложения - PullRequest
20 голосов
/ 27 марта 2010

Я хочу создать PRO версию своего приложения для Android, и мне было интересно, как структурировать мой репозиторий.

Насколько я знаю, у меня есть ствол и ответвления. Я хотел бы поставить профессиональную версию в другой ветке, но, может быть, есть лучший способ? Например, может быть, мне стоит создать две ветки - одну для бесплатной версии, другую для про?

Pro версия будет иметь дополнительные функции и будет без рекламы, например. Я не хочу включать библиотеки AdMob в профессиональную версию.

Есть ли у вас какой-либо опыт или предложения относительно того, как лучше всего структурировать хранилище в этом случае?

EDIT: Я думаю, что нашел лучшее решение (для моего приложения) в этой теме: http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3

Обсуждаемый здесь трюк связан с наличием другого приложения, которое служит только для разблокировки функциональности PRO в реальном приложении. Приложение для разблокировки оплачивается на рынке, а само приложение просто проверяет его наличие на устройстве.

Ответы [ 4 ]

15 голосов
/ 29 марта 2010

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

Я использую git для своего хранилища. Создание и поддержка филиалов очень просто. У меня есть мастер-репозиторий «pro» и «свободная» ветка. Я делаю все изменения кода для мастера. Моя «свободная» ветвь отличается только тем, какие изменения вызывают «свободное» поведение. Всякий раз, когда я делаю изменения в коде, я фиксирую его в ветке master, затем переключаюсь на свободную ветвь и использую команду «rebase», чтобы догнать его с master.

Откатывает изменение, которое ведет себя как «бесплатная» версия, применяет сделанные мной изменения к мастеру, затем повторно применяет «бесплатные» изменения.

Мне не нужно поддерживать две версии. Мне не нужно помнить, чтобы переключать некоторые переключатели или вносить те же изменения вперед и назад. Это довольно гладко, и мне нравится это лучше, чем второе приложение, которое запускает поведение профессионала, потому что я могу удалить библиотеки, которые не нужны для рассматриваемой версии.

11 голосов
/ 27 марта 2010

Я бы предложил не поддерживать две ветви, но иметь переключатели времени выполнения или времени компиляции, чтобы отключить функцию PRO для бесплатной версии. Вы даже можете удалить ненужные библиотеки DLL при сборке.

Поддержание двух ветвей означает исправление проблем в двух местах, что станет еще большей проблемой, поскольку ветви неизбежно расходятся.

7 голосов
/ 10 февраля 2012

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

  1. В свойствах проекта для com.app.free отметьте «Is Library» как true (вы должны скомпилировать проект хотя бы один раз, прежде чем изменять его, иначе вы получите сообщение о том, что проекты библиотеки не могут быть скомпилированы, если вы получили эта ошибка просто отмените проверку, скомпилируйте, а затем повторно проверьте.
  2. создать новый проект com.app.pro
  3. добавить проект com.app.free в качестве библиотеки в настройках проекта в разделе android проекта pro *
  4. создать новый класс MyApplication в com.app.pro и расширить приложение
  5. переопределить onCreate () ПРИМЕЧАНИЕ. Для тех товарищей по копированию / вставке это НЕ то же самое, что и набор действий onCreate (Bundle saveInstanceState). Вы должны удалить аргумент Bundle, так как это приложение, а не действие.
  6. Затем добавьте или установите статическую переменную, которая будет считываться в методе проверки, для проверки лицензии. EX: IS_PRO = true; затем метод проверки считывает переменную и возвращает true, если IS_PRO имеет значение true.
  7. Скопировать содержимое манифеста из com.app.free в com.app.pro
  8. добавить android: name = "MyApplication" в тег приложения в манифесте com.app.pro
  9. добавьте com.app.free перед атрибутом имени для всех действий. (это сообщает приложению, что ваши действия находятся в пакете библиотеки, который является бесплатной версией) EX: android: name = ". MainActivity" => android: name = "com.app.free.MainActivity"
  10. Теперь скомпилируйте и у вас будет профессиональная версия

Этот метод предполагает, что вы используете метод глобальной проверки. Например, я создал класс, который соединяет пользователей с базой данных, размещенной в моем домене, которая определяет, когда пользователь впервые установил приложение. Для любых профессиональных действий я проверяю LicenseClass.isValidLicense (), который сравнивает даты и возвращает true, если оно было меньше, чем желаемое количество дней. в функции isValidLicense () я проверяю, установлено ли для Application.IS_PRO значение true, и возвращает true, если оно установлено.

Так что теперь вы можете делать как можно больше изменений, и все, что вам нужно сделать, это перекомпилировать оба. Единственное, что нужно иметь в виду, это то, что любые изменения, которые вы вносите в манифест com.app.free, должны быть отражены в про. Но это касается любого приложения, потому что приложения для Android требуют, чтобы вы указали, какие действия вы собираетесь использовать, несмотря ни на что.

ПРИМЕЧАНИЕ. Вы можете удалить все активы и ресурсы (однако не удаляйте саму папку res), которые автоматически создаются при создании проекта, поскольку они не будут использоваться. Кроме того, единственный необходимый файл класса - это файл MyApplication из шага 3. Это означает, что вы также можете удалить класс MainActivity.class, который также генерируется автоматически, поскольку он также никогда не используется. Вы также можете удалить любые теги, которые не используются в используемой в профессиональной версии. Пример: у меня есть операция BuyPro, которая открывается, если проверка не удалась. Так как валидация в версии Pro никогда не завершится неудачей, это не требуется. Конечно, все эти удаления являются необязательными, просто сообщая вам, что я выучил.

CONS: Единственное, что я нашел до сих пор, это то, что вы не можете использовать операторы switch с вашими переменными ресурса, потому что они больше не являются константами. Поэтому, когда вы используете проект в качестве библиотеки, любая переменная, которую вы создаете в файле strings.xml, например, автоматически переопределяется, если вы объявите переменную с тем же именем в профессиональной версии. Для меня это не обман, потому что я не люблю использовать состояния переключателей в Java, потому что они ограничивают вас переключением только на тип int и требуют постоянных значений. Что означает в java, что я обычно имею к нам, если ... в любом случае высказывает. Кроме того, Eclipse фактически поможет преобразовать операторы переключателей, если вы поместите курсор на ключевое слово переключателя и нажмете Ctrl + 1, а затем щелкните преобразовать в if else. Кроме того, я нахожу весьма полезным, что ресурсы переопределяются, потому что вы можете сделать такие вещи, как изменить имя приложения с «app free» на «app pro» или загрузить новый чертеж, например, значок приложения, просто создав новую версию в том месте, где он существует в бесплатном приложении. Пример: если файл res / values ​​/ string.xml содержит, скажем, 100 строковых переменных, но все, что вам нужно или нужно изменить в профессиональной версии, это имя_приложения, просто создайте заново файл res / values ​​/ string.xml (НЕ копировать) и добавьте переменную app_name. , Теперь переменная app_name в бесплатной версии будет переопределена, что означает, что файл string.xml в профессиональной версии должен содержать только переменную 1 вместо 100, поскольку это единственная переменная, которая изменилась. Очень просто. : -)

РЕДАКТИРОВАТЬ: я обнаружил, что eclipse не позволяет вам экспортировать .apk для библиотек, поэтому вы должны снять флажок «Is Library» в бесплатной версии после того, как вы добавили его в качестве библиотеки в профессиональной версии. Насколько я могу судить, единственное, что он делает, это заставляет затмение не предупреждать вас о проблеме оператора switch. Кроме этого, он, кажется, работает просто отлично.

1 голос
/ 27 марта 2010

Имейте единственную версию с public static final boolean IS_PRO, которая будет определять свободное / профессиональное поведение.

EDIT:
Пакетная вещь. Скажем, все ваши классы находятся под com.myapp.android.free.
Затем в AndroidManifest.xml вы объявляете пакет = "com.myapp.android" для платной версии и package="com.myapp.android.free" для бесплатной.
Если вы используете полные имена для действий, услуг и т. Д., Вам больше не придется ничего менять.

Я бы не стал удалять неиспользованные библиотеки из платной версии. Если вы это сделаете, вам придется сделать это вручную.

...