Как настроить дополнительные свойства для загрузки при инициализации приложения Android? - PullRequest
0 голосов
/ 09 мая 2018

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

Что я хочу сделать:

@Override
protected void onCreate(Bundle bundle) {
    R.urls.SERVER_URL; // is it a valid approach using resources?
}

Есть ли способ переключения сред (dev, prod, test) без изменения кода?

Каков наилучший подход для реализации этого поведения?

Есть ли способ настроить его в playstore моей переменной (SERVER_URL) или я должен реализовать только в коде?

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

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

Если ваша цель - изменить этот URL-адрес, не касаясь кода, вы можете привязать это значение во время компиляции. Вы можете создать файл application.properties и изменить этот файл для различных целевых сборок (dev, production, test). В вашем коде вы можете читать значения из файла свойств вместо жестко закодированных значений. Вы можете поместить этот файл в папку assets и применить необходимую обфускацию. Таким образом, изменяется только файл свойств, а безопасность вашего приложения остается неизменной.

Другим способом было бы предоставить этот параметр во время сборки (когда вы выполняете команду gradlew). Вы можете добавить параметры командной строки, которые будут добавлены в BuildConfig. В своем коде вы можете просто ссылаться на URL, вызывая BuildConfig.SERVER_URL. Вы можете следовать этому SO для достижения этого.

В любом случае я бы порекомендовал вам связать это значение во время компиляции.

0 голосов
/ 09 мая 2018

Есть 2 способа сделать это:

1 / По string ресурсу, который вы хотите

Добавьте файл ресурса с именем secret_keys.xml или любое другое имя, чтобы отделить его от файла других ресурсов. Поместите свои ключи, конечные точки API здесь как обычный строковый ресурс, не забудьте добавить translatable="false", если вы не хотите связываться с локализацией.

Поместите этот файл в app/debug/res/values/. Создайте новую папку debug, если она не существует. Сделайте то же самое для staging или release, Android автоматически будет использовать папку с тем же именем, что и тип сборки.

2 / По properties файлам

Создайте 3 файла .properties и поместите ключи внутри: enter image description here

HOST="http://api.blablabla.com"
CLIENT_ID="hahaha"
CLIENT_SECRET="hehehe"

Свяжите его с переменной BuildConfig в своем приложении build.gradle, сделайте то же самое для других типов сборки:

def getPropertiesFile = { path ->
    Properties properties = new Properties()
    properties.load(new FileInputStream(file(path)))
    return properties
}

android {
    ...

    buildTypes {
        debug {
            ...

            getPropertiesFile('./config/development.properties').each { p ->
                buildConfigField 'String', p.key, p.value
            }
        }
        ...
    }
}

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

UPDATE

Игнорировать эти файлы конфигурации в .gitignore:

app/config
secret_keys.xml
0 голосов
/ 09 мая 2018

Вы не можете этого сделать.

Обычно для этого вы устанавливаете веб-службу с фиксированным внутренним интерфейсом, которая возвращает ваш SERVER_URL, где вы будете использовать API из своего приложения при запуске.

...