`
aoingl
  • 浏览: 86570 次
  • 性别: 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
分享到:
评论

相关推荐

    Android项目文件管理器源码,文件拖曳,list弹性,root ,zip压缩解.rar

    `res`存放了应用的资源文件,如布局、图片、字符串和颜色等;`assets`目录用于存储非结构化的原始文件,可以直接在代码中按文件名访问。 10. **gen**目录: 在旧的Eclipse ADT环境中,`gen`目录会自动生成R.java...

    android文件浏览器 完整版

    在Android设备上,文件主要分布在以下几个位置: 1. **内部存储**:通常用于存储应用程序数据和用户个人文件,这部分空间对用户通常是透明的。 2. **外部存储(SD卡)**:在标签中提到的"外置存储卡",就是指这个...

    Android 文件管理器源码.rar

    Android系统中的文件组织结构分为系统文件和用户文件,系统文件位于/data/system/、/system/等目录,用户文件则分布在内部存储和外部存储(SD卡)中。 Android文件管理器源码通常包含以下几个核心组件: 1. **文件...

    常用的Android常量

    在Android的UI设计中,`dimen.xml`资源文件常用来定义尺寸常量,如屏幕边距、字体大小等。这样可以在不同屏幕尺寸的设备上保持一致的视觉效果,同时避免硬编码数值,提高代码的可读性和可维护性。 Android的Intent...

    android_gradle-5.6.4-all.rar

    在给定的压缩包文件"android_gradle-5.6.4-all.rar"中,包含了Gradle 5.6.4版本的完整资源,这对于开发者来说是一个方便的离线安装包,尤其当从官方网站下载遇到困难或速度过慢时,这样的资源就显得尤为实用。...

    Android布局控件之linearlayout案例

    它的主要属性包括`orientation`(方向)、`weight`(权重)以及`gravity`(对齐方式),这些属性决定了子视图如何在布局中分布。 1. **方向属性(Orientation)**:默认情况下,LinearLayout会将子视图按垂直方向堆...

    Android Studio项目《天气预报app》

    `app` 目录是应用的源代码和资源文件所在的地方。其中包括了`java`目录(存放Java源代码)、`res`目录(存放应用资源,如布局文件、图片、字符串等)、`manifests`目录(包含AndroidManifest.xml文件,定义应用的元...

    Android-将图片转换成WebP格式的Android构建插件

    在Android应用开发中,优化资源文件,特别是图片,是提高应用性能和降低APK大小的重要手段。WebP是一种由Google开发的高效图像格式,它在提供高质量图像的同时,能显著减少文件大小,对于移动设备尤其有利。本篇将...

    Android底层驱动开发.pdf

    Ashmem机制通过/dev/ashmem设备文件实现,相关代码分布在include/linux/ashmem.h和drivers/staging/android/ashmem.c文件中。 接着,Android Logger提供了日志管理服务,它允许应用程序记录日志信息。Logger服务...

    如何单独编译Android源码中的模块

    Android 源码单独编译模块 Android 源码单独编译模块是指在 Android 源代码工程中编译指定的模块,而不需要...* 编译模块后的文件分布 * 重新打包 system.img 文件 * 解决常见的问题 标签:Android 源码 Android 编译

    Android入门第五篇之TableLayout (二).docx

    首先,我们来看一下`main.xml`的布局文件。在这个例子中,我们创建了一个LinearLayout作为根布局,并在其中包含了一个TableLayout。TableLayout的宽度设置为fill_parent,高度设置为wrap_content,这意味着它将占据...

    Android.File.Grouping

    在Android应用开发中,我们通常会创建各种资源文件,如布局(layout)、图标(drawable)、字符串(strings)等,这些文件分布在不同的目录下,如res/layout、res/drawable、res/values等。随着项目的增长,查找特定...

    android二元离散变量计算器

    开发者在分享代码时,可能会包含`project codes`,这是一个包含所有源代码和资源文件的文件夹,供其他开发者研究和学习。这通常包括Java或Kotlin源码文件、资源文件夹等,可以帮助理解实现逻辑和设计思路。 总的来...

    Android 自带图标库

    这些图标不仅有助于提升应用程序的视觉体验,而且使用起来非常方便,无需额外下载或手动添加资源文件。Android系统内置了大量的图标资源,它们分布在不同的版本中,并可以通过统一的方式进行访问。 #### 二、...

    Android实现伸缩弹力分布菜单效果(圆弧型)

    PureComposerDemo可能包含一个主Activity,一个自定义的弧形菜单View,以及相关的布局文件和资源。在代码中,应该遵循良好的编程规范,保持代码清晰、可读性强,同时利用面向对象设计原则,将职责分离,提高代码复用...

    Android实现以圆心散开的半圆型导航菜单_android源码.zip

    在源码中,可能还包括了布局文件(XML)定义了菜单的初始状态,以及资源文件(如颜色、尺寸、图片等)来定制菜单的外观。开发者可能会使用Selector作为背景,以实现不同状态下的视觉变化,比如选中和未选中时的不同...

    基于Eclipse的Android音乐播放器.rar

    在本项目中,源代码文件可能分布在`src`目录下的多个包中,用于实现播放器的不同功能,如播放控制、UI界面等。 3. **Java编程** 使用Java作为主要编程语言,开发者可以创建Activity(应用的主屏幕)、Service...

    android应用自适应多分辨率的解决方法

    Android系统支持开发者为不同屏幕尺寸和密度创建特定的布局资源文件。这是实现自适应设计的关键一步。例如,当开发者创建一个名为`layout-800x480`的目录时,意味着该目录下的布局文件是专门为宽度为800dp、高度为...

    Android团购信息源代码.zip源码资源下载

    2. **项目结构**:Android应用通常有特定的目录结构,包括`app/src/main/java`(存放Java源代码)、`app/res`(存放资源文件如布局、图片、字符串等)、`build.gradle`(构建文件定义项目依赖)等。在压缩包中,源...

Global site tag (gtag.js) - Google Analytics