Android 资源文件分布

来源:互联网 发布:金刚级战列舰知乎 编辑:程序博客网 时间:2024/05/14 14:51

Android 资源文件分布

    博客分类: 
  • Android
Android 资源文件分布 

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

 

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

Xml代码  收藏代码
  1. [lgao@lgao -]$ tree  
  2. .  
  3. |-- AndroidManifest.xml  
  4. |-- assets  
  5. |   |-- default.properties  
  6. |   |-- docs  
  7. |   |   `-- test.file  
  8. |   `-- test.xml  
  9. |-- res  
  10. |   |-- drawable  
  11. |   |   |-- taobao.ico  
  12. |   |   `-- taobao_tabs.xml  
  13. |   |-- drawable-hdpi  
  14. |   |   `-- icon.png  
  15. |   |-- drawable-ldpi  
  16. |   |   `-- icon.png  
  17. |   |-- drawable-mdpi  
  18. |   |   `-- icon.png  
  19. |   |-- layout  
  20. |   |   |-- main.xml  
  21. |   `-- values  
  22. |       `-- strings.xml  

 

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

 

Java代码  收藏代码
  1. try {  
  2. ZipInputStream zipIn = new ZipInputStream(new FileInputStream("/data/app/test.apk"));  
  3. BufferedReader zipReader = new BufferedReader(new InputStreamReader(zipIn));  
  4. ZipEntry entry = null;  
  5. while((entry = zipIn.getNextEntry()) != null)  
  6. {  
  7.     Log.i("TEST[APK-ENTRY]", entry.getName());  
  8.     if(entry.getName().indexOf("assets") != -1){  
  9.         String sl = null;  
  10.         while((sl = zipReader.readLine()) != null){  
  11.             Log.i("TEST[xml reader assets]", sl);  
  12.         }  
  13.     }else if (entry.getName().endsWith(".xml")){  
  14.         String sl = null;  
  15.         while((sl = zipReader.readLine()) != null){  
  16.             Log.i("TEST[xml reader xml]", sl);  
  17.         }  
  18.     }  
  19. }  
  20. catch (FileNotFoundException e) {  
  21.     // TODO Auto-generated catch block  
  22. catch (IOException e) {  
  23.     // TODO Auto-generated catch block  
  24.     e.printStackTrace();  
  25. }  

 

  我们看得到的 Logcat 消息:

 

Xml代码  收藏代码
  1. 12-12 13:43:28.234: INFO/TEST[APK-ENTRY](740): assets/docs/test.file  
  2. 12-12 13:43:28.254: INFO/TEST[xml reader assets](740): # test string line  
  3. 12-12 13:43:28.295: INFO/TEST[APK-ENTRY](740): assets/default.properties  
  4. 12-12 13:43:28.314: INFO/TEST[xml reader assets](740): # This file is automatically generated by Android Tools.  
  5. 12-12 13:43:28.354: INFO/TEST[APK-ENTRY](740): assets/test.xml  
  6. 12-12 13:43:28.364: INFO/TEST[xml reader assets](740): <? xml encoding="utf-8" ?>  
  7. 12-12 13:43:28.364: INFO/TEST[xml reader assets](740): <product>  
  8. 12-12 13:43:28.364: INFO/TEST[xml reader assets](740): Test Name  
  9. 12-12 13:43:28.384: INFO/TEST[xml reader assets](740): </product>  
  10. 12-12 14:47:02.745: INFO/TEST[APK-ENTRY](740): res/drawable/taobao.ico  
  11. 12-12 14:47:02.775: INFO/TEST[APK-ENTRY](740): res/drawable/taobao_tabs.xml  
  12. 12-12 14:47:02.795: INFO/TEST[xml reader xml](740): ����4������  
  13. 12-12 14:47:02.795: INFO/TEST[APK-ENTRY](740): res/layout/main.xml  
  14. 12-12 14:47:02.815: INFO/TEST[xml reader xml](740): ����L������  
  15. 12-12 14:47:02.925: INFO/TEST[APK-ENTRY](740): AndroidManifest.xml  
  16. 12-12 14:47:02.956: INFO/TEST[xml reader xml](740): �������������������  
  17. 12-12 14:47:03.185: INFO/TEST[APK-ENTRY](740): resources.arsc  
  18. 12-12 14:47:03.265: INFO/TEST[APK-ENTRY](740): res/drawable-hdpi/icon.png  
  19. 12-12 14:47:03.285: INFO/TEST[APK-ENTRY](740): res/drawable-ldpi/icon.png  
  20. 12-12 14:47:03.304: INFO/TEST[APK-ENTRY](740): res/drawable-mdpi/icon.png  
  21. 12-12 14:47:03.324: INFO/TEST[APK-ENTRY](740): classes.dex  
  22. 12-12 14:47:03.374: INFO/TEST[APK-ENTRY](740): META-INF/MANIFEST.MF  
  23. 12-12 14:47:03.394: INFO/TEST[APK-ENTRY](740): META-INF/CERT.SF  
  24. 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 的哪个位置。 我们也来测试一下:

Java代码  收藏代码
  1. Log.i("TEST[getCacheDir()]", getCacheDir().getAbsolutePath());  
  2. Log.i("TEST[getDatabasePath()]", getDatabasePath("test.db").getAbsolutePath());  
  3. Log.i("TEST[getDir()]", getDir("testDir", Context.MODE_PRIVATE).getAbsolutePath());  
  4. Log.i("TEST[getExternalCacheDir()]", getExternalCacheDir().getAbsolutePath());  
  5. Log.i("TEST[getExternalFilesDir('')]", getExternalFilesDir("").getAbsolutePath());  
  6. Log.i("TEST[getExternalFilesDir('test_data')]", getExternalFilesDir("test_data").getAbsolutePath());  
  7. Log.i("TEST[getExternalFilesDir('music')]", getExternalFilesDir("music").getAbsolutePath());  
  8. Log.i("TEST[getFilesDir()]", getFilesDir().getAbsolutePath());  
  9. Log.i("TEST[getFileStreamPath('test_steam.file')]", getFileStreamPath("test_steam.file").getAbsolutePath());  

     我们看下 LogCat 结果:

 

Xml代码  收藏代码
  1. 12-12 15:06:25.715: INFO/TEST[getCacheDir()](1702): /data/data/org.tangao.pettyman/cache  
  2. 12-12 15:06:25.745: INFO/TEST[getDatabasePath()](1702): /data/data/org.tangao.pettyman/databases/test.db  
  3. 12-12 15:06:25.755: INFO/TEST[getDir()](1702): /data/data/org.tangao.pettyman/app_testDir  
  4. 12-12 15:06:25.965: INFO/TEST[getExternalCacheDir()](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/cache  
  5. 12-12 15:06:26.174: INFO/TEST[getExternalFilesDir('')](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/files  
  6. 12-12 15:06:26.250: INFO/TEST[getExternalFilesDir('test_data')](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/files/test_data  
  7. 12-12 15:06:26.367: INFO/TEST[getExternalFilesDir('music')](1702): /mnt/sdcard/Android/data/org.tangao.pettyman/files/music  
  8. 12-12 15:06:26.384: INFO/TEST[getFilesDir()](1702): /data/data/org.tangao.pettyman/files  
  9. 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) 方法。

原创粉丝点击