android 中对Resources资源的访问

简介: android 中对Resources资源的访问

android 会根据不同的硬件配置访问不同的资源文件, 这对于平台兼容来说,是一个相当重要的功能,


如, 一般的设备会说mdpi中的资源, DPI比较大的会使用hdpi, DPI小的会使用ldpi. 一般会椐据你所使用的设备的density来区分.


具体见:


http://erbo2008.iteye.com/blog/1149788



在4.0后, 更增加了sw的概念, 如sw720dp, sw600dp


http://www.cnblogs.com/melaniedeng/archive/2012/05/17/2506869.html


上面的文章讲得很详细.



下面增加的是我实现的做法.同样,修改的文件是:

frameworks/base/libs/androidfw/ResourceTypes.cpp

ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag, uint16_t density,
        uint32_t* outSpecFlags, ResTable_config* outConfig) const
{
    if (mError != NO_ERROR) {
        return mError;
    }
    const ssize_t p = getResourcePackageIndex(resID);
    const int t = Res_GETTYPE(resID);
    const int e = Res_GETENTRY(resID);
    if (p < 0) {
        if (Res_GETPACKAGE(resID)+1 == 0) {
            ALOGW("No package identifier when getting value for resource number 0x%08x", resID);
        } else {
            ALOGW("No known package when getting value for resource number 0x%08x", resID);
        }
        return BAD_INDEX;
    }
    if (t < 0) {
        ALOGW("No type identifier when getting value for resource number 0x%08x", resID);
        return BAD_INDEX;
    }
    const Res_value* bestValue = NULL;
    const Package* bestPackage = NULL;
    ResTable_config bestItem;
    memset(&bestItem, 0, sizeof(bestItem)); // make the compiler shut up
    if (outSpecFlags != NULL) *outSpecFlags = 0;
    // Look through all resource packages, starting with the most
    // recently added.
    const PackageGroup* const grp = mPackageGroups[p];
    if (grp == NULL) {
        ALOGW("Bad identifier when getting value for resource number 0x%08x", resID);
        return BAD_INDEX;
    }
    // Allow overriding density
    const ResTable_config* desiredConfig = &mParams;
    ResTable_config* overrideConfig = NULL;
    if (density > 0) {
        overrideConfig = (ResTable_config*) malloc(sizeof(ResTable_config));
        if (overrideConfig == NULL) {
            ALOGE("Couldn't malloc ResTable_config for overrides: %s", strerror(errno));
            return BAD_INDEX;
        }
        memcpy(overrideConfig, &mParams, sizeof(ResTable_config));
        overrideConfig->density = density;
        desiredConfig = overrideConfig;
    }
//以下为我增加的代码
else{
  overrideConfig = (ResTable_config*) malloc(sizeof(ResTable_config));
        if (overrideConfig == NULL) {
            ALOGE("Couldn't malloc ResTable_config for overrides: %s", strerror(errno));
            return BAD_INDEX;
        }
        memcpy(overrideConfig, &mParams, sizeof(ResTable_config));
        overrideConfig->smallestScreenWidthDp = 720;
  overrideConfig->screenWidth= 1280;
  overrideConfig->screenHeight=720;
        desiredConfig = overrideConfig;
    }
//增加代码结束
...
}


或以下做法:

frameworks/base/libs/androidfw/AssetManager.cpp

void AssetManager::updateResourceParamsLocked() const
{
    ResTable* res = mResources;
    if (!res) {
        return;
    }
    size_t llen = mLocale ? strlen(mLocale) : 0;
    mConfig->language[0] = 0;
    mConfig->language[1] = 0;
    mConfig->country[0] = 0;
    mConfig->country[1] = 0;
    if (llen >= 2) {
        mConfig->language[0] = mLocale[0];
        mConfig->language[1] = mLocale[1];
    }
    if (llen >= 5) {
        mConfig->country[0] = mLocale[3];
        mConfig->country[1] = mLocale[4];
    }
    mConfig->size = sizeof(*mConfig);
  mConfig->smallestScreenWidthDp=720;//修改sw
    res->setParameters(mConfig);
}
相关文章
|
7月前
|
网络协议 关系型数据库 MySQL
如何在Android Termux上安装MySQL并实现公网远程访问?
如何在Android Termux上安装MySQL并实现公网远程访问?
144 0
|
7月前
|
Android开发
Android网络访问超时
Android网络访问超时
58 2
|
4月前
|
XML 安全 Android开发
Flutter配置Android和IOS允许http访问
Flutter配置Android和IOS允许http访问
148 3
|
4月前
|
监控 Java 开发工具
### 绝招揭秘!Android平台GB28181设备接入端如何实现资源占用和性能消耗的极限瘦身?
【8月更文挑战第14天】本文介绍在Android平台优化GB28181标准下设备接入的性能方法,涵盖环境搭建、SDK集成与初始化。重点讲解内存管理技巧如软引用、按需加载资源,以及通过硬件加速解码视频数据和图像缩放来减轻CPU与GPU负担。同时采用线程池异步处理视频流,确保UI流畅性。这些策略有助于提高应用效率和用户体验。
56 0
|
7月前
|
Android开发
Android launcher development resources
Android launcher development resources
37 1
|
7月前
|
Java 开发工具 Android开发
如何访问 android系统hide的类或接口
如何访问 android系统hide的类或接口
306 1
|
6月前
|
XML Java API
54. 【Android教程】图片资源:Drawable
54. 【Android教程】图片资源:Drawable
97 0
|
7月前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
634 1
|
7月前
|
XML Android开发 数据安全/隐私保护
android 11后文件读写访问权限申请
android 11后文件读写访问权限申请
278 0
|
7月前
|
Android开发
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
Android源代码定制:Overlay目录定制|调试Overlay资源是否生效
357 0