前言
目前为止,市面上主流的安卓换肤方案,其实原理都是差不多的
虽然大多都号称一行代码集成,但其实想要做到完全适配,并不简单
这个系列,就是让大家从零开始,完全掌握这方面知识,这样才能对框架不支持的点自己进行补充
该系列,我将使用小步慢跑的方式,每篇博客都是教会大家一个小知识点,直到完全掌握
皮肤包原理
android的资源,实际上都是从已经安装的apk文件里面去读取的
默认使用的apk路径是context.packageResourcePath
我们只要替换这个apk路径,便可以实现从其它apk加载资源
我们要制作的皮肤包,便是一个apk文件
制作皮肤包
知道原理了,下面便简单了
我们只要打包一个新的apk文件,资源结构和名称和项目完全一致就行了
由于我们只需要资源,其它无关文件是可以删除的
一般保留drawable和color文件夹就行了,皮肤适配主要是用到这两方面
最终的skin-package
项目结构如下
以下是build和manifest文件内容
plugins {
id("com.android.application")
}
android {
compileSdk = 34
defaultConfig {
namespace = "com.android.app"
applicationId = "com.android.app"
minSdk = 30
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
</manifest>
由于我们只需要资源,不需要代码,所以其它配置全部可以省略
点击Build - BuildApk
,在build/output/apks
下生成安装包
重命名为skin.apk
,拷贝到存储卡下,即可以作为皮肤包使用了
Gradle版本说明
这里使用的是Gradle8.7,不同版本Gradle对语法要求可能有差异
APK结构说明
我们顺便再扩展下知识面,看看APK结构到底是什么样的,资源保存在哪里
可以看到,apk里面有一个arsc格式的索引表,里面维护了所有的package-id-name-path
之间的对应关系
我们平时用的Resource类,根据id或name来创建Drawable,就是从这里去读取数据的