Google Play говорит: "Вам нужно использовать другое имя пакета" - почему?

Я уже опубликовал приложение com.mycompany.mygame в google play.

Затем я решил опубликовать его бесплатную версию. Я не изменил имя пакета в eclipse, потому что заметил, что в процессе "экспорта" у вас есть возможность установить конечный apk как что угодно. Поэтому я установил его там как com.mycompany.mygameaf - обратите внимание на дополнительный "af" в конце. Но затем, когда он попытался загрузить его на рынок, Google сказал:

Вам нужно использовать другое имя пакета, потому что "com.mycompany.mygame" уже используется одним из ваших других приложений

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

Каков самый простой способ разрешить это?

Ответ 1

Независимо от имени файла .apk, имя пакета содержимого приложения внутри него должно быть уникальным.

Вы можете использовать refactor-rename, чтобы изменить это, но убедитесь, что это изменение проникает в файл манифеста, конфигурацию proguard и т.д.

Ответ 2

Помимо исправления имени приложения в манифесте, мне также пришлось изменить applicationId в файле приложения gradle.build.

 defaultConfig {
    applicationId "com.example.changednameofmyapp"
    ...
}

Кроме того, если вы используете ProGuard, не забудьте изменить соответствующие правила в вашем proguard-rules.pro

Просто найдите старое имя пакета во всем проекте и измените его.

Ответ 3

Имя APK не имеет значения, это имя пакета в файле AndroidManifest, который учитывается.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.yourcompany.yourapp"

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

Ответ 4

Имя пакета в манифесте используется для идентификации приложения на Android и в Google Play. Поэтому разные приложения нуждаются в разных именах.

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

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

Ответ 5

Имя файла APK не имеет значения, имя пакета вашего приложения используется как уникальный идентификатор - оно находится в корневом элементе в AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.packagename"
   android:versionCode="1"
   android:versionName="1.0" >

Когда вы сначала создаете свой проект в Eclipse, он создает фактическую структуру пакета, которая соответствует этому имени пакета для размещения исходных файлов.

Фактически вы можете набирать имя своего пакета, изменяя это значение манифеста, и вы можете просто сохранить структуру папок/пакетов как есть - ему не нужно соответствовать вашему фактическому имени пакета приложений.

В качестве альтернативы, щелкните правой кнопкой мыши ваш проект в Eclipse, перейдите в "Инструменты Android", а затем выберите "Переименовать пакет приложений"

После этого вы сможете отправить свой двоичный файл

Ответ 6

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

Вы также можете играть с новой системой сборки Gradle (в Android Studio), которая позволяет динамически устанавливать такие вещи, как имя пакета во время выполнения. Он также позволяет вам переключать ресурсы во время сборки, что чрезвычайно удобно; У вас может быть boolean resource, который показывает, является ли текущее приложение платной версией. Это позволяет включать/отключать функции приложения на основе проверки этого значения.