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)
方法。
分享到:
相关推荐
这是个android资源文件帮助文档,主要是res文件夹下的包括anim,drawable,xml等
Unity 调用Android文件资源管理器,可以选择Android手机上的图片,视频等一些列文件,并且获得相关的文件路径。直接导入Unity即可运行。测试已经通过
Android资源文件(学习android必备)Android资源文件(学习android必备)Android资源文件(学习android必备)
通过输入一个apk文件和签名文件,输出相关的配置文件及资源文件被混淆的apk(带签名),注意是资源文件混淆不是代码混淆噢.
Android读取SMB服务器资源或者下载资源文件
Android资源文件批量分类处理
Android文件管理器(增加了文件夹复制移动,下载资源暂停删除等,以及复制过程中的可视化进程)是一个基于Android开发的应用,包含常用文件操作以及文件下载功能,文件操作包括打开文件夹和打开各类的文件(apk、avi...
Android 读写文件实例,包括 SD 卡读写和 内部存储读写。 文件目录获取等。
很全面的颜色相应代码资源文件,复制内容到colors.xml文件即可使用,方便使用
Android的apk文件反编译后,甚多的资源...(2)从反编译出的文件夹中,找到public.xml文件,依据代码说明执行代码,可以将反编译出的java文件引用的资源数字重新更改为R.type.name格式,使得java文件资源引用重新关联。
设计Android应用程序的界面经常用到xml格式的布局文件。一个布局文件的作用是描述了: - 界面包含哪些控件(也叫组件或视图;示例有按钮,下拉框); - 控件之间的位置关系; - 如何显示界面的整体外观和各个...
Android资源文件详解.pdf
Android文件选择器,可以实现多选,单选文件。
Android SO文件保护加固——混淆篇
使用android studio生成jar包,并且使用映射来完美调用资源文件。包含两个工程,一个如何生成jar包,一个是如何使用jar包,调用资源文件。使用详情可以关注我的blog,http://blog.csdn.net/jujishou521
自己整理的Android12版本的系统资源目录分析,包括各个目录对应的分支 art: Android Runtime,一种App运行模式,区别于传统的Dalvik虚拟机,旨在提高Android系统的流畅性.PDF bionic:系统C库源代码,Android改造的C...
Android文件资源管理器2.0的源码,包括程序有两个模块:文件管理部分和任务管理部分。
Android中使用xml文件定义颜色资源.pdf 学习资料 复习资料 教学资源
Android新编译规则Android.bp文件语法规则详细介绍,条件编译的配置案例。 Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk 文件的。在 Android7.0 以前,Android 都是使用 ...