详细介绍:【Android之路】安卓资源与编译初步

news/2025/10/28 8:11:59/文章来源:https://www.cnblogs.com/yangykaifa/p/19170627

在制作安卓客户端的时候,,如果我们仔细观察,会看到这样的文件目录:
在这里插入图片描述
咱们今天着重于介绍assestres目录

二者的区别

assest目录中常用于存放软件是视频和音频等文件,这些文件通常是不需要做适配的,而res目录中则是存放需要进行设备适配的文件,就比如图片、文字等。在进行资源编译的时候,aeerst目录是不会被AAPT编译的,而res则是会被编译的。

什么是AAPT?

AAPT 全称是 Android Asset Packaging Tool,是 Android SDK 自带的一个底层命令行工具,用来在构建 APK 时处理资源文件。
你在用 Android Studio 编译 APK / AAB 时,它会在后台自动调用 AAPT。


主要功能

  1. 打包资源(Packaging Resources)

    • res/ 目录中的图片、布局 XML、字符串、主题等资源编译成二进制格式,输出到 resources.arsc
    • 同时会把资源 ID 写入 R.javaR.class,让代码可以通过 R.string.xxxR.layout.xxx 等访问。
  2. 生成 R.java

    • 每次你添加/修改资源文件,AAPT 会自动扫描并分配唯一的整型 ID,生成 R.java,供应用代码引用。
  3. 压缩与合并资源

    • 会对 PNG、XML 等资源进行优化压缩,减少 APK 体积。
  4. 校验与构建 APK

    • 在打包过程中检查资源是否有效(如 XML 格式、图片路径),并最终打包成 .apk 文件。

️ 常用命令(AAPT1)

如果你在命令行中运行:

aapt dump badging app-debug.apk

可以查看 APK 的应用包名、版本号、支持的屏幕分辨率、权限等信息。

例如输出:

package: name='com.example.myapp' versionCode='1' versionName='1.0'
sdkVersion:'21'
targetSdkVersion:'33'
uses-permission: name='android.permission.INTERNET'
application-label:'MyApp'

其他常用命令:

  • aapt list app.apk 查看 APK 内部所有文件。
  • aapt dump permissions app.apk 查看声明的权限。

⚡ AAPT1 与 AAPT2 的区别

  • AAPT1:旧版打包工具,Android Gradle Plugin 3.0 以前默认使用。

  • AAPT2(现在默认):对资源编译做了增量优化,提高速度和错误提示质量。

    • 支持并行编译资源。
    • 错误提示更直观。

总结

AAPT 是 Android 构建过程中专门处理资源的工具。
开发者一般不用手动调用,但在分析 APK、反编译、或 CI/CD 自动化中常用 aapt dump badging 来查看包信息。

如果你在分析开源 Android 项目时,看到日志里出现:

AAPT: error: resource xxx not found

就是资源打包或引用出错时 AAPT 报告的错误。

res是怎么进行资源适配的?

在 Android 里,res/ 目录就是资源管理系统的入口。
所谓“资源适配”,就是让系统在不同设备特征(屏幕密度、分辨率、语言、暗色模式、API 等)下自动选择最合适的资源文件。
这一切都是由 资源限定符(Resource Qualifiers)AAPT + 运行时资源选择机制共同完成的。


1️⃣ res/ 目录的基本结构

res/├─ drawable/            # 默认的图片、shape、selector├─ drawable-hdpi/       # 针对 hdpi 屏幕的图片├─ layout/              # 默认布局├─ layout-land/         # 横屏布局├─ mipmap-xxxhdpi/      # 启动图标├─ values/              # 默认的 colors、strings、styles├─ values-zh/           # 中文(简体)资源├─ values-night/        # 夜间模式资源└─ raw/                 # 原始文件

每个子目录可以带限定符(Qualifier),用来声明这个目录的资源针对什么情况使用。


2️⃣ 常用资源限定符

类别形式示例含义
语言/地区values-zh/values-zh-rCN/中文,或中文(中国)
屏幕方向layout-land/layout-port/横屏 / 竖屏
屏幕尺寸layout-sw600dp/最小宽度 600dp(平板常用)
屏幕密度drawable-mdpi/drawable-hdpi/drawable-xhdpi/drawable-xxhdpi/对应 1x、1.5x、2x、3x 像素密度
UI 模式values-night/夜间模式(暗色主题)
平台版本values-v21/drawable-v24/Android 5.0 (API 21) 及以上才用
触控方式drawable-notouch/没有触摸屏的设备
布局方向layout-ldrtl/支持从右到左布局(阿语等)

系统在运行时会根据设备实际配置(Configuration)自动选择最匹配的目录。


示例:不同屏幕密度的图片适配

假设我们放置以下资源:

res/drawable-mdpi/logo.png      (48x48)drawable-hdpi/logo.png      (72x72)drawable-xhdpi/logo.png     (96x96)drawable-xxhdpi/logo.png    (144x144)
  • mdpi 设备(160dpi)→ 用 mdpi/logo.png
  • xhdpi 设备(320dpi)→ 用 xhdpi/logo.png

如果缺少某一密度的资源,系统会自动缩放最接近的那个(有时会导致模糊)。


示例:不同语言适配

res/values/strings.xmlvalues-zh/strings.xmlvalues-en/strings.xml

如果设备系统语言是中文,加载 values-zh/strings.xml
是英文就加载 values-en/strings.xml
找不到就回退到默认 values/


示例:夜间模式适配

res/values/colors.xml        # 白天模式颜色values-night/colors.xml  # 夜间模式颜色

当用户切换到夜间模式 (UiModeManager 或主题切换),系统自动用 -night 资源。


3️⃣ 资源选择顺序(匹配规则)

Android 在运行时根据当前 Configuration 按以下优先级选择:

  1. 完全匹配所有限定符的资源
  2. 匹配度高的目录优先
  3. 如果没有找到完全匹配的,就回退到默认资源目录

例如当前设备:zh-CN、横屏、xhdpi
系统会按:layout-zh-rCN-land-xhdpilayout-zh-rCN-landlayout-zh-landlayout-landlayout/ 顺序去找。


4️⃣ 适配实践建议

  • 图片:放在 mipmap-xxxhdpidrawable-xxxhdpi,至少提供 xxhdpi,系统可缩放。
  • 布局:针对平板用 layout-sw600dp,横竖屏用 layout-land/port
  • 语言:在 values-xx 下放多语言 strings.xml
  • 夜间模式:用 -night
  • 版本差异:在 values-v21/ 提供 Material 主题资源,旧版本用默认。

⚡ 总结

res 适配的核心是“限定符 + 系统自动匹配”。
你只要按规则命名不同目录,Android 在运行时会根据设备特性自动加载最合适的资源。
对于图片、布局、字符串、颜色、样式等都通用,几乎不需要手动写逻辑判断。

资源的访问

在 Android 里,“访问资源”有两种主要途径:

  1. 通过代码 (Java/Kotlin)
  2. 通过 XML(布局文件、样式文件等)

1️⃣ 资源在构建时的组织

例如:

public final class R {
public static final class drawable {
public static final int logo = 0x7f080057;
}
public static final class string {
public static final int app_name = 0x7f100004;
}
}

2️⃣ 在 代码 中访问资源

几乎所有资源都通过 Context 或其子类的方法访问(ActivityApplicationView 都是 Context)。

资源类型示例访问方式
字符串getString(R.string.app_name)
带占位符的字符串getString(R.string.welcome, userName)
颜色ContextCompat.getColor(context, R.color.primary)
DrawableContextCompat.getDrawable(context, R.drawable.ic_launcher)
尺寸 (dp/sp)getResources().getDimension(R.dimen.padding_large)
数组getResources().getStringArray(R.array.planets)
原始文件 (raw)InputStream is = getResources().openRawResource(R.raw.music);
Assets (非res目录)AssetManager am = getAssets(); InputStream is = am.open("file.txt");

⚠️ 注意:assets/ 目录下的内容不会生成 R ID,需要用 AssetManager 访问。


示例:加载图片并显示

val imageView: ImageView = findViewById(R.id.myImage)
imageView.setImageResource(R.drawable.logo)

示例:加载颜色并设置背景

val color = ContextCompat.getColor(this, R.color.primary)
myLayout.setBackgroundColor(color)

示例:加载字符串并格式化

val welcome = getString(R.string.welcome_user, "张博")
textView.text = welcome

3️⃣ 在 XML 中访问资源

在布局或样式文件里,你通常通过 @ 前缀访问资源:

用法示例
布局属性android:src="@drawable/logo"
字符串android:text="@string/app_name"
颜色android:background="@color/primary"
尺寸android:padding="@dimen/padding_large"
引用另一个资源@style/AppTheme@array/planets
系统内置资源@android:color/black@android:style/Theme.Material

@? 的区别

这使得主题可以动态换肤。


4️⃣ 特殊资源访问方式

  • TypedArray / obtainStyledAttributes
    用于读取自定义属性(自定义控件常用)。

  • Resources.Theme
    可以根据当前主题解析 ?attr/ 属性。

  • getIdentifier(name, defType, packageName)
    通过字符串动态获取资源 ID(不推荐频繁使用,因为性能较低):

    val resId = resources.getIdentifier("logo", "drawable", packageName)
    imageView.setImageResource(resId)

5️⃣ 资源访问的运行时特性

  • 系统在访问资源时会根据当前设备配置(语言、夜间模式、屏幕密度等)选择最合适的版本。
  • 你在代码中只写 R.drawable.logo,运行时会自动加载合适的 drawable-hdpi/logo.pngdrawable-xxhdpi/logo.png
  • 当配置变化(如横竖屏切换、语言切换、夜间模式)时,Activity 会重新创建并加载对应资源。

总结

资源访问的核心:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:矩阵与行列式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

不租用服务器实现连锁分店系统整合的解决方案

针对连锁店经营中租用服务器成本高、数据安全难保障等问题,提出了一套不租服务器也能玩转连锁店系统的省钱妙招。通过真实案例引入,阐述了不租服务器的优势,如省下大笔服务费、数据安全自主可控等。接着,提供了详细…

2025年诚信的压滤机品牌厂家排行榜

2025年诚信的压滤机品牌厂家排行榜 在工业过滤领域,压滤机作为关键设备,其性能、质量与售后服务直接影响生产效率。随着环保要求日益严格,市场对高效、节能、耐用的压滤机需求持续增长。2025年,我们根据市场调研、…

2025年比较好的氮气电加热器厂家最新实力排行

2025年比较好的氮气电加热器厂家最新实力排行随着工业自动化水平的不断提升,氮气电加热器作为关键的热能转换设备,在石油化工、电力能源、半导体制造等领域发挥着越来越重要的作用。2025年,氮气电加热器市场已经形成…

2025年靠谱的真空镀膜机TOP品牌厂家排行榜

2025年靠谱的真空镀膜机TOP品牌厂家排行榜行业概述真空镀膜技术作为现代制造业的重要工艺手段,已广泛应用于电子、光学、汽车、航空航天、装饰等多个领域。随着新材料和新工艺的不断涌现,真空镀膜设备市场呈现出快速…

2025年口碑好的离心风机厂家最新推荐权威榜

2025年口碑好的离心风机厂家最新推荐权威榜 在工业制造、化工、冶金、电力等行业中,离心风机作为关键设备之一,其性能、稳定性和耐用性直接影响生产效率与能耗控制。随着2025年工业智能化与绿色制造的推进,市场对离…

2025年热门的校园雕塑厂家推荐及选购参考榜

2025年热门的校园雕塑厂家推荐及选购参考榜 校园雕塑作为校园文化建设的重要组成部分,不仅承载着美学价值,还能传递教育理念、激发学生思考。随着教育投入的增加和校园美育的重视,2025年校园雕塑市场将迎来新一轮增…

2025年优质破碎机厂家最新推荐排行榜

2025年优质破碎机厂家最新推荐排行榜 在矿山开采、建筑拆除、冶金化工等领域,破碎机作为核心设备之一,其性能与可靠性直接影响生产效率与成本控制。2025年,随着智能化和绿色制造技术的普及,优质破碎机厂家不仅需具…

2025年评价高的压力检测液压机厂家最新热销排行

2025年评价高的压力检测液压机厂家最新热销排行行业概述液压机作为现代工业制造中不可或缺的关键设备,在金属成型、复合材料加工、精密零件装配等领域发挥着重要作用。随着工业4.0和智能制造技术的快速发展,市场对高…

2025年比较好的冷拔丝厂家推荐及采购参考

2025年比较好的冷拔丝厂家推荐及采购参考 在建筑、制造、五金加工等行业,冷拔丝作为一种基础材料,广泛应用于桁架、管桩、网片、制钉等领域。选择一家优质的冷拔丝厂家,不仅能确保产品质量,还能提高生产效率,降低…

2025年热门的高效废水处理厂家最新推荐排行榜

2025年热门的高效废水处理厂家最新推荐排行榜 随着环保法规日益严格和可持续发展理念的深入人心,高效废水处理技术成为工业企业的刚需。2025年,废水处理行业迎来新一轮技术升级,涌现出一批在技术创新、工程质量和客…

2025年知名的轴承压装油压机用户口碑最好的厂家榜

2025年知名的轴承压装油压机用户口碑最好的厂家榜在工业制造领域,轴承压装油压机作为关键生产设备,其性能和质量直接影响着产品的精度和生产效率。随着2025年中国制造业向高质量发展迈进,市场对高精度、智能化液压设…

2025年比较好的无极绳绞车配件厂家推荐及选择参考

2025年比较好的无极绳绞车配件厂家推荐及选择参考开篇介绍无极绳绞车作为矿山、隧道等工程中不可或缺的重要设备,其配件的质量直接关系到整个系统的运行效率和安全性。随着2025年工业4.0的深入推进,选择一家技术先进…

乐聚教育机器人——功能演示视频

乐聚教育机器人——功能演示视频案例展示1. 腾讯 OCR 识别难度:初级 环境:腾讯手写 OCR 识别、Aelos Edu 机器人 简介:融合腾讯手写 OCR 文字识别到课程,以可视化积木的形式封装,学生可以在 Scratch 内自由使用 O…

人脸表情识别中都有哪些表情?

人脸表情识别中都有哪些表情?本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。 如果未…

海康视频设备onvif 快照数据获取

海康视频设备onvif 快照数据获取当前因为一些历史原因,不少onvif 的包都比较老,同时不少设备因为安全问题对于部分数据的处理进行了调整,造成实际处理上不太兼容, 或者不能使用 onvif 快照问题 默认支持的路径类似…

1.session、cookie、token的区别 2.cookie和缓存的区别

1.session、cookie、token的区别 Cookie 存储在浏览器的小段数据(通常4KB以内) 每次请求自动携带在HTTP头中 示例:Set-Cookie: user_id=123; expires=Wed, 21 Oct 2020 07:28:00 GMT Session 服务端存储的用户状态信…

平臺問我,你真的有命可以曬嗎?

小學畢業那會兒沒事情做,整天抱着個手機玩,總是等待別人的消息,等待聊天鈴聲響起的瞬間。那個時候不會書寫生活,也不會發說說,反倒是都在轉發別人空間裏的東西,什麼樣的都有,我也加過幾個這樣的號,甚至 1 比 1…

如何把英國 GiffGaff 從 ESIM 轉 SIM

操作其實很簡單,跟着官網來就行: https://help.giffgaff.com/en/articles/240706-can-i-switch-back-to-a-physical-sim-card-from-an-esim 首先,需要從官網申請一張實體 SIM 卡,從英國到內陸大概一個多月的時間,…

cookie session token 的区别

Cookie:存储在客户端(浏览器或APP本地),主要用来存用户标识(比如Session ID)和少量非敏感数据,比如记住登录状态、保存购物车。安全性较低,容易被窃取(如XSS攻击),数据量通常不超过4KB,由服务器通过 Set-C…