`
aoingl
  • 浏览: 86488 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 资源文件分布

阅读更多

  A pk 文件下的资源文件都存放在以下两个目录下: res/ , assets/ , res/ 目录下的文件在打包成 apk 的时候被 encode 过,文本文件也变成了二进制的。如果想看文本内容,请参考下 android-apktool 工程。assets/ 目录下的文件会被原封不动的打包到 apk 文件中去。下面以一个例子说明下。

 

    资源源文件目录结构如下:

[lgao@lgao -]$ tree
.
|-- AndroidManifest.xml
|-- assets
|   |-- default.properties
|   |-- docs
|   |   `-- test.file
|   `-- test.xml
|-- res
|   |-- drawable
|   |   |-- taobao.ico
|   |   `-- taobao_tabs.xml
|   |-- drawable-hdpi
|   |   `-- icon.png
|   |-- drawable-ldpi
|   |   `-- icon.png
|   |-- drawable-mdpi
|   |   `-- icon.png
|   |-- layout
|   |   |-- main.xml
|   `-- values
|       `-- strings.xml

 

    当 apk 安装到模拟器中后, apk 被安装在 /data/app/test.apk ,我们来测试下文件内容:

 

	try {
	ZipInputStream zipIn = new ZipInputStream(new FileInputStream("/data/app/test.apk"));
	BufferedReader zipReader = new BufferedReader(new InputStreamReader(zipIn));
	ZipEntry entry = null;
	while((entry = zipIn.getNextEntry()) != null)
	{
		Log.i("TEST[APK-ENTRY]", entry.getName());
		if(entry.getName().indexOf("assets") != -1){
			String sl = null;
			while((sl = zipReader.readLine()) != null){
				Log.i("TEST[xml reader assets]", sl);
			}
		}else if (entry.getName().endsWith(".xml")){
			String sl = null;
			while((sl = zipReader.readLine()) != null){
				Log.i("TEST[xml reader xml]", sl);
			}
		}
	}
	} catch (FileNotFoundException e) {
		// TODO Auto-generated catch block
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

 

  我们看得到的 Logcat 消息:

 

12-12 13:43:28.234: INFO/TEST[APK-ENTRY](740): assets/docs/test.file
12-12 13:43:28.254: INFO/TEST[xml reader assets](740): # test string line
12-12 13:43:28.295: INFO/TEST[APK-ENTRY](740): assets/default.properties
12-12 13:43:28.314: INFO/TEST[xml reader assets](740): # This file is automatically generated by Android Tools.
12-12 13:43:28.354: INFO/TEST[APK-ENTRY](740): assets/test.xml
12-12 13:43:28.364: INFO/TEST[xml reader assets](740): <? xml encoding="utf-8" ?>
12-12 13:43:28.364: INFO/TEST[xml reader assets](740): <product>
12-12 13:43:28.364: INFO/TEST[xml reader assets](740): Test Name
12-12 13:43:28.384: INFO/TEST[xml reader assets](740): </product>
12-12 14:47:02.745: INFO/TEST[APK-ENTRY](740): res/drawable/taobao.ico
12-12 14:47:02.775: INFO/TEST[APK-ENTRY](740): res/drawable/taobao_tabs.xml
12-12 14:47:02.795: INFO/TEST[xml reader xml](740): ����4������
12-12 14:47:02.795: INFO/TEST[APK-ENTRY](740): res/layout/main.xml
12-12 14:47:02.815: INFO/TEST[xml reader xml](740): ����L������
12-12 14:47:02.925: INFO/TEST[APK-ENTRY](740): AndroidManifest.xml
12-12 14:47:02.956: INFO/TEST[xml reader xml](740): �������������������
12-12 14:47:03.185: INFO/TEST[APK-ENTRY](740): resources.arsc
12-12 14:47:03.265: INFO/TEST[APK-ENTRY](740): res/drawable-hdpi/icon.png
12-12 14:47:03.285: INFO/TEST[APK-ENTRY](740): res/drawable-ldpi/icon.png
12-12 14:47:03.304: INFO/TEST[APK-ENTRY](740): res/drawable-mdpi/icon.png
12-12 14:47:03.324: INFO/TEST[APK-ENTRY](740): classes.dex
12-12 14:47:03.374: INFO/TEST[APK-ENTRY](740): META-INF/MANIFEST.MF
12-12 14:47:03.394: INFO/TEST[APK-ENTRY](740): META-INF/CERT.SF
12-12 14:47:03.404: INFO/TEST[APK-ENTRY](740): META-INF/CERT.RSA

 

    从 LogCat 消息我们看到, 所有在 assets/ 目录下的文件都以原始文件格式存放, 因此我们能正确的显示它的内容, 但是在 res/ 目录下的文件,即便是 xml 的文本文件, 也只能显示出为乱码。当然在 Android app 下读取 assets/ 目录下文件不能使用这种方式, 而是 Android 提供的 AssetManager 来实现。

 

    Activity 下提供了许多获取一个 File 的方法, 我们需要知道这些 File 具体指向 Android 的哪个位置。 我们也来测试一下:

		Log.i("TEST[getCacheDir()]", getCacheDir().getAbsolutePath());
		Log.i("TEST[getDatabasePath()]", getDatabasePath("test.db").getAbsolutePath());
		Log.i("TEST[getDir()]", getDir("testDir", Context.MODE_PRIVATE).getAbsolutePath());
		Log.i("TEST[getExternalCacheDir()]", getExternalCacheDir().getAbsolutePath());
		Log.i("TEST[getExternalFilesDir('')]", getExternalFilesDir("").getAbsolutePath());
		Log.i("TEST[getExternalFilesDir('test_data')]", getExternalFilesDir("test_data").getAbsolutePath());
		Log.i("TEST[getExternalFilesDir('music')]", getExternalFilesDir("music").getAbsolutePath());
		Log.i("TEST[getFilesDir()]", getFilesDir().getAbsolutePath());
		Log.i("TEST[getFileStreamPath('test_steam.file')]", getFileStreamPath("test_steam.file").getAbsolutePath());

     我们看下 LogCat 结果:

 

12-12 15:06:25.715: INFO/TEST[getCacheDir()](1702): /data/data/org.tangao.pettyman/cache
12-12 15:06:25.745: INFO/TEST[getDatabasePath()](1702): /data/data/org.tangao.pettyman/databases/test.db
12-12 15:06:25.755: INFO/TEST[getDir()](1702): /data/data/org.tangao.pettyman/app_testDir
12-12 15:06:25.965: INFO/TEST[getExternalCacheDir()](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/cache
12-12 15:06:26.174: INFO/TEST[getExternalFilesDir('')](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/files
12-12 15:06:26.250: INFO/TEST[getExternalFilesDir('test_data')](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/files/test_data
12-12 15:06:26.367: INFO/TEST[getExternalFilesDir('music')](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/files/music
12-12 15:06:26.384: INFO/TEST[getFilesDir()](1702): /data/data/org.tangao.pettyman/files
12-12 15:06:26.424: INFO/TEST[getFileStreamPath('test_steam.file')](1702): /data/data/org.tangao.pettyman/files/test_steam.file

 

    除了以上的资源文件外, Android 还有 database 文件的支持, 而 database 文件是在相应 SQLiteOpenHelper 实现的 getReadableDatabase() 或者 getWritableDatabase() 方法在第一次被调用的时候创建的,然后调用 SQLiteOpenHelper 的 onCreate(SQLiteDatabase db) 方法, 如果 Database 的版本有变化, 不管是版本号变高还是变低都会调用 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法。

0
0
分享到:
评论

相关推荐

    电动车上牌管理系统 SSM毕业设计 附带论文.zip

    电动车上牌管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl

    tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl

    【eclipse和idea两个版本运行源码】基于Java Swing +mysql 实现的网吧管理系统

    一、项目简介 本项目是一套基于Java Swing 开发的网吧管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 二、技术实现 ​后台技术:java swing ​数据库:MySQL ​数据库连接池:c3p0 三、系统主要功能 用户登录: 分为 普通用户和管理员 两种角色 菜单模块:上机,下机, 系统设置:管理员设置,会员设置,计费设置, 退出系统 管理模块:增加会员,删除会员,信息修改,信息查询 视图模块:主页视图,在线用户,统计视图, 统计报表模块:人数报表,收入报表 帮助模块:联系我们,关于系统 详见:https://blog.csdn.net/weixin_43860634/article/details/125247764

    pc-dmis软件脚本-输出Excel格式报告

    使用软件自带的basic脚本编辑制作的脚本 低版本软件无法输出Excel报告,可以通过脚本方式实现这一功能

    【java毕业设计】校园失物招领系统源码(springboot+vue+mysql+说明文档).zip

    项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse

    基于java的网上电子书店h答辩PPT.pptx

    基于java的网上电子书店h答辩PPT.pptx

    基于微信小程序的微信小程序校园失物招领答辩PPT.pptx

    基于微信小程序的微信小程序校园失物招领答辩PPT.pptx

    基于java的基于Java的学生综合测评管理系统答辩PPT.pptx

    基于java的基于Java的学生综合测评管理系统答辩PPT.pptx

    pandas-2.1.4-cp39-cp39-win_amd64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    判断题 - 题目列表 - 图-练习题集飒飒阿萨

    springboot体育器材管理系统(附源码+数据库)71175

    管理员功能: 用户管理:管理员可以管理用户账户,包括审核新注册用户、禁用违规用户、重置密码等操作。 器材管理:管理员可以管理器材的信息,包括添加新器材、编辑器材详情、设定器材规则和限制等。 器材预约与借还管理:管理员可以处理用户的器材预约请求,确认或调整预约时间,并记录借还操作。 库存管理:管理员可以监控器材库存情况,及时补充不足的器材并处理损坏或报废的器材。 数据统计与报表:管理员可以分析系统的使用情况和借还记录,生成数据统计报表以了解器材使用情况和借还频率等。 系统设置与维护:管理员可以进行系统设置,包括配置器材规则、设定可用时间段、备份数据、优化系统性能等。 消息通知与提醒:管理员可以向用户发送消息通知,如器材预约成功、归还提醒、系统更新通知等。

    Jira插件安装包Dynamic-forms

    Jira插件安装包Dynamic-forms

    pandas-2.1.4-cp311-cp311-win_amd64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    少儿图形化scratch编程作品源码集100个

    Scratch是一款由麻省理工学院(MIT)的“终身幼儿园团队”开发的图形化编程工具,专为儿童设计,旨在帮助他们学习编程思维和逻辑能力。

    基于java的学生就业管理系统答辩PPT.pptx

    基于java的学生就业管理系统答辩PPT.pptx

    课设毕设基于SpringBoot+Vue的旅游门票信息系统设计与实现源码可运行.zip

    本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac

    大学志愿填报系统.zip

    随着社会对志愿服务活动的日益重视,各大高校也纷纷参与到志愿服务的行列中。为了更好地管理和记录志愿者活动,提高志愿服务的质量和效率,我们开发了这款大学志愿服务系统。 该系统主要包括多个功能模块,如信息管理、活动管理、学生管理等。信息管理模块允许学校管理员录入、修改和删除学校的基本信息,包括学校账号、名称、联系电话、地址、特色以及办学理念等,确保信息的准确性和完整性。活动管理模块则用于记录和管理志愿者活动的相关信息,包括活动的名称、时间、地点、参与人员等,方便志愿者进行报名和签到。 此外,系统还提供了学生管理模块,用于记录学生的志愿服务经历和表现,为学生参与志愿服务提供便利。同时,系统还支持照片上传和展示功能,通过展示志愿者活动的照片,让更多人了解和关注志愿服务事业。 整个系统界面简洁明了,操作便捷,功能强大。通过使用该系统,高校可以更加高效地管理和记录志愿者活动,提高志愿服务的整体水平。同时,该系统也为广大志愿者提供了一个展示自我、服务社会的平台。

    turbo均衡算法研究

    turbo均衡算法研究

    静态编译的Qt6.7.3(win10+MSVC2022+openssl+静态运行时) part01

    https://blog.csdn.net/aggs1990/article/details/143491823 静态编译的Qt6.7.3(win10+MSVC2022+openssl+静态运行时) 压缩包比较大,这是第一部分

    tornado-6.4b1-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4b1-cp38-abi3-musllinux_1_1_i686.whl

Global site tag (gtag.js) - Google Analytics