快速提示:使用运行时资源叠加框架主题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开发上的其他一些帖子!

喜欢的点点关注吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容