Android配置文件

Beg*_*ner 39 configuration android configuration-files

什么是最好的方法以及如何为应用程序设置配置文件?

我希望应用程序能够查看SD卡上的文本文件并选择它需要的某些信息?

gri*_*rim 80

如果您的应用程序将向公众发布,并且如果您的配置中包含敏感数据(如API密钥或密码),我建议使用安全首选项而不是SharedPreferences,因为最终SharedPreferences以明文形式存储在XML中一个有根的手机,应用程序很容易访问另一个人的共享首选项.

默认情况下,它不是防弹安全性(实际上它更像是对首选项进行模糊处理),但它可以让您的Android应用程序更加安全.例如,它会阻止用户在root用户设备上轻松修改应用的共享首选项.(链接)

我会建议一些其他方法:

方法1:使用带有属性的*.properties文件

优点:

  1. 可以从您正在使用的任何IDE轻松编辑
  2. 更安全:因为它是使用您的应用程序编译的
  3. 如果使用Build variants/Flavors,可以轻松覆盖
  4. 您也可以在配置中写入

缺点:

  1. 你需要一个上下文
  2. 你也可以在配置中写(是的,它也可以是骗局)
  3. (还要别的吗?)

首先,创建一个配置文件:res/raw/config.properties并添加一些值:

api_url=http://url.to.api/v1/
api_key=123456
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下内容轻松访问值:

package some.package.name.app;

import android.content.Context;
import android.content.res.Resources;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public final class Helper {
    private static final String TAG = "Helper";

    public static String getConfigValue(Context context, String name) {
        Resources resources = context.getResources();

        try {
            InputStream rawResource = resources.openRawResource(R.raw.config);
            Properties properties = new Properties();
            properties.load(rawResource);
            return properties.getProperty(name);
        } catch (Resources.NotFoundException e) {
            Log.e(TAG, "Unable to find the config file: " + e.getMessage());
        } catch (IOException e) {
            Log.e(TAG, "Failed to open config file.");
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

String apiUrl = Helper.getConfigValue(this, "api_url");
String apiKey = Helper.getConfigValue(this, "api_key");
Run Code Online (Sandbox Code Playgroud)

当然,这可以优化一次读取配置文件并获取所有值.

方法2:使用AndroidManifest.xml 元数据元素:

就个人而言,我从未使用过这种方法,因为它似乎不太灵活.

在你的AndroidManifest.xml添加内容中:

...
<application ...>
    ...

    <meta-data android:name="api_url" android:value="http://url.to.api/v1/"/>
    <meta-data android:name="api_key" android:value="123456"/>
</application>
Run Code Online (Sandbox Code Playgroud)

现在是一个检索值的函数:

public static String getMetaData(Context context, String name) {
    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        Bundle bundle = ai.metaData;
        return bundle.getString(name);
    } catch (PackageManager.NameNotFoundException e) {
        Log.e(TAG, "Unable to load meta-data: " + e.getMessage());
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

用法:

String apiUrl = Helper.getMetaData(this, "api_url");
String apiKey = Helper.getMetaData(this, "api_key");
Run Code Online (Sandbox Code Playgroud)

方法3:buildConfigField在你的味道中使用:

我没有在官方Android文档/培训中找到这个,但这篇博客文章非常有用.

基本上设置一个项目Flavor(例如prod)然后在你的应用程序中build.gradle有类似的东西:

productFlavors {
    prod {
        buildConfigField 'String', 'API_URL', '"http://url.to.api/v1/"'
        buildConfigField 'String', 'API_KEY', '"123456"'
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

String apiUrl = BuildConfig.API_URL;
String apiKey = BuildConfig.API_KEY;
Run Code Online (Sandbox Code Playgroud)


Mud*_*sir 8

如果您想存储应用程序的首选项,Android会为此提供SharedPreferences.
这是官方培训资源的链接.

  • 是的,我需要一种方法来存储外部配置数据.我不希望它们存储在内部 (4认同)

Ren*_*eno 7

您可以使用共享首选项实现此目的

关于如何在Google Android页面上使用共享首选项的详细指南 https://developer.android.com/guide/topics/data/data-storage.html#pref

  • 共享首选项不能像配置文件一样工作。 (4认同)
  • 哦,我想到共享偏好,如全局变量而不是配置文件,你可以看到我来自网络开发背景而不是移动:) (3认同)
  • 如何将共享首选项用作配置源?我将配置视为一些"硬编码"文件(json,xml等),其中开发人员设置数据将在应用程序中使用.共享首选项可能包含您在应用程序中生成的数据,但它们如何在其中包含预设数据? (3认同)
  • 共享首选项文本文件的任何示例,以及访问此文件的活动? (2认同)