Как изменить имя пакета приложения Android при сборке с помощью Gradle?

Можно ли изменить имя пакета приложения для Android с помощью Gradle?

Мне нужно скомпилировать две копии одного и того же приложения, имея уникальное имя пакета (чтобы я мог публиковать на рынке два раза).

Ответ 1

Вы могли бы что-то вроде этого

android {
    ...

    defaultConfig {
        minSdkVersion 8
        versionCode 10
    }

    flavorDimensions "flavor1", "flavor2"

    productFlavors {
        flavor1 {
            applicationId "com.example.flavor1"
            versionCode 20
        }

        flavor2 {
            applicationId "com.example.flavor2"
            minSdkVersion 14
        }
    }
}

Вы также можете изменить поле android.defaultConfig.applicationId, если хотите сделать одноразовые сборки.

Взято из: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-Flavor-Configuration

Ответ 2

В качестве более простой альтернативы использованию ароматов продукта как в ответе Ethan, вы также можете настроить типы сборки.

Как выбрать между подходами:

  • Если вам нужны разные имена пакетов, чтобы иметь как отладочные, так и выпущенные apks, установленные на устройстве, используйте ниже тип сборки, так как Gradle согласен с плагинами. В этом случае ароматы являются излишним. (Я думаю, что все проекты должны по умолчанию делать это, так как это облегчит жизнь, особенно после того, как вы опубликуете в магазине и разрабатываете новые функции.)
  • Существуют допустимые варианты использования продуктов, типичным примером которых является приложение со свободными и платными версиями. В этом случае проверьте Ответ этана и прочитайте также документацию: Конфигурирование Gradle Сборка и Gradle Руководство пользователя плагина.

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

Конфигурация типа сборки

Для типа сборки отладки и всех других типов, не относящихся к выпуску, определите applicationIdSuffix, который будет добавлен к имени пакета по умолчанию. (До Android Gradle версия плагина 0.11 эта настройка была известна как packageNameSuffix.)

android {
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            versionNameSuffix '-DEBUG'
        }

        beta {
            applicationIdSuffix '.beta'
            versionNameSuffix '-BETA'

            // NB: If you want to use the default debug key for a (non-debug) 
            // build type, you need to specify it:
            signingConfig signingConfigs.debug 
        }

        release {
            // signingConfig signingConfigs.release
            // runProguard true
            // ...
        }

    }
}

Выше, debug и release являются типами построения по умолчанию, некоторые из которых настроены, а beta - это полностью настраиваемый тип сборки. Чтобы создать разные типы, используйте assembleDebug, assembleBeta и т.д., Как обычно.

Аналогично, вы можете использовать versionNameSuffix для переопределения имени версии по умолчанию из AndroidManifest (который я считаю очень полезным!). Например. "0,8" → "0.8-BETA", как указано выше.

Ресурсы

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

Обновление (2016). С тех пор я использовал этот подход во всех своих проектах, и я думаю, что это определенно путь. Я также включил его в руководство по Android Best Practices от Futurice.

Ответ 3

При версии плагина gradle 1.0.0+ вы должны использовать applicationId, как указано в руководстве по миграции

Переименованные свойства в ProductFlavors

packageName = > applicationId

Таким образом, в вашем build.gradle вы теперь будете использовать:

productFlavors {
   flavor1 {
      applicationId "com.example.flavor1"
   }

   flavor2 {
      applicationId "com.example.flavor2"
   } 
}

Ответ 4

От ответа Ethan, как flavorGroups, так и packageName оба больше не доступны. Ниже работает с марта 2015 года.

android {
...

defaultConfig {
    minSdkVersion 8
    versionCode 10
}

flavorDimensions "flavor"

productFlavors {
    flavor1 {
        flavorDimension "flavor"
        applicationId "com.example.flavor1"
        versionCode 20
    }

    flavor2 {
        flavorDimension "flavor"
        applicationId "com.example.flavor2"
        minSdkVersion 14
    }
}
}