从gradle文件读取变量到库

时间:2019-06-17 21:54:14

标签: java android android-gradle shared-libraries

我正在写图书馆。该库通过在后台与云进行通信来发送数据。但是该库有多个用户。我有一个ID,用于标识每个应用程序(用户)。图书馆需要此ID进行通信。

我的主要问题从这里开始。当用户将我的库添加到依赖项时,我想将ID值添加到他将添加到Gradle文件并从库中获取值以确保通信的变量中。 (就像Gradle中的OneSignal AppID)

我不是要获取应用程序包ID。

但是我不知道如何添加它以及如何从库中访问此变量,我需要您的帮助。

我已经做过相关研究,但是人们尚未共享有关信息,因此我无法进行实验。在打开标题之前,我也进行了搜索,并从打开标题开始检查了相关的标题,但无法得出结论。

// 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
}

我想访问库中Gradle上定义的AppID以启用数据通信。

使用此方法,用户只需将我的库添加到依赖项中,即可使用Gradle快速定义变量。

感谢您阅读标题并给予支持。

1 个答案:

答案 0 :(得分:0)

  1. 向您的图书馆manifestPlaceholders添加build.gradle属性
apply plugin: 'com.android.library'

android {
    defaultConfig {
        ...
        manifestPlaceholders = [my_app_id: "\${my_app_id}"] // <- important backslash!!!
    }
}
  1. 使用占位符将元数据添加到您的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中。从现在开始,使用该库的每个应用都必须使用键my_app_id定义manifestPlaceholder,否则将出现清单合并错误。

  1. 您可以使用以下行从库代码访问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与占位符以进行填充。您必须在应用的build.gradle中定义my_app_id

apply plugin: 'com.android.application'

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

清单合并现在将使用应用程序中的值覆盖占位符,并且库将在应用程序包中看到已更改的值

您可以通过以下方式从这个想法克隆示例项目: https://github.com/mdawid/ManifestPlaceholderLib