快速提示:使用运行时资源叠加框架主题Android
没有多少人知道它,谷歌很少宣传它,但Android操作系统已经内置了一个主题框架几年了。它被称为Runtime Resource Overlay框架,简称RRO,它大大减少了为手机创建自定义主题所需的工作量。
使用RRO,您可以快速创建可以改变几乎安装在Android设备上的每个应用程序的外观和感觉的主题。由于Android的系统用户界面组件(包括导航栏,状态栏,通知托盘和快速设置托盘)本身属于某个应用程序,因此您也可以更改其外观。最好的部分是你不必编写任何Java代码。
你问的问题是什么?好吧,该框架只能由特权应用程序使用。更具体地说,通过安装在只能由root用户访问的位置的应用程序,或者由创建自定义ROM的人员安装的应用程序。
在这个快速提示中,我将向您展示如何使用框架创建一个简单的主题,以更改快速设置托盘的外观。
一 先决条件
为了能够跟进,您需要以下内容:
- 运行Android Marshmallow或更高版本的Android模拟器
- 最新版本的Android SDK
二 RRO真的做了什么?
虽然Android应用程序的业务逻辑是用Java或Kotlin编写的,但其用户界面主要是使用XML文件创建的。一个编写良好的Android应用程序将具有单独的XML资源,用于定义其布局,颜色,字符串和属性。顾名思义,RRO框架允许您使用自己的自定义XML资源覆盖这些XML资源。但是,它不仅限于XML资源。它还允许您更改应用程序的drawable和字体。
使用RRO框架的应用程序通常不包含任何Java代码。它仅由XML文件组成,如果需要,还包含字体和图像。然而,与所有Android应用程序一样,它必须是有效且已签名的APK。
1.创建一个新项目
我们不需要Android Studio来创建使用RRO框架的项目。目前,您只需要一个新的项目目录和一个AndroidManifest.xml 文件。您可以使用文件浏览器或终端自由创建它们。
mkdir MyOverlays && cd MyOverlays
touch AndroidManifest.xml
清单文件必须包含应用程序的包名称,以及要为其创建叠加层的应用程序的包名称。因为我们今天要更改快速设置托盘的外观,所以我们必须使用com.android.systemui 目标包名称。
`<?``xml` `version``=``"1.0"` `encoding``=``"utf-8"``?>`
`<``manifest`
`xmlns:android``=``"[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"`
`package``=``"com.tutsplus.myoverlays"``>`
`<``overlay` `android:targetPackage``=``"com.android.systemui"`
`android:priority``=``"1"``/>`
`</``manifest``>`
此时,我们已准备好开始使用快速设置托盘以及Android系统UI的任何其他组件。
2.创建主题
要覆盖目标应用程序的资源,您的应用程序必须具有同名的资源。例如,如果要更改目标应用程序的颜色,你通常必须覆盖其colors.xml 文件用自己的colors.xml 文件。
为了方便您,RRO框架不希望叠加层是全面的,并且能够处理原始资源中存在的所有细节。换句话说,您的叠加层只需要包含您想要更改的细节。
为了使事情更清楚,假设我们想要将快速设置托盘的背景颜色从默认的蓝灰色更改为深橙色。颜色的值 在系统UI应用程序的res / values / colors.xml文件中指定。如果您对其内容感到好奇,可以查看 官方Android Git存储库中的文件。
要更改颜色,您现在必须 在项目中创建res / values / colors.xml文件。
mkdir -p res/values
touch res/values/colors.xml
在colors.xml 文件中,要更改托盘的背景颜色,我们必须定位一个名为的颜色system_primary_color。因此,将以下XML添加到文件中:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="system_primary_color">#FFBF360C</color>
<!-- deep orange 900 -->
</resources>
值得注意的是,上述XML与使用Android Studio创建普通应用时使用的XML没有什么不同。
我们的简单主题准备就绪!如果需要,可以<color> 向文件添加更多标签以更改系统UI的其他颜色。
3.生成APK
我们现在将使用Android资产包装工具(aapt 简称Android SDK),将简单项目转换为Android平台可以使用的APK文件。
要生成APK,您只需指向aapt 清单文件,res 目录和目标平台的android.jar 文件即可。当然,您还必须指定要为APK文件指定的名称。
aapt package -M AndroidManifest.xml -S res/ \
-I ~/Android/Sdk/platforms/android-23/android.jar \
-F myoverlays.apk.u
在上面的命令中,您可以看到我已选择将APK文件命名为myoverlays.apk.u。那是因为我们的APK目前都是未签名且未对齐的。
要签名,您必须使用该jarsigner 工具。目前,我建议您使用默认的Android调试密钥库对其进行签名。
jarsigner -keystore ~/.android/debug.keystore \
myoverlays.apk.u androiddebugkey
最后,您必须使用该zipalign 工具对齐并优化APK 。作为输入,该工具需要未对齐和对齐的APK的名称,以及指定对齐边界的数字。截至2017年,这个数字可能只是4。
zipalign 4 myoverlays.apk.u myoverlays.apk
4.安装APK
要安装使用RRO框架的APK,您只需将其放在/ system / vendor / overlay 目录中即可。默认情况下,该目录属于只读文件系统,只能由root用户访问。如果您是自定义ROM开发人员,或者已植根Android设备,则安装APK时应该没有问题。
但是,在这个快速提示中,我将向您展示如何在模拟器上安装APK。这样,您可以在不危及手机的情况下测试叠加层。
首先使用emulator 命令行工具在可写文件系统模式下启动模拟器 。
emulator -avd Nexus_5X_API_23 -writable-system
您现在可以使用该adb 工具在模拟器上获得root权限(如果您还没有)。
adb root
接下来,将/ system 文件系统重新安装为可写,再次使用adb。
adb remount
该/系统/供应商/覆盖 目录上不存在仿真器。您必须自己手动创建它。最简单的方法是在模拟器上启动一个shell。
adb shell
mkdir -p /system/vendor/overlay
exit
最后,使用APK将APK推送到目录adb。
adb push myoverlays.apk /system/vendor/overlay
等待Android几秒钟以检测并安装APK,然后重新启动模拟器以使主题生效。
重新启动后,如果您拉下快速设置托盘,您应该能够看到正在运行的主题。
应用主题前后的快速设置托盘结论
在本快速提示中,您学习了如何使用Runtime Resource Overlay框架为Android创建主题。虽然我们创建的主题非常简单,但您可以应用您今天获得的技能来创建更复杂的主题。例如,您可以覆盖strings.xml 文件以更改应用程序显示的UI元素的标签。同样,您可以覆盖dimens.xml 文件以更改应用程序UI元素的大小。
有关RRO框架的文档非常缺乏。尽管如此,通过研究Android平台的源代码,你可以了解很多。
当你在这里时,请查看我们在Android开发上的其他一些帖子!