【Android】自定义换肤框架01之皮肤包制作

前言

目前为止,市面上主流的安卓换肤方案,其实原理都是差不多的

虽然大多都号称一行代码集成,但其实想要做到完全适配,并不简单

这个系列,就是让大家从零开始,完全掌握这方面知识,这样才能对框架不支持的点自己进行补充

该系列,我将使用小步慢跑的方式,每篇博客都是教会大家一个小知识点,直到完全掌握

皮肤包原理

android的资源,实际上都是从已经安装的apk文件里面去读取的

默认使用的apk路径是context.packageResourcePath

我们只要替换这个apk路径,便可以实现从其它apk加载资源

我们要制作的皮肤包,便是一个apk文件

制作皮肤包

知道原理了,下面便简单了

我们只要打包一个新的apk文件,资源结构和名称和项目完全一致就行了

由于我们只需要资源,其它无关文件是可以删除的

一般保留drawable和color文件夹就行了,皮肤适配主要是用到这两方面

最终的skin-package项目结构如下

以下是build和manifest文件内容

groovy 复制代码
plugins {
    id("com.android.application")
}

android {
    compileSdk = 34
    defaultConfig {
        namespace = "com.android.app"
        applicationId = "com.android.app"
        minSdk = 30
    }
}
xml 复制代码
<?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,就是从这里去读取数据的

相关推荐
fengci.10 小时前
Microweber CMS 未授权路径穿越漏洞(CVE-2026-65694)
android·开发语言·前端·学习·php
stevenzqzq11 小时前
Android 矢量图(Vector Drawable)核心坐标与尺寸机制技术文档
android
plainGeekDev11 小时前
运行时获取依赖 → 编译时注入
android·java·kotlin
Wiktok11 小时前
Vue3(Vite)打包安卓APP 完整最佳实践
android·vue
略略略咯咯11 小时前
LocalDateTime
android
Co_Hui12 小时前
Android 系统服务的添加
android
蜡台13 小时前
Flutter Container 与装饰完整讲解
android·javascript·flutter·dart
杉氧13 小时前
用 Compose 挑战交互与动效天花板:ComposeCraftLab 开源实验室全解析
android·前端·kotlin
朝与同歌暮同酒14 小时前
冒泡社区《幻想三国》还能玩吗?安卓手机与电脑模拟器试玩记录
android·智能手机·电脑
音视频牛哥14 小时前
从数字孪生到机器人操控:Android Unity3D下RTMP/RTSP多路低延迟播放实践
android·unity·音视频·unity rtsp播放器·unity rtmp播放器·rtsp player·rtmp player