这几天事情比较少,于是对前面用到的一些东西时行了总结。

android手机上面的存储空间主要有手机本身的存储空间和SD卡的存储空间。之前用的最多的是SD卡的存储空间,在总结的时候看了一下系统的源代码,很有收获。在手机安装应用时,系统会自动在/data/data目录下面以应用的主包名创建一个目录,默认还会在最后的那个目录里面创建一个lib目录。下面看一下系统获取存储空间的代码:

来自android2.3.3系统源代码/packages/apps/Settings/src/com/android/settings/applications/ManageApplications.java


1. 531.mDataFileStats = new StatFs("/data");  
2. 532.mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString());


1. <pre name="code" class="java">748.mDataFileStats.restat("/data");  
2. try {  
3. long)mDataFileStats.getBlockCount() *  
4.                         mDataFileStats.getBlockSize();  
5. long) mDataFileStats.getAvailableBlocks() *  
6.                     mDataFileStats.getBlockSize();  
7. catch (IllegalArgumentException e) {  
8.             }  
9. final int N = mApplicationsAdapter.getCount();  
10. for (int i=0; i<N; i++) {  
11.                 ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);  
12.                 appStorage += ae.codeSize + ae.dataSize;  
13.             }  
14. "code" class="java"><pre></pre>  
15. <pre></pre>  
16. <p></p>  
17. <pre></pre>  
18. <pre name="code" class="java">734.mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString());  
19. try {  
20. long)mSDCardFileStats.getBlockCount() * mSDCardFileStats.getBlockSize();  
21. long) mSDCardFileStats.getAvailableBlocks() * mSDCardFileStats.getBlockSize();  
22. } catch (IllegalArgumentException e) {  
23. // use the old value of mFreeMem  
24. }</pre><br>  
25. 第531行代码是计算系统的空间,第532行是检查SD卡的空间。可以看出,系统检查的是/data目录下面的空间。手机都有一个参数ROM,那么ROM指的是什么空间?比如说G7,ROM是512M,那么空间是怎么分配的呢?还好手中的G7有root权限,不知道以下的操作需不需要root权限,有手机的同学可以试试。找到SDK中adb.exe文件所在目录,2.3以前的是在tools目录中,以后是在platform-tools目录中,从命令行中进入到该目录。如果配置了环境变量就不需要,直接启动命令行窗口执行adb shell,就会进入系统文件目录,然后执行df,就会看到一些信息,下面是G7(也可以用模拟器试试)的信息:  
26. <p></p>  
27. <p>Filesystem           1K-blocks      Used Available Use% Mounted on<br>  
28. tmpfs                   207628        32    207596   0% /dev<br>  
29. tmpfs                   207628         0    207628   0% /mnt/asec<br>  
30. tmpfs                   207628         0    207628   0% /mnt/obb<br>  
31. /dev/block/mtdblock3    256000    145736    110264  57% /system<br>  
32. /dev/block/mtdblock5    151168    102396     48772  68% /data<br>  
33. /dev/block/mtdblock4     40960      1204     39756   3% /cache<br>  
34. /dev/block/vold/179:1<br>  
35. 942848     49232    893616   5% /mnt/sdcard<br>  
36. /dev/block/vold/179:1<br>  
37. 942848     49232    893616   5% /mnt/secure/asec<br>  
38. </p>  
39. <p>可以看出有一个分区是挂载到了/data目录下面,已经使用了48772K,还剩102396K,也就是512M的ROM最后系统只给用户分配151168K,不足150M,其余的被系统占用,其它的就不说了,不敢在linux大神面前班门弄斧。从上面的代码可以看出,系统给应用还有一定的缓存空间,最后还被计算到可用空间中去了。看过的同学可以用下面的代码测试一下,获取/data目录和/data/data目录下面的空间会不一样,有一点点小差别,貌似应该就是缓存空间吧。SD卡就不说了,从上面的信息也可以看出来,SD卡有1个G,挂载在/mnt/sdcard目录下面。</p>  
40. <p>下面是个人整理的检查手机的存储空间的有关代码,仅供参考。</p>  
41. <pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java">import java.io.File;  
42.   
43. import android.os.Environment;  
44. import android.os.StatFs;  
45.   
46. /**
47.  * 存储空间管理
48.  * @author maylian7700@126.com
49.  *
50.  */  
51. public class MemorySpaceCheck  
52. {  
53.       
54. /**
55.      * 计算剩余空间
56.      * @param path
57.      * @return
58.      */  
59. private static long getAvailableSize(String path)  
60.     {  
61. new StatFs(path);  
62.         fileStats.restat(path);  
63. return (long) fileStats.getAvailableBlocks() * fileStats.getBlockSize(); // 注意与fileStats.getFreeBlocks()的区别  
64.     }  
65.       
66. /**
67.      * 计算总空间
68.      * @param path
69.      * @return
70.      */  
71. private static long getTotalSize(String path)  
72.     {  
73. new StatFs(path);  
74.         fileStats.restat(path);  
75. return (long) fileStats.getBlockCount() * fileStats.getBlockSize();  
76.     }  
77.       
78. /**
79.      * 计算SD卡的剩余空间
80.      * @return 剩余空间
81.      */  
82. public static long getSDAvailableSize()  
83.     {  
84. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
85.         {  
86. return getAvailableSize(Environment.getExternalStorageDirectory().toString());  
87.         }  
88.           
89. return 0;  
90.     }  
91.       
92. /**
93.      * 计算系统的剩余空间
94.      * @return 剩余空间
95.      */  
96. public static long getSystemAvailableSize()  
97.     {  
98. // context.getFilesDir().getAbsolutePath();  
99. return getAvailableSize("/data");  
100.     }  
101.       
102. /**
103.      * 是否有足够的空间
104.      * @param filePath 文件路径,不是目录的路径
105.      * @return
106.      */  
107. public static boolean hasEnoughMemory(String filePath)  
108.     {  
109. new File(filePath);  
110. long length = file.length();  
111. if (filePath.startsWith("/sdcard") || filePath.startsWith("/mnt/sdcard"))  
112.         {  
113. return getSDAvailableSize() > length;  
114.         }  
115. else  
116.         {  
117. return getSystemAvailableSize() > length;  
118.         }  
119.           
120.     }  
121.       
122. /**
123.      * 获取SD卡的总空间
124.      * @return
125.      */  
126. public static long getSDTotalSize()  
127.     {  
128. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
129.         {  
130. return getTotalSize(Environment.getExternalStorageDirectory().toString());  
131.         }  
132.           
133. return 0;  
134.     }  
135.       
136. /**
137.      * 获取系统可读写的总空间
138.      * @return
139.      */  
140. public static long getSysTotalSize()  
141.     {  
142. return getTotalSize("/data");  
143.     }  
144. }  
145. </pre><br>  
146. <br>  
147. <pre></pre>  
148. <pre></pre>  
149. 如果想要在系统的存储空间中写入数据,可以用context.getFilesDir().getAbsolutePath(),获取该应用的可写目录,也就是/data/data/应用主包名/files目录,可以往里面写入数据,在应用被卸载时,也一并被删除,不用担心会产生垃圾,灰常给力。如果不妥之处,欢迎批评指正!  
150. <p></p>  
151. <pre></pre>  
152. <pre></pre>  
153. <pre></pre>  
154. <pre></pre>  
155. <pre></pre>  
156. <pre></pre>  
157. <pre></pre>  
158. <pre></pre>  
159. <pre></pre>  
160. <pre></pre>  
161. <pre></pre>  
162. <pre></pre>  
163. <pre></pre>  
164. <pre></pre>  
165. <pre></pre>  
166. <pre></pre>  
167. <pre></pre>  
168. <pre></pre>  
169. <pre></pre>  
170. <pre></pre>  
171. <pre></pre>  
172. <pre></pre>  
173.   
174. </pre></pre></pre></pre>

  • 上一篇android PopupWindow重写系统菜单
  • 下一篇android按钮被点击文字颜色变化效果

这几天事情比较少,于是对前面用到的一些东西时行了总结。

android手机上面的存储空间主要有手机本身的存储空间和SD卡的存储空间。之前用的最多的是SD卡的存储空间,在总结的时候看了一下系统的源代码,很有收获。在手机安装应用时,系统会自动在/data/data目录下面以应用的主包名创建一个目录,默认还会在最后的那个目录里面创建一个lib目录。下面看一下系统获取存储空间的代码:

来自android2.3.3系统源代码/packages/apps/Settings/src/com/android/settings/applications/ManageApplications.java


1. 531.mDataFileStats = new StatFs("/data");  
2. 532.mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString());

1. <pre name="code" class="java">748.mDataFileStats.restat("/data");  
2. try {  
3. long)mDataFileStats.getBlockCount() *  
4.                         mDataFileStats.getBlockSize();  
5. long) mDataFileStats.getAvailableBlocks() *  
6.                     mDataFileStats.getBlockSize();  
7. catch (IllegalArgumentException e) {  
8.             }  
9. final int N = mApplicationsAdapter.getCount();  
10. for (int i=0; i<N; i++) {  
11.                 ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);  
12.                 appStorage += ae.codeSize + ae.dataSize;  
13.             }  
14. "code" class="java"><pre></pre>  
15. <pre></pre>  
16. <p></p>  
17. <pre></pre>  
18. <pre name="code" class="java">734.mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString());  
19. try {  
20. long)mSDCardFileStats.getBlockCount() * mSDCardFileStats.getBlockSize();  
21. long) mSDCardFileStats.getAvailableBlocks() * mSDCardFileStats.getBlockSize();  
22. } catch (IllegalArgumentException e) {  
23. // use the old value of mFreeMem  
24. }</pre><br>  
25. 第531行代码是计算系统的空间,第532行是检查SD卡的空间。可以看出,系统检查的是/data目录下面的空间。手机都有一个参数ROM,那么ROM指的是什么空间?比如说G7,ROM是512M,那么空间是怎么分配的呢?还好手中的G7有root权限,不知道以下的操作需不需要root权限,有手机的同学可以试试。找到SDK中adb.exe文件所在目录,2.3以前的是在tools目录中,以后是在platform-tools目录中,从命令行中进入到该目录。如果配置了环境变量就不需要,直接启动命令行窗口执行adb shell,就会进入系统文件目录,然后执行df,就会看到一些信息,下面是G7(也可以用模拟器试试)的信息:  
26. <p></p>  
27. <p>Filesystem           1K-blocks      Used Available Use% Mounted on<br>  
28. tmpfs                   207628        32    207596   0% /dev<br>  
29. tmpfs                   207628         0    207628   0% /mnt/asec<br>  
30. tmpfs                   207628         0    207628   0% /mnt/obb<br>  
31. /dev/block/mtdblock3    256000    145736    110264  57% /system<br>  
32. /dev/block/mtdblock5    151168    102396     48772  68% /data<br>  
33. /dev/block/mtdblock4     40960      1204     39756   3% /cache<br>  
34. /dev/block/vold/179:1<br>  
35. 942848     49232    893616   5% /mnt/sdcard<br>  
36. /dev/block/vold/179:1<br>  
37. 942848     49232    893616   5% /mnt/secure/asec<br>  
38. </p>  
39. <p>可以看出有一个分区是挂载到了/data目录下面,已经使用了48772K,还剩102396K,也就是512M的ROM最后系统只给用户分配151168K,不足150M,其余的被系统占用,其它的就不说了,不敢在linux大神面前班门弄斧。从上面的代码可以看出,系统给应用还有一定的缓存空间,最后还被计算到可用空间中去了。看过的同学可以用下面的代码测试一下,获取/data目录和/data/data目录下面的空间会不一样,有一点点小差别,貌似应该就是缓存空间吧。SD卡就不说了,从上面的信息也可以看出来,SD卡有1个G,挂载在/mnt/sdcard目录下面。</p>  
40. <p>下面是个人整理的检查手机的存储空间的有关代码,仅供参考。</p>  
41. <pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java">import java.io.File;  
42.   
43. import android.os.Environment;  
44. import android.os.StatFs;  
45.   
46. /**
47.  * 存储空间管理
48.  * @author maylian7700@126.com
49.  *
50.  */  
51. public class MemorySpaceCheck  
52. {  
53.       
54. /**
55.      * 计算剩余空间
56.      * @param path
57.      * @return
58.      */  
59. private static long getAvailableSize(String path)  
60.     {  
61. new StatFs(path);  
62.         fileStats.restat(path);  
63. return (long) fileStats.getAvailableBlocks() * fileStats.getBlockSize(); // 注意与fileStats.getFreeBlocks()的区别  
64.     }  
65.       
66. /**
67.      * 计算总空间
68.      * @param path
69.      * @return
70.      */  
71. private static long getTotalSize(String path)  
72.     {  
73. new StatFs(path);  
74.         fileStats.restat(path);  
75. return (long) fileStats.getBlockCount() * fileStats.getBlockSize();  
76.     }  
77.       
78. /**
79.      * 计算SD卡的剩余空间
80.      * @return 剩余空间
81.      */  
82. public static long getSDAvailableSize()  
83.     {  
84. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
85.         {  
86. return getAvailableSize(Environment.getExternalStorageDirectory().toString());  
87.         }  
88.           
89. return 0;  
90.     }  
91.       
92. /**
93.      * 计算系统的剩余空间
94.      * @return 剩余空间
95.      */  
96. public static long getSystemAvailableSize()  
97.     {  
98. // context.getFilesDir().getAbsolutePath();  
99. return getAvailableSize("/data");  
100.     }  
101.       
102. /**
103.      * 是否有足够的空间
104.      * @param filePath 文件路径,不是目录的路径
105.      * @return
106.      */  
107. public static boolean hasEnoughMemory(String filePath)  
108.     {  
109. new File(filePath);  
110. long length = file.length();  
111. if (filePath.startsWith("/sdcard") || filePath.startsWith("/mnt/sdcard"))  
112.         {  
113. return getSDAvailableSize() > length;  
114.         }  
115. else  
116.         {  
117. return getSystemAvailableSize() > length;  
118.         }  
119.           
120.     }  
121.       
122. /**
123.      * 获取SD卡的总空间
124.      * @return
125.      */  
126. public static long getSDTotalSize()  
127.     {  
128. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))  
129.         {  
130. return getTotalSize(Environment.getExternalStorageDirectory().toString());  
131.         }  
132.           
133. return 0;  
134.     }  
135.       
136. /**
137.      * 获取系统可读写的总空间
138.      * @return
139.      */  
140. public static long getSysTotalSize()  
141.     {  
142. return getTotalSize("/data");  
143.     }  
144. }  
145. </pre><br>  
146. <br>  
147. <pre></pre>  
148. <pre></pre>  
149. 如果想要在系统的存储空间中写入数据,可以用context.getFilesDir().getAbsolutePath(),获取该应用的可写目录,也就是/data/data/应用主包名/files目录,可以往里面写入数据,在应用被卸载时,也一并被删除,不用担心会产生垃圾,灰常给力。如果不妥之处,欢迎批评指正!  
150. <p></p>  
151. <pre></pre>  
152. <pre></pre>  
153. <pre></pre>  
154. <pre></pre>  
155. <pre></pre>  
156. <pre></pre>  
157. <pre></pre>  
158. <pre></pre>  
159. <pre></pre>  
160. <pre></pre>  
161. <pre></pre>  
162. <pre></pre>  
163. <pre></pre>  
164. <pre></pre>  
165. <pre></pre>  
166. <pre></pre>  
167. <pre></pre>  
168. <pre></pre>  
169. <pre></pre>  
170. <pre></pre>  
171. <pre></pre>  
172. <pre></pre>  
173.   
174. </pre></pre></pre></pre>