<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_OnSorrow+=new EventHandler(smile)</title><subtitle type="text">侧耳倾听</subtitle><id>http://feed.cnblogs.com/blog/u/17486/rss</id><updated>2011-10-08T09:14:44Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/17486/rss"/><entry><id>http://www.cnblogs.com/abob/archive/2011/10/08/2202328.html</id><title type="text">合并odex和少dex的apk</title><summary type="text">合并odex和 少dex的apk 为完整的apk文件 需要用到的工具是smali，一个开源的java处理软件： http://code.google.com/p/smali/downloads/list 一.下载的baksmali和 smali的jar文件到工作目录 二.把ROM里面的core.odex, ext.odex, framework.odex, android.policy.odex, services.odex这5个文件也放在同一目录（也可以放在别的目录，通过设置BOOTCLASSPATH指定，默认就是当前目录）。 例： 以teeter为例子 (HTC一些Android常常会内.</summary><published>2011-10-08T09:15:00Z</published><updated>2011-10-08T09:15:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/10/08/2202328.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/10/08/2202328.html"/><content type="html">&lt;span style="line-height: 24px; font-family: arial, 宋体, sans-serif"&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;合并odex和 少dex的apk 为完整的apk文件&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;需要用到的工具是smali，一个开源的java处理软件：&amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;&lt;a style="vertical-align: baseline; color: rgb(19,61,182); text-decoration: none" href="http://code.google.com/p/smali/downloads/list" target="_blank" rel="nofollow"&gt;http://code.google.com/p/smali/downloads/list&lt;/a&gt; &amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;一.下载的baksmali和 smali的jar文件到工作目录 &amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;二.把ROM里面的core.odex, ext.odex, framework.odex, android.policy.odex, services.odex这5个文件也放在同一目录（也可以放在别的目录，通过设置BOOTCLASSPATH指定，默认就是当前目录）。 &amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;例： 以teeter为例子 (HTC一些Android常常会内置)，ROM里面拿出来的可能是2个文件，teeter.apk + teeter.odex。&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;1、分解odex文件： java -jar baksmali-1.2.1.jar -x teeter.odex 如果没其他问题，会在工作目录生成一个out的目录，里面是分解出来的一些文件，我们在此不深究这些文件的作用。&amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;2、把分解得到的文件变成classes.dex：java -Xmx512M -jar smali-1.2.1.jar out -o classes.dex，这样得到了一个有用的classes.dex文件&amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;3、用WinZip或者WinRAR打开teeter.apk文件，把这个classes.dex 放进去&amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;4、最后再用signapk把最新得到的这个包含classes.dex的apk重新签署一下 (Auto Sign签名工具往期的文章里有下载)，就生成一个可以安装的单独APK程序了。 &amp;nbsp;&lt;/pre&gt;&lt;pre id="best-answer-content" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; line-height: 22px; padding-top: 0px; zoom: 1; font-family: Arial; word-wrap: break-word"&gt;5、签名完成后即可安装使用了&lt;/pre&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/2202328.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/10/08/2202328.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/07/13/2105739.html</id><title type="text">RGB</title><summary type="text">A R G B透明度 红色 绿色 蓝色Bitmap.ConfigARGB_4444 每个像素占四位Bitmap.ConfigARGB_8888 32 每个像素占八位Bitmap.ConfigRGB_565 16 R占5位 R 占6位 B占5位 没有透明度（A）其实很简单嘛就跟doublefloat一样 你越到精度也就越到但是一点主意点一半情况下我们都是用argb888 但是无可厚非它也相对的很占内存因为一个像素32位8位一个字节 如果是800*480的图片的话自己算估计有1M多了所以各位使用的时候悠着点 因为作为应用开发人员你使用的内存是有限的</summary><published>2011-07-13T14:06:00Z</published><updated>2011-07-13T14:06:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/07/13/2105739.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/07/13/2105739.html"/><content type="html">&lt;span  style="border-collapse: collapse; color: #444444; font-family: 'DejaVu Sans', 'Lucida Grande', Tahoma, 'Hiragino Sans GB', STHeiti, SimSun, sans-serif; "&gt;A&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;R&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;G&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; B&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;透明度&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;红色&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 绿色&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;蓝色&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;Bitmap.Config&amp;nbsp;&amp;nbsp;ARGB_4444&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;每个像素&amp;nbsp;&amp;nbsp;占四位&amp;nbsp;&amp;nbsp;&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;Bitmap.Config&amp;nbsp;&amp;nbsp;ARGB_8888&amp;nbsp; &amp;nbsp; 32&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;每个像素&amp;nbsp;&amp;nbsp;占八位&amp;nbsp;&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;Bitmap.Config&amp;nbsp;&amp;nbsp;RGB_565&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;16&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;R占5位&amp;nbsp; &amp;nbsp;R 占6位&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;B占5位&amp;nbsp; &amp;nbsp; 没有透明度（A）&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;其实很简单嘛就跟double&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;一样&amp;nbsp; &amp;nbsp;你越到精度也就越到&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;但是一点主意点&amp;nbsp;&amp;nbsp;一半情况下我们都是用argb888&amp;nbsp; &amp;nbsp; 但是无可厚非&amp;nbsp;&amp;nbsp;它也相对的很占内存&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;因为一个像素32位&amp;nbsp;&amp;nbsp;8位一个字节&amp;nbsp; &amp;nbsp;如果是800*480的图片的话自己算&amp;nbsp;&amp;nbsp;估计有1M多了&amp;nbsp;&amp;nbsp;&lt;br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; word-wrap: break-word; " /&gt;所以各位使用的时候悠着点&amp;nbsp; &amp;nbsp;因为作为应用开发人员你使用的内存是有限的&lt;/span&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/2105739.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/07/13/2105739.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/07/07/2099688.html</id><title type="text">直接打开文件系统的sqlite DB</title><summary type="text">String path = file.getPath();SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);</summary><published>2011-07-06T17:32:00Z</published><updated>2011-07-06T17:32:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/07/07/2099688.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/07/07/2099688.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp;String path = file.getPath();&lt;/div&gt;&lt;div&gt;SQLiteDatabase &amp;nbsp;db = SQLiteDatabase.openDatabase(path, null,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQLiteDatabase.OPEN_READONLY);&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/2099688.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/07/07/2099688.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/07/06/2099237.html</id><title type="text">Android 的 dex2jar 和 jd-gui 反编译 apk 源代码</title><summary type="text"/><published>2011-07-06T07:03:00Z</published><updated>2011-07-06T07:03:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/07/06/2099237.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/07/06/2099237.html"/><content type="html">&lt;font  color="#333333" face="Arial"&gt;&lt;span  style="line-height: 26px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/font&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/2099237.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/07/06/2099237.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/04/01/2002377.html</id><title type="text">Android 内存泄漏调试</title><summary type="text">一、概述 1 二、Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时，没有使用缓存的 convertView 3 (三) Bitmap对象不在使用时调用recycle()释放内存 4 (四) 释放对象的引用 4 (五) 其他 5 三、内存监测工具 DDMS --&amp;gt; Heap 5 四、内存分析工具 MAT(Memory Analyzer Tool) 7 (一) 生成.hprof文件 7 (二) 使用MAT导入.hprof文件 8 (三) 使用MAT的视图工具分析内存 8 一、概述 Java编程中经常容易被忽视，</summary><published>2011-04-01T09:01:00Z</published><updated>2011-04-01T09:01:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/04/01/2002377.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/04/01/2002377.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;cite&gt; &lt;/cite&gt; 					 				&lt;/strong&gt;&lt;/p&gt; 				&lt;div&gt;  					  					  					&lt;p&gt;一、概述 1&lt;br /&gt; 二、Android(Java)中常见的容易引起内存泄漏的不良代码 1&lt;br /&gt; (一) 查询数据库没有关闭游标 2&lt;br /&gt; (二) 构造Adapter时，没有使用缓存的 convertView 3&lt;br /&gt; (三) Bitmap对象不在使用时调用recycle()释放内存 4&lt;br /&gt; (四) 释放对象的引用 4&lt;br /&gt; (五) 其他 5&lt;br /&gt; 三、内存监测工具 DDMS --&amp;gt; Heap 5&lt;br /&gt; 四、内存分析工具 MAT(Memory Analyzer Tool) 7&lt;br /&gt; (一) 生成.hprof文件 7&lt;br /&gt; (二) 使用MAT导入.hprof文件 8&lt;br /&gt; (三) 使用MAT的视图工具分析内存 8&lt;br /&gt;  &amp;nbsp;一、概述&lt;br /&gt;  &amp;nbsp;    Java编程中经常容易被忽视，但本身又十分重要的一个问题就是内存使用的问题。Android应用主要使用Java语言编写，因此这个问题也同样会在 Android开发中出现。本文不对Java编程问题做探讨，而是对于在Android中，特别是应用开发中的此类问题进行整理。&lt;br /&gt;  &amp;nbsp;   由于作者接触Android时间并不是很长，因此如有叙述不当之处，欢迎指正。&lt;br /&gt; 二、Android(Java)中常见的容易引起内存泄漏的不良代码&lt;br /&gt;  &amp;nbsp;    Android主要应用在嵌入式设备当中，而嵌入式设备由于一些众所周知的条件限制，通常都不会有很高的配置，特别是内存是比较有限的。如果我们编写的代 码当中有太多的对内存使用不当的地方，难免会使得我们的设备运行缓慢，甚至是死机。为了能够使得Android应用程序安全且快速的运行，Android 的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行，它是由Zygote服务进程孵化出来的，也就是说每个应用程序都是在属于自己的进程中运 行的。一方面，如果程序在运行过程中出现了内存泄漏的问题，仅仅会使得自己的进程被kill掉，而不会影响其他进程（如果是system_process 等系统进程出问题的话，则会引起系统重启）。另一方面Android为不同类型的进程分配了不同的内存使用上限，如果应用进程使用的内存超过了这个上限， 则会被系统视为内存泄漏，从而被kill掉。Android为应用进程分配的内存上限如下所示：&lt;br /&gt; 位置： /ANDROID_SOURCE/system/core/rootdir/init.rc 部分脚本&lt;br /&gt; # Define the oom_adj values for the classes of processes that can be&lt;br /&gt; # killed by the kernel.  These are used in ActivityManagerService.&lt;br /&gt;  &amp;nbsp;   setprop ro.FOREGROUND_APP_ADJ 0&lt;br /&gt;  &amp;nbsp;   setprop ro.VISIBLE_APP_ADJ 1&lt;br /&gt;  &amp;nbsp;   setprop ro.SECONDARY_SERVER_ADJ 2&lt;br /&gt;  &amp;nbsp;   setprop ro.BACKUP_APP_ADJ 2&lt;br /&gt;  &amp;nbsp;   setprop ro.HOME_APP_ADJ 4&lt;br /&gt;  &amp;nbsp;   setprop ro.HIDDEN_APP_MIN_ADJ 7&lt;br /&gt;  &amp;nbsp;   setprop ro.CONTENT_PROVIDER_ADJ 14&lt;br /&gt;  &amp;nbsp;   setprop ro.EMPTY_APP_ADJ 15&lt;br /&gt; # Define the memory thresholds at which the above process classes will&lt;br /&gt; # be killed.  These numbers are in pages (4k).&lt;br /&gt;  &amp;nbsp;   setprop ro.FOREGROUND_APP_MEM 1536&lt;br /&gt;  &amp;nbsp;   setprop ro.VISIBLE_APP_MEM 2048&lt;br /&gt;  &amp;nbsp;   setprop ro.SECONDARY_SERVER_MEM 4096&lt;br /&gt;  &amp;nbsp;   setprop ro.BACKUP_APP_MEM 4096&lt;br /&gt;  &amp;nbsp;   setprop ro.HOME_APP_MEM 4096&lt;br /&gt;  &amp;nbsp;   setprop ro.HIDDEN_APP_MEM 5120&lt;br /&gt;  &amp;nbsp;   setprop ro.CONTENT_PROVIDER_MEM 5632&lt;br /&gt;  &amp;nbsp;   setprop ro.EMPTY_APP_MEM 6144&lt;br /&gt; # Write value must be consistent with the above properties.&lt;br /&gt; # Note that the driver only supports 6 slots, so we have HOME_APP at the&lt;br /&gt; # same memory level as services.&lt;br /&gt;  &amp;nbsp;   write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15&lt;br /&gt;  &amp;nbsp;   write /proc/sys/vm/overcommit_memory 1&lt;br /&gt;  &amp;nbsp;   write /proc/sys/vm/min_free_order_shift 4&lt;br /&gt;  &amp;nbsp;   write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144&lt;br /&gt;  &amp;nbsp;   # Set init its forked children's oom_adj.&lt;br /&gt;  &amp;nbsp;   write /proc/1/oom_adj -16&lt;br /&gt;  &amp;nbsp;   正因为我们的应用程序能够使用的内存有限，所以在编写代码的时候需要特别注意内存使用问题。如下是一些常见的内存使用不当的情况。&lt;br /&gt;  &amp;nbsp;(一) 查询数据库没有关闭游标&lt;br /&gt; 描述：&lt;br /&gt;  &amp;nbsp;   程序中经常会进行查询数据库的操作，但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小，对内存的消耗不容易被发现，只有在常时间大量操作的情况下才会复现内存问题，这样就会给以后的测试和问题排查带来困难和风险。&lt;br /&gt;  &amp;nbsp;示例代码：&lt;br /&gt; Cursor cursor = getContentResolver().query(uri ...);&lt;br /&gt; if (cursor.moveToNext()) {&lt;br /&gt;  &amp;nbsp;   ... ...&amp;nbsp; &lt;br /&gt; }&lt;br /&gt;  &amp;nbsp;修正示例代码：&lt;br /&gt; Cursor cursor = null;&lt;br /&gt; try {&lt;br /&gt;  &amp;nbsp;   cursor = getContentResolver().query(uri ...);&lt;br /&gt;  &amp;nbsp;   if (cursor != null &amp;amp;&amp;amp; cursor.moveToNext()) {&lt;br /&gt;  &amp;nbsp;       ... ...&amp;nbsp; &lt;br /&gt;  &amp;nbsp;   }&lt;br /&gt; } finally {&lt;br /&gt;  &amp;nbsp;   if (cursor != null) {&lt;br /&gt;  &amp;nbsp;       try {&amp;nbsp; &lt;br /&gt;  &amp;nbsp;           cursor.close();&lt;br /&gt;  &amp;nbsp;       } catch (Exception e) {&lt;br /&gt;  &amp;nbsp;           //ignore this&lt;br /&gt;  &amp;nbsp;       }&lt;br /&gt;  &amp;nbsp;   }&lt;br /&gt; }&amp;nbsp; &lt;br /&gt;  &amp;nbsp;(二) 构造Adapter时，没有使用缓存的 convertView&lt;br /&gt; 描述：&lt;br /&gt;  &amp;nbsp;   以构造ListView的BaseAdapter为例，在BaseAdapter中提高了方法：&lt;br /&gt; public View getView(int position, View convertView, ViewGroup parent)&lt;br /&gt; 来 向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的 view对象，同时ListView会将这些view对象缓存起来。当向上滚动ListView时，原先位于最上面的list  item的view对象会被回收，然后被用来构造新出现的最下面的list  item。这个构造过程就是由getView()方法完成的，getView()的第二个形参 View  convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。&lt;br /&gt;  &amp;nbsp;   由此可以看出，如果我们不去使用convertView，而是每次都在getView()中重新实例化一个View对象的话，即浪费资源也浪费时间，也会使得内存占用越来越大。ListView回收list item的view对象的过程可以查看:&lt;br /&gt; android.widget.AbsListView.java --&amp;gt; void addScrapView(View scrap) 方法。&lt;br /&gt;  &amp;nbsp;示例代码：&lt;br /&gt; public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;  &amp;nbsp;   View view = new Xxx(...);&lt;br /&gt;  &amp;nbsp;   ... ...&lt;br /&gt;  &amp;nbsp;   return view;&lt;br /&gt; }&lt;br /&gt;  &amp;nbsp;修正示例代码：&lt;br /&gt; public View getView(int position, View convertView, ViewGroup parent) {&lt;br /&gt;  &amp;nbsp;   View view = null;&lt;br /&gt;  &amp;nbsp;   if (convertView != null) {&lt;br /&gt;  &amp;nbsp;       view = convertView;&lt;br /&gt;  &amp;nbsp;       populate(view, getItem(position));&lt;br /&gt;  &amp;nbsp;       ...&lt;br /&gt;  &amp;nbsp;   } else {&lt;br /&gt;  &amp;nbsp;       view = new Xxx(...);&lt;br /&gt;  &amp;nbsp;       ...&lt;br /&gt;  &amp;nbsp;   }&lt;br /&gt;  &amp;nbsp;   return view;&lt;br /&gt; }&amp;nbsp; &lt;br /&gt;  &amp;nbsp;(三) Bitmap对象不在使用时调用recycle()释放内存&lt;br /&gt; 描述：&lt;br /&gt;  &amp;nbsp;   有时我们会手工的操作Bitmap对象，如果一个Bitmap对象比较占内存，当它不在被使用的时候，可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存，但这不是必须的，视情况而定。可以看一下代码中的注释：&lt;br /&gt;  &amp;nbsp;   /**&lt;br /&gt;  &amp;nbsp;    * Free up the memory associated with this bitmap's pixels, and mark the&lt;br /&gt;  &amp;nbsp;    * bitmap as "dead", meaning it will throw an exception if getPixels() or&lt;br /&gt;  &amp;nbsp;    * setPixels() is called, and will draw nothing. This operation cannot be&lt;br /&gt;  &amp;nbsp;    * reversed, so it should only be called if you are sure there are no&lt;br /&gt;  &amp;nbsp;    * further uses for the bitmap. This is an advanced call, and normally need&lt;br /&gt;  &amp;nbsp;    * not be called, since the normal GC process will free up this memory when&lt;br /&gt;  &amp;nbsp;    * there are no more references to this bitmap.&lt;br /&gt;  &amp;nbsp;    */&lt;br /&gt; (四) 释放对象的引用&lt;br /&gt; 描述：&lt;br /&gt;  &amp;nbsp;   这种情况描述起来比较麻烦，举两个例子进行说明。&lt;br /&gt; 示例A：&lt;br /&gt; 假设有如下操作&lt;br /&gt; public class DemoActivity extends Activity {&lt;br /&gt;  &amp;nbsp;   ... ...&lt;br /&gt;  &amp;nbsp;   private Handler mHandler = ...&lt;br /&gt;  &amp;nbsp;   private Object obj;&lt;br /&gt;  &amp;nbsp;   public void operation() {&lt;br /&gt;  &amp;nbsp;    obj = initObj();&lt;br /&gt;  &amp;nbsp;    ...&lt;br /&gt;  &amp;nbsp;    [Mark]&lt;br /&gt;  &amp;nbsp;    mHandler.post(new Runnable() {&lt;br /&gt;  &amp;nbsp;           public void run() {&lt;br /&gt;  &amp;nbsp;            useObj(obj);&lt;br /&gt;  &amp;nbsp;           }&lt;br /&gt;  &amp;nbsp;    });&lt;br /&gt;  &amp;nbsp;   }&lt;br /&gt; }&lt;br /&gt;  &amp;nbsp;   我们有一个成员变量  obj，在operation()中我们希望能够将处理obj实例的操作post到某个线程的MessageQueue中。在以上的代码中，即便是 mHandler所在的线程使用完了obj所引用的对象，但这个对象仍然不会被垃圾回收掉，因为DemoActivity.obj还保有这个对象的引用。 所以如果在DemoActivity中不再使用这个对象了，可以在[Mark]的位置释放对象的引用，而代码可以修改为：&lt;br /&gt; ... ...&lt;br /&gt; public void operation() {&lt;br /&gt;  &amp;nbsp;   obj = initObj();&lt;br /&gt;  &amp;nbsp;   ...&lt;br /&gt;  &amp;nbsp;   final Object o = obj;&lt;br /&gt;  &amp;nbsp;   obj = null;&lt;br /&gt;  &amp;nbsp;   mHandler.post(new Runnable() {&lt;br /&gt;  &amp;nbsp;       public void run() {&lt;br /&gt;  &amp;nbsp;           useObj(o);&lt;br /&gt;  &amp;nbsp;       }&lt;br /&gt;  &amp;nbsp;   }&lt;br /&gt; }&lt;br /&gt; ... ...&lt;br /&gt;  &amp;nbsp;示例B:&lt;br /&gt;  &amp;nbsp;    假设我们希望在锁屏界面(LockScreen)中，监听系统中的电话服务以获取一些信息(如信号强度等)，则可以在LockScreen中定义一个 PhoneStateListener的对象，同时将它注册到TelephonyManager服务中。对于LockScreen对象，当需要显示锁屏界 面的时候就会创建一个LockScreen对象，而当锁屏界面消失的时候LockScreen对象就会被释放掉。&lt;br /&gt;  &amp;nbsp;    但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象，则会导致LockScreen无法被垃 圾回收。如果不断的使锁屏界面显示和消失，则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得 system_process进程挂掉。&lt;br /&gt;  &amp;nbsp;   总之当一个生命周期较短的对象A，被一个生命周期较长的对象B保有其引用的情况下，在A的生命周期结束时，要在B中清除掉对A的引用。&lt;br /&gt; (五) 其他&lt;br /&gt;  &amp;nbsp;    Android应用程序中最典型的需要注意释放资源的情况是在Activity的生命周期中，在onPause()、onStop()、 onDestroy()方法中需要适当的释放资源的情况。由于此情况很基础，在此不详细说明，具体可以查看官方文档对Activity生命周期的介绍，以 明确何时应该释放哪些资源。&lt;br /&gt; 三、内存监测工具 DDMS --&amp;gt; Heap&lt;br /&gt;  &amp;nbsp;   无论怎么小心，想完全避免bad  code是不可能的，此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。Android  tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件，并以真机为例，在模拟器中的情况类似)。用 Heap监测应用进程使用内存情况的步骤如下：&lt;br /&gt; 1. 启动eclipse后，切换到DDMS透视图，并确认Devices视图、Heap视图都是打开的；&lt;br /&gt; 2. 将手机通过USB链接至电脑，链接时需要确认手机是处于&amp;#8220;USB调试&amp;#8221;模式，而不是作为&amp;#8220;Mass Storage&amp;#8221;；&lt;br /&gt; 3. 链接成功后，在DDMS的Devices视图中将会显示手机设备的序列号，以及设备中正在运行的部分进程信息；&lt;br /&gt; 4. 点击选中想要监测的进程，比如system_process进程；&lt;br /&gt; 5. 点击选中Devices视图界面中最上方一排图标中的&amp;#8220;Update Heap&amp;#8221;图标；&lt;br /&gt; 6. 点击Heap视图中的&amp;#8220;Cause GC&amp;#8221;按钮；&lt;br /&gt; 7. 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。&lt;br /&gt;  &amp;nbsp;说明：&lt;br /&gt; a) 点击&amp;#8220;Cause GC&amp;#8221;按钮相当于向虚拟机请求了一次gc操作；&lt;br /&gt; b) 当内存使用信息第一次显示以后，无须再不断的点击&amp;#8220;Cause GC&amp;#8221;，Heap视图界面会定时刷新，在对应用的不断的操作过程中就可以看到内存使用的变化；&lt;br /&gt; c) 内存使用信息的各项参数根据名称即可知道其意思，在此不再赘述。&lt;br /&gt;  &amp;nbsp;    如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值：Heap视图中部有一个Type叫做data  object，即数据对象，也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是&amp;#8220;Total  Size&amp;#8221;，其值就是当前进程中所有Java数据对象的内存总量，一般情况下，这个值的大小决定了是否会有内存泄漏。可以这样判断：&lt;br /&gt; a) 不断的操作当前应用，同时注意观察data object的Total Size值；&lt;br /&gt; b)  正常情况下Total  Size值都会稳定在一个有限的范围内，也就是说由于程序中的的代码良好，没有造成对象不被垃圾回收的情况，所以说虽然我们不断的操作会不断的生成很多对 象，而在虚拟机不断的进行GC的过程中，这些对象都被回收了，内存占用量会会落到一个稳定的水平；&lt;br /&gt; c) 反之如果代码中存在没有释放对象引用的情况，则data object的Total Size值在每次GC后不会有明显的回落，随着操作次数的增多Total Size的值会越来越大，&lt;br /&gt;  &amp;nbsp;   直到到达一个上限后导致进程被kill掉。&lt;br /&gt; d) 此处已system_process进程为例，在我的测试环境中system_process进程所占用的内存的data object的Total Size正常情况下会稳定在2.2~2.8之间，而当其值超过3.55后进程就会被kill。&lt;br /&gt; &amp;nbsp; &lt;br /&gt;  &amp;nbsp;   总之，使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; Android的内存溢出是如何发生的? &lt;p&gt;Android的虚拟机是基于寄存器的Dalvik，它的最大堆大小一般是16M，有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。&lt;/p&gt; &lt;p&gt;为什么会出现内存不够用的情况呢？我想原因主要有两个：&lt;/p&gt; &lt;ul&gt;&lt;li&gt;由于我们程序的失误，长期保持某些资源（如Context）的引用，造成内存泄露，资源造成得不到释放。&lt;/li&gt;&lt;li&gt;保存了多个耗用内存过大的对象（如Bitmap），造成内存超出限制。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;三、万恶的static&lt;/p&gt; &lt;p&gt;static是Java中的一个关键字，当用它来修饰成员变量时，那么该变量就属于该类，而不是该类的实例。所以用static修饰的变量，它的生命周期是很长的，如果用它来引用一些资源耗费过多的实例（Context的情况最多），这时就要谨慎对待了。&lt;/p&gt;  &lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;public&amp;nbsp;class&amp;nbsp;ClassName&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;Context&amp;nbsp;mContext;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//省略&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;  &lt;p style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt;"&gt;以上的代码是很危险的，如果将Activity赋值到么mContext的话。那么即使该Activity已经onDestroy，但是由于仍有对象保存它的引用，因此该Activity依然不会被释放。&lt;br /&gt; &lt;/p&gt;  &lt;p&gt;我们举Android文档中的一个例子。&lt;/p&gt;  &lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;private&amp;nbsp;static&amp;nbsp;Drawable&amp;nbsp;sBackground;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;span&gt;@Override&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;void&amp;nbsp;onCreate(Bundle&amp;nbsp;state)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;super.onCreate(state);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TextView&amp;nbsp;label&amp;nbsp;=&amp;nbsp;&lt;span&gt;new&amp;nbsp;TextView(this);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;label.setText(&lt;span&gt;"Leaks&amp;nbsp;are&amp;nbsp;bad");&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;if&amp;nbsp;(sBackground&amp;nbsp;==&amp;nbsp;null)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sBackground&amp;nbsp;=&amp;nbsp;getDrawable(R.drawable.large_bitmap);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;label.setBackgroundDrawable(sBackground);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(label);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt; &lt;p style="margin-bottom: 0pt; margin-top: 0pt;"&gt;sBackground,&amp;nbsp;是 一个静态的变量，但是我们发现，我们并没有显式的保存Contex的引用，但是，当Drawable与View连接之后，Drawable就将View设 置为一个回调，由于View中是包含Context的引用的，所以，实际上我们依然保存了Context的引用。这个引用链如下：&lt;/p&gt; &lt;p&gt;Drawable-&amp;gt;TextView-&amp;gt;Context&lt;/p&gt; &lt;p&gt;所以，最终该Context也没有得到释放，发生了内存泄露。&lt;/p&gt; &lt;p&gt;如何才能有效的避免这种引用的发生呢？&lt;/p&gt; &lt;p&gt;第一，应该尽量避免static成员变量引用资源耗费过多的实例，比如Context。&lt;/p&gt; &lt;p&gt;第二、Context尽量使用Application&amp;nbsp;Context，因为Application的Context的生命周期比较长，引用它不会出现内存泄露的问题。&lt;/p&gt; &lt;p&gt;第三、使用WeakReference代替强引用。比如可以使用WeakReference&amp;lt;Context&amp;gt;&amp;nbsp;mContextRef;&lt;/p&gt; &lt;p&gt;该部分的详细内容也可以参考Android文档中Article部分。&lt;/p&gt; &lt;p&gt;四、都是线程惹的祸&lt;/p&gt; &lt;p&gt;线程也是造成内存泄露的一个重要的源头。线程产生内存泄露的主要原因在于线程生命周期的不可控。我们来考虑下面一段代码。&lt;/p&gt; &lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;public&amp;nbsp;class&amp;nbsp;MyActivity&amp;nbsp;extends&amp;nbsp;Activity&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;@Override&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;public&amp;nbsp;void&amp;nbsp;onCreate(Bundle&amp;nbsp;savedInstanceState)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;super.onCreate(savedInstanceState);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(R.layout.main);&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;new&amp;nbsp;MyThread().start();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;private&amp;nbsp;class&amp;nbsp;MyThread&amp;nbsp;extends&amp;nbsp;Thread{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;@Override&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;public&amp;nbsp;void&amp;nbsp;run()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;super.run();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;//do&amp;nbsp;somthing&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;  &lt;p style="margin-bottom: 0pt; margin-top: 0pt;"&gt;这段代码很平常也很 简单，是我们经常使用的形式。我们思考一个问题：假设MyThread的run函数是一个很费时的操作，当我们开启该线程后，将设备的横屏变为了竖屏，一 般情况下当屏幕转换时会重新创建Activity，按照我们的想法，老的Activity应该会被销毁才对，然而事实上并非如此。&lt;/p&gt; &lt;p&gt;由于我们的线程是Activity的内部类，所以MyThread中保存了Activity的一个引用，当MyThread的run函数没有结束时，MyThread是不会被销毁的，因此它所引用的老的Activity也不会被销毁，因此就出现了内存泄露的问题。&lt;/p&gt; &lt;p&gt;&lt;a target="_blank" href="http://img1.51cto.com/attachment/201103/000214583.png"&gt;&lt;img alt="" src="http://img1.51cto.com/attachment/201103/000214583.png" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0pt; margin-top: 0pt;"&gt;有些人喜欢用Android提供的AsyncTask，但事实上AsyncTask的问题更加严重，Thread只有在run函数不结束时才出现这种内 存泄露问题，然而AsyncTask内部的实现机制是运用了ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的，是应 用程序无法控制的，因此如果AsyncTask作为Activity的内部类，就更容易出现内存泄露的问题。&lt;br /&gt; &lt;/p&gt; &lt;p&gt;这种线程导致的内存泄露问题应该如何解决呢？&lt;/p&gt; &lt;p&gt;第一、将线程的内部类，改为静态内部类。&lt;br /&gt; &lt;/p&gt; &lt;p&gt;第二、在线程内部采用弱引用保存Context引用。&lt;/p&gt; &lt;p&gt;解决的模型如下：&lt;/p&gt; &lt;pre&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;public&amp;nbsp;abstract&amp;nbsp;class&amp;nbsp;WeakAsyncTask&amp;lt;Params,&amp;nbsp;Progress,&amp;nbsp;Result,&amp;nbsp;WeakTarget&amp;gt;&amp;nbsp;extends&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AsyncTask&amp;lt;Params,&amp;nbsp;Progress,&amp;nbsp;Result&amp;gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;WeakReference&amp;lt;WeakTarget&amp;gt;&amp;nbsp;mTarget;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;public&amp;nbsp;WeakAsyncTask(WeakTarget&amp;nbsp;target)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mTarget&amp;nbsp;=&amp;nbsp;&lt;span&gt;new&amp;nbsp;WeakReference&amp;lt;WeakTarget&amp;gt;(target);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;/**&amp;nbsp;{@inheritDoc}&amp;nbsp;*/&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;@Override&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;final&amp;nbsp;void&amp;nbsp;onPreExecute()&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;final&amp;nbsp;WeakTarget&amp;nbsp;target&amp;nbsp;=&amp;nbsp;mTarget.get();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;if&amp;nbsp;(target&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;this.onPreExecute(target);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;/**&amp;nbsp;{@inheritDoc}&amp;nbsp;*/&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;@Override&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;final&amp;nbsp;Result&amp;nbsp;doInBackground(Params...&amp;nbsp;params)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;final&amp;nbsp;WeakTarget&amp;nbsp;target&amp;nbsp;=&amp;nbsp;mTarget.get();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;if&amp;nbsp;(target&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;return&amp;nbsp;this.doInBackground(target,&amp;nbsp;params);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span&gt;else&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;return&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;/**&amp;nbsp;{@inheritDoc}&amp;nbsp;*/&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;@Override&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;final&amp;nbsp;void&amp;nbsp;onPostExecute(Result&amp;nbsp;result)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;final&amp;nbsp;WeakTarget&amp;nbsp;target&amp;nbsp;=&amp;nbsp;mTarget.get();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;if&amp;nbsp;(target&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;this.onPostExecute(target,&amp;nbsp;result);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;void&amp;nbsp;onPreExecute(WeakTarget&amp;nbsp;target)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;//&amp;nbsp;No&amp;nbsp;default&amp;nbsp;action&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;abstract&amp;nbsp;Result&amp;nbsp;doInBackground(WeakTarget&amp;nbsp;target,&amp;nbsp;Params...&amp;nbsp;params);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;protected&amp;nbsp;void&amp;nbsp;onPostExecute(WeakTarget&amp;nbsp;target,&amp;nbsp;Result&amp;nbsp;result)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;//&amp;nbsp;No&amp;nbsp;default&amp;nbsp;action&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;li&gt;}&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt; &lt;span style="font-size: 12px;"&gt;&lt;strong&gt;&lt;br /&gt; &lt;/strong&gt;&lt;/span&gt;&lt;span style="font-size: 14px;"&gt;&lt;br /&gt; &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;事实上，线程的问题并不仅仅在于内存泄露，还会带来一些灾难性的问题。由于本文讨论的是内存问题，所以在此不做讨论。&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/2002377.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/04/01/2002377.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/03/24/1994247.html</id><title type="text">Linerlayout  Layout_wight</title><summary type="text">layout_weight 用于给一个线性布局中的诸多视图的重要度赋值。 所有的视图都有一个layout_weight值，默认为零，意思是需要显示 多大的视图就占据多大的屏幕空 间。若赋一个高于零的值，则将父视 图中的可用空间分割，分割大小具体取决于每一个视图的layout_weight 值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布 局的layout_weight值中所占的比率而定。 举个例子：比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。 该文本标签并无指定layout_weight值，所以它将占据需要提供的最少空间。 如果两个文本编辑元素每一个</summary><published>2011-03-24T11:07:00Z</published><updated>2011-03-24T11:07:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/03/24/1994247.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/03/24/1994247.html"/><content type="html">&lt;div&gt;layout_weight 用于给一个线性布局中的诸多视图的重要度赋值。  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 所有的视图都有一个layout_weight值，默认为零，意思是需要显示  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 多大的视图就占据多大的屏幕空 间。若赋一个高于零的值，则将父视  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 图中的可用空间分割，分割大小具体取决于每一个视图的layout_weight  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 局的layout_weight值中所占的比率而定。  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 举个例子：比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 该文本标签并无指定layout_weight值，所以它将占据需要提供的最少空间。  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果两个文本编辑元素每一个的layout_weight值都设置为1，则两者平分  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个&amp;nbsp;  &lt;br /&gt;&amp;nbsp;&amp;nbsp; 文本编辑元素其中第一个的layout_weight值设置为1，而第二个的设置为2，  &lt;br /&gt;&amp;nbsp;&amp;nbsp; 则剩余空间的三分之二分给第一个，三分之一分给第二个(数值越小，重要度越高)。  &lt;/div&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/1994247.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/03/24/1994247.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/03/24/1994213.html</id><title type="text">静态编译将jar打入apk</title><summary type="text">MakeFile静态编译将jar打入apkLOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := BaiduSDKDemoLOCAL_STATIC_JAVA_LIBRARIES := baiduadinclude $(BUILD_PACKAGE)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOC</summary><published>2011-03-24T10:23:00Z</published><updated>2011-03-24T10:23:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/03/24/1994213.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/03/24/1994213.html"/><content type="html">MakeFile&amp;nbsp;&amp;nbsp;&lt;div&gt;静态编译将jar打入apk&lt;/div&gt;&lt;p&gt;&lt;div&gt;LOCAL_PATH := $(call my-dir)&lt;br /&gt;include $(CLEAR_VARS)&lt;br /&gt;&lt;br /&gt;LOCAL_MODULE_TAGS := optional&lt;br /&gt;&lt;br /&gt;LOCAL_SRC_FILES := $(call all-java-files-under, src)&lt;br /&gt;&lt;br /&gt;LOCAL_PACKAGE_NAME := BaiduSDKDemo&lt;br /&gt;&lt;br /&gt;LOCAL_STATIC_JAVA_LIBRARIES := baiduad&lt;br /&gt;&lt;br /&gt;include $(BUILD_PACKAGE)&lt;br /&gt;&lt;br /&gt;include $(CLEAR_VARS)&lt;br /&gt;LOCAL_MODULE_TAGS := optional&lt;br /&gt;LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := baiduad:Baidu_MobAds_Android_SDK.jar&lt;br /&gt;include $(BUILD_MULTI_PREBUILT)&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/1994213.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/03/24/1994213.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/03/22/1991232.html</id><title type="text">强制竖屏</title><summary type="text">android:screenOrientation=&amp;quot;nosensor&amp;quot;orsetRequestOrientation(ActivityInfo.////);</summary><published>2011-03-22T03:39:00Z</published><updated>2011-03-22T03:39:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/03/22/1991232.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/03/22/1991232.html"/><content type="html">&lt;div&gt;android:screenOrientation="nosensor"&lt;/div&gt;&lt;p&gt;or&lt;/p&gt;&lt;p&gt;setRequestOrientation(ActivityInfo.////); &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/1991232.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/03/22/1991232.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/03/18/1988374.html</id><title type="text">Apk打入静态jar包的MakeFile</title><summary type="text">## Copyright (C) 2008 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required </summary><published>2011-03-18T11:00:00Z</published><updated>2011-03-18T11:00:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/03/18/1988374.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/03/18/1988374.html"/><content type="html">&lt;div&gt;&lt;div&gt;#&lt;/div&gt;&lt;div&gt;# Copyright (C) 2008 The Android Open Source Project&lt;/div&gt;&lt;div&gt;#&lt;/div&gt;&lt;div&gt;# Licensed under the Apache License, Version 2.0 (the "License");&lt;/div&gt;&lt;div&gt;# you may not use this file except in compliance with the License.&lt;/div&gt;&lt;div&gt;# You may obtain a copy of the License at&lt;/div&gt;&lt;div&gt;#&lt;/div&gt;&lt;div&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.apache.org/licenses/LICENSE-2.0&lt;/div&gt;&lt;div&gt;#&lt;/div&gt;&lt;div&gt;# Unless required by applicable law or agreed to in writing, software&lt;/div&gt;&lt;div&gt;# distributed under the License is distributed on an "AS IS" BASIS,&lt;/div&gt;&lt;div&gt;# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;/div&gt;&lt;div&gt;# See the License for the specific language governing permissions and&lt;/div&gt;&lt;div&gt;# limitations under the License.&lt;/div&gt;&lt;div&gt;#&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;LOCAL_PATH := $(call my-dir)&lt;/div&gt;&lt;div&gt;include $(CLEAR_VARS)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;LOCAL_STATIC_JAVA_LIBRARIES := libarity&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;LOCAL_MODULE_TAGS := eng development&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;LOCAL_SRC_FILES := $(call all-java-files-under, src)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;LOCAL_PACKAGE_NAME := Calculator&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;include $(BUILD_PACKAGE)&lt;/div&gt;&lt;div&gt;##################################################&lt;/div&gt;&lt;div&gt;include $(CLEAR_VARS)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-1.3.3.jar&lt;/div&gt;&lt;div&gt;include $(BUILD_MULTI_PREBUILT)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;# Use the folloing include to make our test apk.&lt;/div&gt;&lt;div&gt;include $(call all-makefiles-under,$(LOCAL_PATH))&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/1988374.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/03/18/1988374.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/abob/archive/2011/03/09/1978713.html</id><title type="text">Mercurial - 分布式版本控制系统</title><summary type="text">Mercurial 简介 Mercurial 是一种轻量级分布式版本控制系统，采用 Python 语言实现，易于学习和使用，扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。相对于传统的版本控制，具有如下优点： 更轻松的管理。传统的版本控制系统使用集中式的 repository，一些和 repository相关的管理就只能由管理员一个人进行。由于采用了分布式的模型，Mercurial 中就没有这样的困扰，每个用户管理自己的 repository，管理员只需协调同步这些repository。 更健壮的系统。分布式系统比集中式的单服务器系统更健壮</summary><published>2011-03-09T12:00:00Z</published><updated>2011-03-09T12:00:00Z</updated><author><name>cppguy</name><uri>http://www.cnblogs.com/abob/</uri></author><link rel="alternate" href="http://www.cnblogs.com/abob/archive/2011/03/09/1978713.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/abob/archive/2011/03/09/1978713.html"/><content type="html">&lt;p&gt;&lt;a name="1.Mercurial 简介"&gt;Mercurial 简介&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mercurial 是一种轻量级分布式版本控制系统，采用 Python 语言实现，易于学习和使用，扩展性强。其是基于 GNU General Public License (GPL) 授权的开源项目。相对于传统的版本控制，具有如下优点：&lt;/p&gt;&lt;ul&gt;&lt;li&gt; 更轻松的管理。传统的版本控制系统使用集中式的 repository，一些和  repository相关的管理就只能由管理员一个人进行。由于采用了分布式的模型，Mercurial 中就没有这样的困扰，每个用户管理自己的  repository，管理员只需协调同步这些repository。&lt;/li&gt;&lt;li&gt; 更健壮的系统。分布式系统比集中式的单服务器系统更健壮，单服务器系统一旦服务器出现问题整个系统就不能运行了，分布式系统通常不会因为一两个节点而受到影响。 &lt;/li&gt;&lt;li&gt; 对网络的依赖性更低。由于同步可以放在任意时刻进行，Mercurial 甚至可以离线进行管理，只需在有网络连接时同步。&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/abob/aggbug/1978713.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/abob/archive/2011/03/09/1978713.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
