Каким должно быть имя пакета в main / AndroidManifest.xml при работе с ароматами продукта?

В моем build.gradle есть два вида продукта:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.2"
    aaptOptions.setProperty("cruncherEnabled", false)

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 16
        applicationId "com.example.app"
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    def final myApplicationId = 'com.example.app'
    def final appName = 'app'

    productFlavors {
        dev {

            resValue "string", "app_name", appName
            resValue "string", "APIURL", "http://prod.example.com/"
        }
        production {

            resValue "string", "app_name", appName
            resValue "string", "APIURL", "http://test.example.com/"
        }
    }
    buildTypes{
        dtest {
            applicationIdSuffix ".dev"
        }
        dprod{

        }
    }
}



dependencies {
    compile()
    few libraries
}

мой dev / AndroidManifest.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app.dev"
    android:installLocation="auto"
    android:versionCode="3"
    android:versionName="3.1">

</manifest>

а мой production / AndroidManifest.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app"
    android:installLocation="auto"
    android:versionCode="3"
    android:versionName="3.1">

</manifest>

мой main / AndroidManifest.xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app"
    android:installLocation="auto"
    android:versionCode="3"
    android:versionName="3.1">
    <application>
          <activity list.. </activity>
    </application>
</manifest>

Я хочу установить версию для разработки и производства на одном устройстве, но я не могу изменить имя пакета, даже если я установил другой applicationId. Я подозреваю, что имя пакета, которое я упомянул в основном манифесте, тем или иным образом переопределяет applicationId из build.gradle. Буду признателен, если кто-нибудь укажет мне правильное направление. Спасибо.


person 1binary0    schedule 18.02.2016    source источник


Ответы (1)


Вместо того, чтобы устанавливать это в productFlavors, добавьте это в buildTypes

Использовать

buildTypes {
    debug {
        applicationIdSuffix ".dev"
        // Rest of the code block
    }

    release {
        // your code block
    }
}

Обновить

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.2"
    aaptOptions.setProperty("cruncherEnabled", false)

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 16
        applicationId "com.example.app"
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }

    buildTypes {
        debug{
            applicationIdSuffix ".dev"
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    productFlavors {
        dev {

            resValue "string", "app_name", appName
            resValue "string", "APIURL", "http://prod.example.com/"
        }
        production {

            resValue "string", "app_name", appName
            resValue "string", "APIURL", "http://test.example.com/"
        }
    }
}



dependencies {
    compile()
    few libraries
}
person Rohit5k2    schedule 18.02.2016
comment
И где мне добавить другие URL-адреса API? У меня есть два разных URL-адреса API для разработки и производственной версии. Позвольте мне обновить вопрос еще раз для полного кода productFlavors - person 1binary0; 18.02.2016
comment
Вы пробовали то, что я предлагал? У меня он отлично работает. В моем приложении 9 вкусов. - person Rohit5k2; 18.02.2016
comment
Для этого нужно, чтобы APK был подписан, есть ли другой способ разработки apk без его подписания только для тестирования? - person 1binary0; 18.02.2016
comment
Каждый apk подписан. Отладка с ключом отладки по умолчанию, который выполняется автоматически. - person Rohit5k2; 18.02.2016
comment
Теперь у меня есть 8 вариантов в варианте сборки, и когда я пытаюсь установить отладку разработчика, он устанавливается, но для установки производственной отладки он говорит, что вам придется удалить отладку разработчика. - person 1binary0; 18.02.2016
comment
Вы можете опубликовать полную build.gradle? - person Rohit5k2; 18.02.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person 1binary0; 18.02.2016
comment
Пожалуйста, посмотрите мое обновление. Замените свой build.gradle на этот. Сделайте резервную копию своих - person Rohit5k2; 18.02.2016
comment
Пробовал ваше обновленное решение, но типы сборки отладки и производства перезаписывают друг друга. - person 1binary0; 19.02.2016
comment
Я использую аналогичный файл Gradle, и он работает для меня. Но есть два отличия. 1. У моего gradle нет applicationId в defaultConfig и 2. У меня есть только один файл манифеста (в основной папке). Это вносит эти изменения. - person Rohit5k2; 19.02.2016
comment
Пробовал и это, теперь, если установлен dev, он не устанавливает выпуск prod, и наоборот. - person 1binary0; 19.02.2016
comment
Я не понимаю. Нам здесь чего-то не хватает, потому что у меня работает то же самое. - person Rohit5k2; 19.02.2016