自定义Android资源覆盖rro方案
转载来源http://blog.csdn.net/whurs/article/details/53453702
1. framework层rro资源覆盖方案
before:
static void android_content_AssetManager_init(JNIEnv* env, jobject clazz, jboolean isSystem)
{if (isSystem) {// Load frameworks-res.apk's overlay through regionalization environmentif (Environment::isSupported()) {Environment* environment = new Environment();if (environment != NULL) {const char* overlay_dir = environment->getOverlayDir();if (overlay_dir != NULL && strcmp(overlay_dir, "") != 0) {ALOGD("Regionalization - getOverlayDir:%s", overlay_dir);verifySystemIdmaps(overlay_dir);}delete environment;}}verifySystemIdmaps(AssetManager::OVERLAY_DIR);}AssetManager* am = new AssetManager();if (am == NULL) {jniThrowException(env, "java/lang/OutOfMemoryError", "");return;}am->addDefaultAssets();ALOGV("Created AssetManager %p for Java object %p\n", am, clazz);env->SetLongField(clazz, gAssetManagerOffsets.mObject, reinterpret_cast(am));
} - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
static void android_content_AssetManager_init(JNIEnv* env, jobject clazz, jboolean isSystem) {if (isSystem) {// Load frameworks-res.apk's overlay through regionalization environmentif (Environment::isSupported()) {Environment* environment = new Environment();if (environment != NULL) {const char* overlay_dir = environment->getOverlayDir();if (overlay_dir != NULL && strcmp(overlay_dir, "") != 0) {ALOGD("Regionalization - getOverlayDir:%s", overlay_dir);verifySystemIdmaps(overlay_dir);}delete environment;}}
//在此处加入我们自己想要定制的overlay目录if (customed) {//判断是否自定义overlay目录char customed_overlay_dir[FILENAME_MAX] = {0};char rro_ui[PROPERTY_VALUE_MAX];//get ui schemes by property valueproperty_get("persist.customed.ui.rro.current", rro_ui, "");//whether rro_ui value is nullif (strlen(rro_ui) > 0) {memset(customed_overlay_dir, 0, FILENAME_MAX);snprintf(customed_overlay_dir, FILENAME_MAX, "/vendor/Customedoverlay/%s", rro_ui);customed_overlay_dir[FILENAME_MAX - 1] = '\0';struct stat info;//check whether customed_overlay_dir is a directoryif(stat(customed_overlay_dir, &info) == 0 && S_ISDIR(info.st_mode))//if the property value equals "overlay", we will user the origin default directory.if(!strcmp("overlay", rro_ui))verifySystemIdmaps(customed_overlay_dir);elseverifySystemIdmaps(AssetManager::OVERLAY_DIR);elseverifySystemIdmaps(AssetManager::OVERLAY_DIR);}} else {verifySystemIdmaps(AssetManager::OVERLAY_DIR);}}AssetManager* am = new AssetManager();if (am == NULL) {jniThrowException(env, "java/lang/OutOfMemoryError", "");return;}am->addDefaultAssets();ALOGV("Created AssetManager %p for Java object %p\n", am, clazz);env->SetLongField(clazz, gAssetManagerOffsets.mObject, reinterpret_cast(am));
} - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
if (customed) {//判断是否自定义overlay目录- 1
- 1
2. App层rro资源覆盖方案
before:
// Collect vendor overlay packages.
// (Do this before scanning any apps.)
// For security and version matching reason, only consider
// overlay packages if they reside in VENDOR_OVERLAY_DIR.
File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
scanDirTracedLI(vendorOverlayDir, mDefParseFlags| PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR| PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
// Collect vendor overlay packages.
// (Do this before scanning any apps.)
// For security and version matching reason, only consider
// overlay packages if they reside in VENDOR_OVERLAY_DIR.
File vendorOverlayDir;
if(customed) {String CUMTOMED_OVERLAY_DIR = VENDOR_OVERLAY_DIR;String rroUi = SystemProperties.get("persist.customed.ui.rro.current");Slog.d(TAG, "**rroUi**:" + rroUi);if(rroUi != null && !rroUi.equals("")) {try {String tmpOverlay = "/vendor/Customedoverlay/" + rroUi;File tmpFile = new File(tmpOverlay);if(tmpFile.isDirectory() && !rroUi.equals("overlay")) {CUMTOMED_OVERLAY_DIR = tmpOverlay;}} catch (Exception ex) {Slog.e(TAG, "Failed to set CPoverlay dir: " + ex.getMessage());}}vendorOverlayDir = new File(CUMTOMED_OVERLAY_DIR);
} else {vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
}
scanDirTracedLI(vendorOverlayDir, mDefParseFlags| PackageParser.PARSE_IS_SYSTEM| PackageParser.PARSE_IS_SYSTEM_DIR| PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0);- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
static const char* OVERLAY_DIR = "/system/vendor/overlay";const char* Environment::getOverlayDir(void)
{if (mPackagesCount != 0 && mStoragePos != NULL && mPackages != NULL) {for (int i = mPackagesCount-1; i >= 0; i--) {memset(mMediaFile, 0, PATH_MAX);strlcpy(mOverlayDir, mStoragePos, PATH_MAX);strlcat(mOverlayDir, "/", PATH_MAX);strlcat(mOverlayDir, mPackages[i], PATH_MAX);strlcat(mOverlayDir, OVERLAY_DIR, PATH_MAX);if (kIsDebug) {ALOGD("Environment::getOverlayDir() = %s\n", mOverlayDir);}// Check if PackageFrameworksRes dir exists.char overlayFile[PATH_MAX];memset(overlayFile, 0, PATH_MAX);strlcpy(overlayFile, mOverlayDir, PATH_MAX);strlcat(overlayFile, "/", PATH_MAX);strlcat(overlayFile, mPackages[i], PATH_MAX);strlcat(overlayFile, "FrameworksRes", PATH_MAX);if (access(overlayFile, R_OK) == 0) {if (kIsDebug) {ALOGD("Environment::getOverlayDir() - overlayFile exists!\n");}return mOverlayDir;}}}return NULL;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
if (isSystem) {// Load frameworks-res.apk's overlay through regionalization environmentif (Environment::isSupported()) {Environment* environment = new Environment();if (environment != NULL) {const char* overlay_dir = environment->getOverlayDir();if (overlay_dir != NULL && strcmp(overlay_dir, "") != 0) {ALOGD("Regionalization - getOverlayDir:%s", overlay_dir);verifySystemIdmaps(overlay_dir);}delete environment;}}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13

- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
static const char* OVERLAY_DIR = "/system/vendor/Customedoverlay";- 1
- 1
# Link /vendor to /system/vendor for devices without a vendor partition.
symlink /system/vendor /vendor- 1
- 2
- 1
- 2
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
