这几天事情比较少,于是对前面用到的一些东西时行了总结。
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>