Чтение переменной из файла Gradle в библиотеку - PullRequest
0 голосов
/ 18 июня 2019

Я пишу библиотеку. Эта библиотека отправляет данные, общаясь с облаком в фоновом режиме. Но в библиотеке есть несколько пользователей. И у меня есть идентификатор, который используется для идентификации каждого приложения (пользователя). Библиотеке нужен этот идентификатор для связи.

Мой главный вопрос начинается здесь. Когда пользователь добавляет мою библиотеку в зависимости, я хочу добавить значение идентификатора в переменную, которую он добавит в файл Gradle, и получит значение из библиотеки, чтобы обеспечить связь. (Точно так же, как AppSignal в Gradle)

Я не спрашиваю о получении идентификатора пакета приложения ..

Но я не знаю, как добавить это и как получить доступ к этой переменной из библиотеки, мне нужна ваша помощь.

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

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Я хочу получить доступ к AppID, определенному на Gradle в библиотеке, чтобы разрешить обмен данными.

С помощью этого метода пользователи просто добавляют мою библиотеку в зависимости, и Gradle можно использовать для быстрого определения переменной.

Спасибо, что прочитали заголовок и за поддержку.

1 Ответ

0 голосов
/ 29 июня 2019
  1. Добавить manifestPlaceholders свойство в вашу библиотеку build.gradle
apply plugin: 'com.android.library'

android {
    defaultConfig {
        ...
        manifestPlaceholders = [my_app_id: "\${my_app_id}"] // <- important backslash!!!
    }
}
Добавление метаданных с заполнителем в вашу библиотеку AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.mylibrary">
    <application>
        <meta-data android:name="my_app_id" android:value="${my_app_id}" />
    </application>
</manifest>

Обратная косая черта $, и при слиянии Android будет вставлен необработанный текст ${my_app_id} в AndroidManifest.xml.Отныне каждое приложение, которое использует эту библиотеку, должно будет определять manifestPlaceholder с ключом my_app_id, иначе возникнет ошибка слияния манифеста.

Вы можете получить доступ к my_app_id из кода своей библиотеки со следующими строками:
public class MyLibrary {
    public static String init( Context context ) {
        try {
            ApplicationInfo ai = context.getPackageManager().getApplicationInfo( context.getPackageName(), PackageManager.GET_META_DATA );
            return (String)ai.metaData.get( "my_app_id" );
        } catch ( PackageManager.NameNotFoundException e ) {
            //TODO: handle exception
        }
...
}

Когда ваше приложение включает библиотеку, оно также объединит AndroidManifest.xml с заполнителем для заполнения.Вы должны определить my_app_id внутри build.gradle вашего приложения

apply plugin: 'com.android.application'

android {
    defaultConfig {
        ...
        manifestPlaceholders = [my_app_id: "686adbd9-c3c4-458d-ab8c-d549f5d71de3"]
    }

Слияние манифеста теперь перезапишет заполнитель значением из приложения, и библиотека увидит измененное значение в пакете приложения

Вы можете клонировать пример проекта с этой идеей из: https://github.com/mdawid/ManifestPlaceholderLib

...