framework-res.apk覆盖编译方式由rro替换为sro

发布时间:2026-09-28 17:04:52 浏览次数:0

以下是关于“framework-res.apk覆盖编译方式由rro替换为sro”的完整攻略,包含两个示例。

背景

在Android应用程序中,framework-res.apk是一个非常重要的文件,它包含了许多系统资源,例如布局、字符串、颜色等。在Android应用的开发过程中,我们经常需要修改这些资源,以满足应用程序的需求。为了修改这些资源,我们需要对framework-res.apk进行覆盖编译。在Android 9之前,我们使用的是RRO(Runtime Resource Overlay)覆盖编译方式。但是,在Android 9及以后版本中,Google引入了SRO(Static Resource Overlay)覆盖编译方式,以取代RRO。

RRO和SRO的区别

RRO和SRO都是覆盖编译方式,它们的主要区别在于编译时机和编译方式。

  • RRO:在应用程序安装时,系统会将framework-res.apk中的资源打包成一个Overlay包,然后与应用程序一起安装。在运行时,系统会根据需要加载Overlay包,并将其应用于应用程序中。
  • SRO:在编译应用程序时,系统会将framework-res.apk中的资源打包成一个Overlay包,并将其与应用程序一起打包成APK文件。在运行时,系统不需要再加载Overlay包,因为所有的资源都已经包含在APK文件中了。

将RRO替换为SRO的步骤

要将RRO替换为SRO,我们需要执行以下步骤:

  1. 修改Android.mk文件,以使用SRO编译方式。
  2. 修改AndroidManifest.xml文件,以声明Overlay包。
  3. 修改build.gradle文件,以启用SRO编译方式。

以下是两个示例:

示例1:使用SRO编译framework-res.apk

在Android.mk文件中,我们需要将LOCAL_RESOURCE_DIR变量设置为frameworks/base/core/res,并将LOCAL_RESOURCE_DIR变量设置为frameworks/base/core/res/res-overlay。这将告诉系统使用SRO编译framework-res.apk。

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := framework-resLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/../../core/resLOCAL_AAPT_FLAGS := --auto-add-overlayLOCAL_PACKAGE_NAME := framework-resLOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE)

在AndroidManifest.xml文件中,我们需要声明Overlay包。我们可以使用<overlay>元素来声明Overlay包,如下所示:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.android.framework.res"    android:versionCode="1"    android:versionName="1.0">    <overlay        android:targetPackage="android"        android:priority="1"        android:isStatic="true"        android:requiredSystemPropertyName="ro.build.version.sdk"        android:requiredSystemPropertyValue="31" /></manifest>

在build.gradle文件中,我们需要启用SRO编译方式。我们可以在defaultConfig块中设置resConfigs属性,如下所示:

android {    compileSdkVersion 31    buildToolsVersion "31.0.0"    defaultConfig {        applicationId "com.example.myapp"        minSdkVersion 21        targetSdkVersion 31        versionCode 1        versionName "1.0"        resConfigs "en", "fr", "de"    }}

示例2:使用SRO编译自定义应用程序

在自定义应用程序中,可以使用SRO编译方式来覆盖framework-res.apk中的资源。以下是一个示例:

android {    compileSdkVersion 31    buildToolsVersion "31.0.0"    defaultConfig {        applicationId "com.example.myapp"        minSdkVersion 21        targetSdkVersion 31        versionCode 1        versionName "1.0"        resConfigs "en", "fr", "de"    }    sourceSets {        main {            res.srcDirs = [                'src/main/res',                '../../core/res/res-overlay'            ]        }    }}

在这个示例中,我们将res.srcDirs属性设置为src/main/res和../../core/res/res-overlay。这将告诉系统使用SRO编译应用程序,并将Overlay包包含在APK文件中。

结论

将RRO替换为SRO是一个简单的过程,只需要修改Android.mk、AndroidManifest.xml和build.gradle文件即可。使用SRO编译方式可以提高应用程序的性能和稳定性,因为所有的资源都已经包含在APK文件中了。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477