как управлять версией отладки и выпуска на устройстве Android?

Я новичок в Android-разработке и почти готов выпустить первую версию своего приложения :)

При тестировании подписанного apk-релиза на моем телефоне он отказывается устанавливать, потому что отладочная версия устанавливается с отладочной подписью.

Поэтому мне нужно удалить отладочную версию, но она удалит всю мою базу данных (и она сделает это с моими друзьями, которые ее тестируют).

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


person Geob-o-matic    schedule 10.02.2011    source источник
comment
Я был бы очень заинтересован в решении для этого тоже. Однако я совершенно уверен, что без изменения имен пакетов это будет невозможно. :/   -  person Victor    schedule 10.02.2011


Ответы (6)


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

  • Купите второе устройство для тестирования (некоторые Android-устройства сейчас очень дешевые, особенно на eBay).
  • Используйте эмулятор для тестирования

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

Я бы посоветовал вашим тестировщикам всегда давать им релизные версии, но вы могли бы включить подробное ведение журнала, чтобы помочь с проблемами. После этого отладочные версии используются только вами, а выпускные версии — ими. Если вы предоставляете тестировщикам версию выпуска, они используют и накапливают данные, когда они приходят для обновления до следующей версии, данные могут быть сохранены (или обновлены, если вы измените схему) для переноса своих данных.

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

person Ollie C    schedule 10.02.2011
comment
это потому, что я предоставляю меню отладки с некоторыми дополнительными действиями, доступными только тогда, когда приложение подписано, чтобы отладить подпись - person Geob-o-matic; 10.02.2011
comment
В этом случае я бы посоветовал вам добавить логический флаг в вашу сборку, чтобы включить это меню или нет, и поместить его в свою производственную сборку. Другой вариант — скрыть его в пользовательском интерфейсе, возможно, с помощью длительного нажатия на логотип приложения, что большинство людей не будут делать, но если вы хотите, чтобы определенные люди имели к нему доступ, они могут это сделать. Затем, когда тестирование завершено, вы делаете правильный производственный релиз и удаляете его. - person Ollie C; 10.02.2011
comment
@Geobert Я думаю, что отправлять тестировщикам отладочные сборки - плохая идея, гораздо лучше отправлять им производственные версии. Это дает им опыт ближе к конечному результату, например. убедиться, что они тестируют версию, которая, например, использует производственный ключ MapView. Отладочные сборки предназначены для вас, продакшн — для ваших тестировщиков и конечных пользователей. - person Ollie C; 10.02.2011

Многие проекты Android начинают использовать систему сборки gradle (мы перешли на нее, когда начали использовать Android Studio). К счастью, Gradle позволяет очень просто одновременно установить и версию для разработчиков, и версию для выпуска, каждая из которых имеет свои собственные независимые данные. документация по Android охватывает это , просто добавьте applicationIdSuffix к типу сборки отладки, например:

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}
person Evan Grim    schedule 02.04.2014
comment
Я не так хорошо знаком (пока) с gradle, но, по крайней мере, согласно тому, что я читал до сих пор, я думаю, что это должен быть принятый ответ, поскольку это лучшее решение вопроса ОП. - person Andre; 04.02.2015

Спасибо @Evan, ваше решение работает отлично:

android {
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

Чтобы добавить «(DEBUG)» к заголовку вашего приложения при работе в режиме отладки, поместите этот код в onCreate вашей активности:

PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
    //The .debug specified in gradle
    if (pInfo.packageName.equals("YOUR_PACKAGE_NAME_HERE.debug")) {
        setTitle(getTitle() + " (DEBUG)");
}
person Francois    schedule 15.12.2014

Зачем удалять приложение? Обычно при установке новой версии того же приложения (идентифицируемого по идентификатору пакета) сохраняются все данные приложения.

РЕДАКТИРОВАТЬ: чтобы сохранить данные приложения вручную, скопируйте их из /data/data/my.package.name/... в безопасное место, а затем восстановите при необходимости.

person Seva Alekseyev    schedule 10.02.2011
comment
То же приложение будет перезаписывать старое при сохранении данных, да, но вы не можете установить второе приложение с тем же пакетом, но с другой подписью, как у @Geobert. Так вот что происходит. - person Nanne; 10.02.2011
comment
Я не менял идентификатор пакета, но он не устанавливается. Я удалил отладочную версию, а затем установил релизную. Затем, когда я попытался запустить в режиме отладки из eclipse, он говорит: - person Geob-o-matic; 10.02.2011
comment
[2011-02-10 18:11:24 - radis] Загрузка radis.apk на устройство '10006609c6cb' [2011-02-10 18:11:24 - radis] Установка radis.apk... [2011-02-10 18:11:25 - radis] Переустановка не удалась из-за разных подписей приложений. [2011-02-10 18:11:25 - radis] Необходимо выполнить полное удаление приложения. ВНИМАНИЕ: Это приведет к удалению данных приложения! [2011-02-10 18:11:25 - radis] Пожалуйста, выполните 'adb uninstall fr.geobert.Radis' в оболочке. [2011-02-10 18:11:25 - radis] Запуск отменен! - person Geob-o-matic; 10.02.2011
comment
О, отлаживать и выпускать одновременно на одном устройстве? Возможно, но только если они вводят разные идентификаторы пакетов. Android идентифицирует приложения по их идентификатору пакета. - person Seva Alekseyev; 10.02.2011
comment
Является ли идентификатор пакета именем пакета в стиле Java? Можем ли мы изменить его в соответствии с режимом отладки/релиза? - person Geob-o-matic; 10.02.2011
comment
Тот, который указан в файле манифеста как ‹manifest package=...›. Обычно соответствует имени пакета Java, но не обязательно. - person Seva Alekseyev; 10.02.2011
comment
Разве папка data не защищена? Вам не нужен root, чтобы получить к нему доступ? - person John; 10.02.2011
comment
Не уверен... Мои пользователи Android дают мне противоречивые отчеты. Вероятно, зависит от устройства (оператора?) и версии ОС. - person Seva Alekseyev; 10.02.2011
comment
Я думаю, что это плохое решение — вы должны отправлять рабочие APK своим тестерам и клиентам, иначе они могли бы дать обратную связь, все в порядке, затем вы выпускаете производственную сборку и видите проблемы. Ваши тестировщики должны тестировать версию, как можно более близкую к той, которую вы наконец выпустите. - person Ollie C; 10.02.2011
comment
Я вроде согласен; в моем случае бета была подписана ключом prod, а функции отладки были хорошо спрятаны (активировались чит-кодом в одном из полей ввода). Просто отвечая на вопрос. - person Seva Alekseyev; 10.02.2011

Для меня мне также нужно было добавить:

<permission                                                                               
      android:name="${applicationId}.permission.C2D_MESSAGE"                                
      android:protectionLevel="signature" />                                                

<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" /> 

В противном случае оба получили бы одно и то же разрешение C2D_MESSAGE, в результате чего:

Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=<your applicationId>.permission.C2D_MESSAGE pkg=<your applicationId>] 
person peuhse    schedule 19.04.2016

Настройте суффикс идентификатора приложения

При следующей конфигурации вашего приложения build.gradle вариант выпуска будет использовать com.example.myapp applicationId, а вариант отладки — com.example.myapp.debug.

android {
    defaultConfig {
        applicationId "com.example.myapp"
        ...
    }
    ...
}
buildTypes {
  debug {
    applicationIdSuffix ".debug"
    ...
  }
  release {
    ...
  }
  ...
}

Настроить несколько аккаунтов Firebase

Если вы используете Firebase, вам понадобятся две учетные записи Firebase, одна для производства, а другая для разработки. Вам необходимо настроить JSON сервисов Google для каждой учетной записи в своем собственном исходном наборе вариантов:

  • Производственный файл google-services.json в исходном наборе выпуска: app/src/release/google-services.json
  • Разработка google-services.json в наборе исходников выпуска: app/src/debug/google-services.json

Полномочия поставщиков

Если вы определили поставщика в своем AndroidManifest.xml, теперь у вас может возникнуть конфликт, если оба варианта выпуска и отладки используют одни и те же полномочия поставщика, и оба приложения установлены на одном устройстве. Чтобы избежать этой проблемы, рекомендуется использовать applicationId в качестве суффикса полномочий.

<provider
   android:name="androidx.core.content.FileProvider"
   android:authorities="${applicationId}.fileprovider"
   android:exported="false"
   android:grantUriPermissions="true">
</provider>

Пользовательский значок для каждого варианта

Если вы собираетесь установить несколько вариантов на одно и то же устройство, рекомендуется использовать разные значки приложений, чтобы вы могли идентифицировать их в панели запуска. Вам просто нужно создать значок приложения отладки и найти его на src/debug/res/mipmap-xxhdpi-*

Настроить FCM

Теперь, когда вы используете разные учетные записи Firebase, если у вас есть сервер FCM (push), вам нужно будет настроить его с правильными учетными данными. Когда устройство с приложением отладки зарегистрировано, серверу FCM необходимо связать токен регистрации с типом сборки отладки. Таким образом, при отправке push используется токен учетных данных отладки Firebase. Таким образом, вам нужно будет отправлять тип сборки на сервер FCM каждый раз, когда приложение регистрирует токен FCM.


В следующей статье содержится дополнительная информация по этой теме: Установите варианты отладки и выпуска на одном устройстве

person Maxi Rosson    schedule 28.06.2021