2016-10-07 5 views
4

У меня есть проект с несколькими вкусами, который построен CI и опубликован в HockeyApp. Каждый аромат имеет ApplicationID и apiToken, которая хранится в самой аромата (чтобы сохранить все важные переменные в одном месте):Создайте и получите доступ к переменным productFlavor в файле android build.gradle

def token = null 

    productFlavors { 

    prod { 
     applicationId "de.example.appname" 

     buildConfigField 'String', 'FLAVOR_ID', '"0"' 
     buildConfigField 'String', 'HOCKEY_APP_ID', '"1234567890"' 

     token = "1q2w3e4r5t6z7u8i9o0p" 
    } 

    demo { 
     applicationId "de.example.appname.demo" 

     buildConfigField 'String', 'FLAVOR_ID', '"1"' 
     buildConfigField 'String', 'HOCKEY_APP_ID', '"987654321"' 

     token = "p0o9i8u7z6t5r4e3w2q1" 
    } 
} 

На том же уровне, как «productFlavors» Есть hockeyApp-настройки:

hockeyapp { 
     apiToken = token 
     releaseType = 0 
     notify = 0 
     status = 1 
     notesType = 1 
     notes = "Uploaded with gradle" 
    } 

Для отладки кода я построить & загрузить .apk-файл с помощью терминала:

./gradlew uploadProdReleaseToHockeyApp [...] 

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

Ошибка ответа от HockeyApp: приложение не может быть создано.

потому что град пытается загрузить прод-аромат с помощью демонстрационного токена.

Вот некоторые дополнительные основные данные:

compileSdkVersion 24 
buildToolsVersion "24.0.1" 
compile 'net.hockeyapp.android:HockeySDK:4.0.0' 
classpath 'com.android.tools.build:gradle:2.1.3' 
classpath 'de.felixschulze.gradle:gradle-hockeyapp-plugin:3.5' 

на основе моих требований, есть решение для определения аромата-переменных и доступа к ним в показанном образом?

+0

Это похоже на [этот неотвеченный вопрос] (http://stackoverflow.com/questions/35956182/is-there-a-way-to-change-gradle-variable-value-based-on-selected-productflavor ? RQ = 1). См. Также [эту тему] (http://stackoverflow.com/questions/17197636/is-it-possible-to-declare-a-variable-in-gradle-usable-in-java), которая может обеспечить решение. –

+0

Привет, я нашел какое-либо решение? Я ищу то же самое. – iMDroid

+0

@iMDroid взгляните на мой правильный заметный ответ ;-) – JU5T1C3

ответ

1

В этом особом случае я нашел следующий ответ:

Добавьте hockeyapp-задачу с изменениями, необходимых

hockeyapp { 
    apiToken = "not_required" 
    releaseType = 0 
    notify = 0 
    status = 2 
    teams = 1234 
    notesType = 1 
} 

На следующем этапе добавить аромат на основе Gradle задач модифицируют вам apiToken hockeyapp в:

task setDevReleaseApiToken << { 
    hockeyapp.apiToken = "1234567890abcdefghijklmnopqrstuvwxyz" 
} 

task setProdReleaseApiToken << { 
    hockeyapp.apiToken = "1234567890abcdefghijklmnopqrstuvwxyz" 
} 

Эти задачи называются в whenTaskAdded -task Gradle, вы можете просто «отменить» это так:

tasks.whenTaskAdded { task -> 
    if (task.name == 'uploadDevReleaseToHockeyApp') { 
     task.dependsOn 'setDevReleaseApiToken' 
    } else if (task.name == 'uploadProdReleaseToHockeyApp') { 
     task.dependsOn 'setProdReleaseApiToken' 
    } 
} 

Everytime задача uploadDevReleaseToHockeyApp называется (вручную или CI ..) задача setDevReleaseApiToken называется и связанное с ним apiToken назначаются.

При необходимости продлите эту схему для всех других ароматов!

0

Хотя ОП может больше не искать ответа, кто-то другой может наткнуться на этот поток (как я это делал, когда я имел дело с этой проблемой), поэтому я хотел бы поделиться решением.

Я имел дело с переменными, влияющими на процедуру самого градиента (а не на исходный код), поэтому я не мог использовать resValue или buildConfigField.

Эта проблема может быть решена с помощью файла настроек .gradle. Этот файл выполняется перед build.gradle, так что вы можете подготовить все переменные, используя это условие:

include ':project...' 
rootProject.name = 'name...' 

def VARIANT1 = "YourFlavorName"; 
     if((gradle.startParameter.taskNames.contains(":assemble"+VARIANT1+"Debug"))|| 
    (gradle.startParameter.taskNames.contains(":assemble"+VARIANT1+"Release")) 
     || 
    (gradle.startParameter.taskNames.contains(":generate"+VARIANT1+"DebugSources"))||(gradle.startParameter.taskNames.contains(":generate"+VARIANT1+"ReleaseSources"))) { 
      gradle.ext.variable = value 
      gradle.ext.var... 
      } 

Это немного работы вокруг, но то, что это делает он проверяет команды сборки, данные вашей Android Studio и ищет имя аромата внутри. Условия с «: generate» предназначены только для Building, «: assebmle» - для запуска приложения на устройстве.

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

myVariable = gradle.ext.variable 

Это должно быть сделано.