Как получить значение ресурса в build.gradle?

Метод resValue (или все, что он вызывает) позволяет вам установить значение ресурса в buildTypes или productFlavors. Есть ли соответствующий способ получить значение ресурса, которое было установлено resValue?

Похоже, что productFlavors оценивается до buildTypes, поэтому a resValue, установленный в buildTypes, имеет приоритет. Я хочу добавить "Debug" к имени приложения в сборках отладки, но мне нужно получить значение, которое было настроено в цвете продукта, чтобы добавить к нему.

Изменить: Я попробовал предложение Marcin Koziński использовать переменную, но все вкусы продукта оцениваются до любого типа сборки. Поэтому это не работает:

android {
    String appName = ""

    productFlavors {
        Foo {
            appName = "Foo"
        }

        Bar {
            appName = "Bar"
        }
    }

    buildTypes {
        release {
            resValue "string", "app_name", appName 
        }

        debug {
            resValue "string", "app_name", appName + " Debug"
        }
    }
}

В buildTypes, appName всегда имеет значение из последнего вкуса продукта. Таким образом, в этом примере все сборки получают имя "Bar" или "Bar Debug".

В принципе, мне нужен resValueSuffix, аналогичный applicationIdSuffix. По-видимому, такого животного нет. Предоставляет ли плагин com.android.application все, что я мог бы использовать для достижения этого?

Ответы

Ответ 1

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

android {

    productFlavors {
        Foo {
             applicationId "com.myexample.foo"
             manifestPlaceholders = [ appName:"Foo"]
        }

        Bar {
             applicationId "com.myexample.bar"
             manifestPlaceholders = [ appName:"Bar"]
        }
    }

    buildTypes {
        release {
            manifestPlaceholders = [ appNameSuffix:""]
        }

        debug {
            manifestPlaceholders = [ appNameSuffix:".Debug"]
            applicationIdSuffix ".debug"
        }
    }
}

Затем в вашем манифесте Android вы просто используете оба заполнителя для имени вашего приложения (или других значений)

 <application
        android:label="${appName}${appNameSuffix}"
        ...
 </application>

Это позволяет вам устанавливать все 4 варианта бок о бок на одном устройстве, а также давать им разные имена в ящике/запуска приложения.

Ответ 2

Вы можете проверить варианты сборки следующим образом

Определить значения в gradle

buildTypes {
    debug{
        buildConfigField "String", "Your_string_key", '"yourkeyvalue"'
        buildConfigField "String", "SOCKET_URL", '"some text"'
        buildConfigField "Boolean", "LOG", 'true'
    }
    release {
        buildConfigField "String", "Your_string_key", '"release text"'
        buildConfigField "String", "SOCKET_URL", '"release text"'
        buildConfigField "Boolean", "LOG", 'false'

    }
}

И для доступа к этим значениям с использованием вариантов сборки:

 if(!BuildConfig.LOG)
      // do something with the boolean value

или

view.setText(BuildConfig.yourkeyvalue);

Ответ 3

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

strings.xml можно найти по следующему пути src/main/res/values, что означает его в основном наборе источников. Если вы создаете новый каталог src/debug/res/values, вы можете поместить в него новый strings.xml файл со значениями, которые должны быть переопределены в отладочных сборках. Например:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">My Application Debug</string>
</resources>

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