После просмотра всех параметров в этой и других темах, это мои выводы
Общие настройки, база данных
Может быть очищен в настройках Android, потерян после переустановки приложения. Может быть сохранено с помощью механизма резервного копирования Android и будет восстановлено после переустановки. Резервная копия не всегда доступна, хотя должна быть на большинстве устройств
Внешнее хранилище (запись в файл)
Не влияет очистка из настроек или переустановка, если мы не будем писать в личный каталог приложения . Но: требует, чтобы вы запрашивали у пользователя его разрешение во время выполнения в более новых версиях Android, так что это, вероятно, возможно только в том случае, если вам все равно нужно это разрешение. Можно также сделать резервную копию.
PackageInfo.firstInstallTime
Сбрасывается после переустановки, но стабильно при обновлении
Войдите в какой-либо аккаунт
Не имеет значения, является ли это их аккаунтом Google через Firebase или аккаунтом на вашем собственном сервере: пробная версия привязана к аккаунту. Создание новой учетной записи приведет к сбросу пробной версии.
Firebase анонимный вход
Вы можете войти в систему пользователя анонимно и хранить данные для него в Firebase. Но , по-видимому, переустановка приложения и, возможно, другие недокументированные события могут дать пользователю новый анонимный идентификатор , сбрасывая его пробное время. (Сами Google не предоставляют много документации по этому вопросу)
ANDROID_ID
Может быть недоступно и может измениться при определенных обстоятельствах , например, сброс к заводским настройкам. Мнения о том, стоит ли использовать это для идентификации устройств, похоже, отличаются.
Play Advertising ID
Может быть сброшен пользователем. Может быть отключено пользователем путем отключения отслеживания рекламы.
InstanceID
Сброс при переустановке . Сброс в случае события безопасности. Может быть сброшено вашим приложением.
Какой (комбинация) методов работает для вас, зависит от вашего приложения и от того, сколько усилий, как вы думаете, средний Джон приложит для получения еще одного испытательного периода. Я бы рекомендовал избегать использования only анонимных Firebase и Advertising ID из-за их нестабильности. Многофакторный подход, похоже, даст лучшие результаты. Какие факторы вам доступны, зависит от вашего приложения и его разрешений.
Для моего собственного приложения я нашел общие предпочтения + firstInstallTime + резервное копирование предпочтений как наименее навязчивый, но и достаточно эффективный метод. Вы должны убедиться, что запрашиваете резервную копию только после проверки и сохранения времени запуска пробной версии в общих настройках. Значения в общих настройках должны иметь приоритет над firstInstallTime. Затем пользователь должен переустановить приложение, запустить его один раз, а затем очистить данные приложения, чтобы сбросить пробную версию, что довольно много работы. На устройствах без резервного копирования пользователь может сбросить пробную версию, просто переустановив.
Я сделал этот подход доступным как расширяемая библиотека .