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); }