xiaoguozi's Blog
Pay it forword - 我并不觉的自豪,我所尝试的事情都失败了······习惯原本生活的人不容易改变,就算现状很糟,他们也很难改变,在过程中,他们还是放弃了······他们一放弃,大家就都是输家······让爱传出去,很困难,也无法预料,人们需要更细心的观察别人,要随时注意才能保护别人,因为他们未必知道自己要什么·····
要 写好一个图像处理软件,仅靠自己看书是完全不够的,要多方面学习,借鉴前人的经验,要集思广益、多面出击。如今网络发达,图像学的资料其实也到处都是。只 是往往个人能力或精力有限,在短时间内无法找到那些也许藏于角落里的金子。本人研究图像至今也历时7年,在慢慢的摸索和累积中也找到了一些相关资料,共享 给大家学习。

1、 最著名的开源图像软件:GIMP。

      开发语言:C

      GIMP号称Linux下的PhotoShop,总观其工程,确实达到了PhotoShop早期版本的功能。三大利器:选区、图层、蒙板一应俱全,滤镜也非常丰富,支持插件。缺点就是界面不美观,用户体验差,执行速度在Windows下慢(Linux下不清楚)。

      官方网址为:http://www.gimp.org/

      源码下载:因其源码体积过大,请大家直接到其官网下载。

      对应的可执行文件可在官方网站下载。

      界面预览:

 

2、 微软曾支持过的"开源"图像软件:Paint.NET

      开发语言:C#

  Paint.NET是Windows 平台上的一个图像和照片处理软件,早期定位于MSPaint的免费替代软件,支持图层、通道、无限制的历史记录、特效和许多实用工具,在3.3版本之前开源,之后由于种种原因放弃开源。其界面看起来有点像Photoshop,执行速度上也不快。

      官方网站:http://www.getpaint.net/

      源码下载:http://files.cnblogs.com/Imageshop/Paint.net.rar

      界面预览:

 

 3、一个响当当的图像开源软件:ImageEditor 

     开发语言:JAVA

     一个用JAVA开发的图像处理软件,具有图层、选区、滤镜以及其他一些工具。整体来说较上述两个软件稍次一些,但依旧强劲。提供了很多独特的滤镜算法,工具箱中的透视变形工具很给力,是用JAVA开发图像值得借鉴的好代码。算法的执行速度一般。

      官方网址为:http://www.jhlabs.com/

      源码下载:http://files.cnblogs.com/Imageshop/jhlabs.rar

      源码中包含对应的EXE文件,但需要机器上安装了JAVA运行环境方可正常运行。

      界面预览:

 

4、优秀的图像操作类库: CxImage

     开发语言:C++

     它可以快捷地存取、显示、转换各种图像,自带了较多图像模式转换算法,以及一些滤镜,是VC使用者最为常用的图像类库。

     官方网址:http://www.codeproject.com/KB/graphics/cximage.aspx

     源码下载:http://files.cnblogs.com/Imageshop/cximage.rar

     界面预览:

 

5、国人的开源图像处理软件: Imagestone

     开发语言:C++ 

     ImageStone是一套功能强大的C++图像处理库,能读写JPG、GIF、PNG、TIFF、TGA等多种图像文件,有多达100多中预定义的特 效。其算法很多是取自GIMP的代码,如果认为GIMP的代码过于复杂,可以从该软件中很轻松分解出你需要的部分。

      官方网址为:http://www.codeproject.com/KB/graphics/ImageStone.aspx

      源码下载:http://files.cnblogs.com/Imageshop/ImageStone.rar

      界面预览:

 

6、基于AForge.NET的开源软件:iplab

     开发语言:C#

     和CxImage似乎是一个作者,包含了很多滤镜,也有一些图像识别上常用的分析方法。

     官方网址为:http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx 

     源码下载:http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab/iplab_src.zip

     界面预览:

 

 

7、一款VB值得爱好者学习的软件:iBmp

      开发工具:VB6

      虽然在提供的算法上没有什么太多值得说明的地方,但在图像缩放的坐标计算、偏移、图像导航器方面的代码确实值得大家学习。

      官方网址为:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=42376&lngWId=1

      源码下载:http://files.cnblogs.com/Imageshop/iBMP.rar

      界面预览:

 

8、其他的一些开源软件:

    (1) PhotoSprite:一个国产的用C#开发的类似PHOTOSHOP的软件(太抬举他了),用到了很多图形算法,新手可以参考。

     下载地址:http://files.cnblogs.com/Imageshop/PhotoSprite.rar

     (2)FilterExplorer: 一个小的VC写的图像处理代码,有一些比较好的滤镜代码。

     下载地址:http://files.cnblogs.com/Imageshop/FilterExplorer.rar

posted @ 2012-05-08 16:25 小果子 阅读(838) | 评论 (0)编辑 收藏
ndk
ffmpeg  => http://abitno.me/compile-ffmpeg-android-ndk
http://hi.baidu.com/lizhengjun2010/blog/item/08b7fb1b79dc9befe1fe0b09.html
posted @ 2012-05-05 15:02 小果子 阅读(188) | 评论 (0)编辑 收藏

最近研究php的单元测试功能,在centos下和widows下安装了phpunit

首先要保证你装的php中安装了pear

linux下输入命令pear 回车可看一下是否安装了

windows下可以用dos进入到php的安装目录 ,输入命令pear 回车可看一下是否安装了 

在默认情况下php中都会安装的

pear的安装

wwindows下用dos进入php的安装根目录  运行go-pear,r然后输入两次yes 然后 后边的选项直接用回车

然后我们要添加Channel

pear channel-discover pear.phpunit.de

pear channel-discover components.ez.no

pear channel-discover pear.symfony-project.com


我在这个地方遇到了 .lock 访问权限的错误而安装失败,这是我们可以在PEAR文件夹下删除此文件

接下来执行pear install phpunit/PHPUnit,此时我遇到了下图所示的问题,包依赖

很简单 我们把这些包用pear install命令安装了 即可

可能执行完这个之后你的phpunit还是提示安装失败

它提示我们要更新pear包

pear upgrade-all 

按照提示操作,可能会提示你更新Channel,那么更新即可

此时在执行pear install phpunit/PHPUnit 可以看到提示安装成功了



我们会发现在PEAR目录下多了PHPUnit 这表明安装成功,另外在安装pear的时候回修改php.ini文件

;***** Added by go-pear

include_path=".;E:\webserver\php\pear"

;*****

小提示:直接输入pear可现实pear命令下的所有选项

phpunit 使用手册 http://www.phpunit.de/manual/3.5/en/index.html

posted @ 2012-05-04 11:39 小果子 阅读(371) | 评论 (0)编辑 收藏
Android WebView 当文本框获取焦点后自动放大,但这种自动放大不是我想要的。这并不是android的bug,而是他的正常处理

    这是我最近两个星期面临的一个比较棘手的Bug,目前国内外都没有大牛提供很好的解决方式。这里,我今天花了大半天时间来解决这个问题。

 

     之所以出现这种情况,主要是当文本框获取到焦点后,键盘自动弹出,会执行WebView的displaySoftKeyboard 方法,这个方法会把缩小的网页恢复到正常情况(也就是说缩小的网页放大),但是我目前的项目都是不允许页面缩放的,所以一旦页面放大后就无法恢复。 这里感谢国外的一个朋友的帖子回复

http://stackoverflow.com/questions/3702805/is-there-a-way-to-disable-the-zoom-feature-on-input-fields-in-webview/7214199#7214199 。

 

不多说,直接上代码,如果想知道原因,看我后续的blog。 <!--EndFragment-->

<!--EndFragment-->

 

解决原理:

通过反射,拿到WebView的一个私有属性mDefaultScale,并在WebView失去焦点的时候,修改它的值,已达到网页不放大的效果。

 

     view.setInitialScale(???); //???代表随便多少,小于一百才会有我说的这个bug。

 

 

<!--EndF-->

   解决方案如下:

Java代码  收藏代码
  1. videoNavigation_WV.setOnFocusChangeListener(new View.OnFocusChangeListener() {  
  2.     @Override  
  3.     public void onFocusChange(View v, boolean hasFocus) {  
  4.         if(hasFocus)  
  5.         {  
  6.             try {  
  7.                 Field defaultScale = WebView.class.getDeclaredField("mDefaultScale");  
  8.                 defaultScale.setAccessible(true);  
  9.                 //WebViewSettingUtil.getInitScaleValue(VideoNavigationActivity.this, false )/100.0f 是我的程序的一个方法,可以用float 的scale替代  
  10.                 defaultScale.setFloat(videoNavigation_WV , WebViewSettingUtil.getInitScaleValue(VideoNavigationActivity.this, false )/100.0f);  
  11.             } catch (SecurityException e) {  
  12.                 e.printStackTrace();  
  13.             } catch (IllegalArgumentException e) {  
  14.                 e.printStackTrace();  
  15.             } catch (IllegalAccessException e) {  
  16.                 e.printStackTrace();  
  17.             } catch (NoSuchFieldException e) {  
  18.                 e.printStackTrace();  
  19.             }   
  20.         }  
  21.     }  
  22. });  
  <!--EndFragmen-->

    大家如果想利用我这段代码,我这里面的defaultScale.setFloat(WebView,float), 这个float值是你初始化的时候的scale值。跟你的CSS body值有一定的关系。假如body值 是1920*1080 而你现在是显示在1280*720的屏幕上,那么这个scale 的float值就是0.666667。就是你的现在的缩放页面与正常情况先显示的大小的比(缩放比),大家可以用页面第一次加载的时候通过 getScale()值获取。

   

    代码还有很多需要优化的地方,比如反射拿属性,其实只要做一次,设置可以做多次,这里只是一个Demo,觉得代码垃圾的话我发个改好的工程给你。

 

   有木有做android TV 的 ,加群87154410,欢迎欢迎。 博客刚开始写,希望大家支持。

写都比较简略,大家可以提建议,欢迎留言

posted @ 2012-04-20 21:34 小果子 阅读(4519) | 评论 (0)编辑 收藏
一、概述 1
二、Android(Java)中常见的容易引起内存泄漏的不良代码 1
(一) 查询数据库没有关闭游标 2
(二) 构造Adapter时,没有使用缓存的 convertView 3
(三) Bitmap对象不在使用时调用recycle()释放内存 4
(四) 释放对象的引用 4
(五) 其他 5
三、内存监测工具 DDMS --> Heap 5
四、内存分析工具 MAT(Memory Analyzer Tool) 7
(一) 生成.hprof文件 7
(二) 使用MAT导入.hprof文件 8
(三) 使用MAT的视图工具分析内存 8
一、概述
  Java编程中经常容易被忽视,但本身又十分重要的一个问题就是内存使用的问题。Android应用主要使用Java语言编写,因此这个问题也同样会 在Android开发中出现。本文不对Java编程问题做探讨,而是对于在Android中,特别是应用开发中的此类问题进行整理。
  由于作者接触Android时间并不是很长,因此如有叙述不当之处,欢迎指正。
二、Android(Java)中常见的容易引起内存泄漏的不良代码
  Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的。如果我们编写 的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机。为了能够使得Android应用程序安全且快速的运 行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在 属于自己的进程中运行的。一方面,如果程序在运行过程中出现了内存泄漏的问题,仅仅会使得自己的进程被kill掉,而不会影响其他进程(如果是 system_process等系统进程出问题的话,则会引起系统重启)。另一方面Android为不同类型的进程分配了不同的内存使用上限,如果应用进 程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉。Android为应用进程分配的内存上限如下所示:
位置: /ANDROID_SOURCE/system/core/rootdir/init.rc 部分脚本
# Define the oom_adj values for the classes of processes that can be
# killed by the kernel. These are used in ActivityManagerService.
  setprop ro.FOREGROUND_APP_ADJ 0
  setprop ro.VISIBLE_APP_ADJ 1
  setprop ro.SECONDARY_SERVER_ADJ 2
  setprop ro.BACKUP_APP_ADJ 2
  setprop ro.HOME_APP_ADJ 4
  setprop ro.HIDDEN_APP_MIN_ADJ 7
  setprop ro.CONTENT_PROVIDER_ADJ 14
  setprop ro.EMPTY_APP_ADJ 15
# Define the memory thresholds at which the above process classes will
# be killed. These numbers are in pages (4k).
  setprop ro.FOREGROUND_APP_MEM 1536
  setprop ro.VISIBLE_APP_MEM 2048
  setprop ro.SECONDARY_SERVER_MEM 4096
  setprop ro.BACKUP_APP_MEM 4096
  setprop ro.HOME_APP_MEM 4096
  setprop ro.HIDDEN_APP_MEM 5120
  setprop ro.CONTENT_PROVIDER_MEM 5632
  setprop ro.EMPTY_APP_MEM 6144
# Write value must be consistent with the above properties.
# Note that the driver only supports 6 slots, so we have HOME_APP at the
# same memory level as services.
  write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15
  write /proc/sys/vm/overcommit_memory 1
  write /proc/sys/vm/min_free_order_shift 4
  write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144
  # Set init its forked children's oom_adj.
  write /proc/1/oom_adj -16
  正因为我们的应用程序能够使用的内存有限,所以在编写代码的时候需要特别注意内存使用问题。如下是一些常见的内存使用不当的情况。
(一) 查询数据库没有关闭游标
描述:
  程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
示例代码:
Cursor cursor = getContentResolver().query(uri ...);
if (cursor.moveToNext()) {
  ... ...  
}
修正示例代码:
Cursor cursor = null;
try {
  cursor = getContentResolver().query(uri ...);
  if (cursor != null && cursor.moveToNext()) {
  ... ...  
  }
} finally {
  if (cursor != null) {
  try {  
  cursor.close();
  } catch (Exception e) {
  //ignore this
  }
  }
}  
(二) 构造Adapter时,没有使用缓存的 convertView
描述:
  以构造ListView的BaseAdapter为例,在BaseAdapter中提高了方法:
public View getView(int position, View convertView, ViewGroup parent)
来向ListView提供每一个item所需要的view对象。初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的 view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。
  由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。ListView回收list item的view对象的过程可以查看:
android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。
示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
  View view = new Xxx(...);
  ... ...
  return view;
}
修正示例代码:
public View getView(int position, View convertView, ViewGroup parent) {
  View view = null;
  if (convertView != null) {
  view = convertView;
  populate(view, getItem(position));
  ...
  } else {
  view = new Xxx(...);
  ...
  }
  return view;
}  
(三) Bitmap对象不在使用时调用recycle()释放内存
描述:
  有时我们会手工的操作Bitmap对象,如果一个Bitmap对象比较占内存,当它不在被使用的时候,可以调用Bitmap.recycle()方法回收此对象的像素所占用的内存,但这不是必须的,视情况而定。可以看一下代码中的注释:
  /**
  * Free up the memory associated with this bitmap's pixels, and mark the
  * bitmap as "dead", meaning it will throw an exception if getPixels() or
  * setPixels() is called, and will draw nothing. This operation cannot be
  * reversed, so it should only be called if you are sure there are no
  * further uses for the bitmap. This is an advanced call, and normally need
  * not be called, since the normal GC process will free up this memory when
  * there are no more references to this bitmap.
  */
(四) 释放对象的引用
描述:
  这种情况描述起来比较麻烦,举两个例子进行说明。
示例A:
假设有如下操作
public class DemoActivity extends Activity {
  ... ...
  private Handler mHandler = ...
  private Object obj;
  public void operation() {
  obj = initObj();
  ...
  [Mark]
  mHandler.post(new Runnable() {
  public void run() {
  useObj(obj);
  }
  });
  }
}
  我们有一个成员变量 obj,在operation()中我们希望能够将处理obj实例的操作post到某个线程的MessageQueue中。在以上的代码中,即便是 mHandler所在的线程使用完了obj所引用的对象,但这个对象仍然不会被垃圾回收掉,因为DemoActivity.obj还保有这个对象的引用。 所以如果在DemoActivity中不再使用这个对象了,可以在[Mark]的位置释放对象的引用,而代码可以修改为:
... ...
public void operation() {
  obj = initObj();
  ...
  final Object o = obj;
  obj = null;
  mHandler.post(new Runnable() {
  public void run() {
  useObj(o);
  }
  }
}
... ...
示例B:
  假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个 PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。对于LockScreen对象,当需要显示锁屏界 面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。
  但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener对象,则会导致LockScreen无法 被垃圾回收。如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得 system_process进程挂掉。
  总之当一个生命周期较短的对象A,被一个生命周期较长的对象B保有其引用的情况下,在A的生命周期结束时,要在B中清除掉对A的引用。
(五) 其他
  Android应用程序中最典型的需要注意释放资源的情况是在Activity的生命周期中,在onPause()、onStop()、 onDestroy()方法中需要适当的释放资源的情况。由于此情况很基础,在此不详细说明,具体可以查看官方文档对Activity生命周期的介绍,以 明确何时应该释放哪些资源。
三、内存监测工具 DDMS --> Heap
  无论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方。Android tools中的DDMS就带有一个很不错的内存监测工具Heap(这里我使用eclipse的ADT插件,并以真机为例,在模拟器中的情况类似)。用 Heap监测应用进程使用内存情况的步骤如下:
1. 启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的;
2. 将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”模式,而不是作为“Mass Storage”;
3. 链接成功后,在DDMS的Devices视图中将会显示手机设备的序列号,以及设备中正在运行的部分进程信息;
4. 点击选中想要监测的进程,比如system_process进程;
5. 点击选中Devices视图界面中最上方一排图标中的“Update Heap”图标;
6. 点击Heap视图中的“Cause GC”按钮;
7. 此时在Heap视图中就会看到当前选中的进程的内存使用量的详细情况。
说明:
a) 点击“Cause GC”按钮相当于向虚拟机请求了一次gc操作;
b) 当内存使用信息第一次显示以后,无须再不断的点击“Cause GC”,Heap视图界面会定时刷新,在对应用的不断的操作过程中就可以看到内存使用的变化;
c) 内存使用信息的各项参数根据名称即可知道其意思,在此不再赘述。
  如何才能知道我们的程序是否有内存泄漏的可能性呢。这里需要注意一个值:Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类类型的对象。在data object一行中有一列是“Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏。可以这样判断:
a) 不断的操作当前应用,同时注意观察data object的Total Size值;
b) 正常情况下Total Size值都会稳定在一个有限的范围内,也就是说由于程序中的的代码良好,没有造成对象不被垃圾回收的情况,所以说虽然我们不断的操作会不断的生成很多对 象,而在虚拟机不断的进行GC的过程中,这些对象都被回收了,内存占用量会会落到一个稳定的水平;
c) 反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会越来越大,
  直到到达一个上限后导致进程被kill掉。
d) 此处已system_process进程为例,在我的测试环境中system_process进程所占用的内存的data object的Total Size正常情况下会稳定在2.2~2.8之间,而当其值超过3.55后进程就会被kill。
  
  总之,使用DDMS的Heap视图工具可以很方便的确认我们的程序是否存在内存泄漏的可能性。

四、内存分析工具 MAT(Memory Analyzer Tool)
  如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那 肯定会把人逼疯,特别是在维护别人写的代码的时候。这里介绍一个极好的内存分析工具 -- Memory Analyzer Tool(MAT)。
  MAT是一个Eclipse插件,同时也有单独的RCP客户端。官方下载地址、MAT介绍和详细的使用教程请参见:www.eclipse.org/mat,在此不进行说明了。另外在MAT安装后的帮助文档里也有完备的使用教程。在此仅举例说明其使用方法。我自己使用的是MAT的eclipse插件,使用插件要比RCP稍微方便一些。
  使用MAT进行内存分析需要几个步骤,包括:生成.hprof文件、打开MAT并导入.hprof文件、使用MAT的视图工具分析内存。以下详细介绍。
(一) 生成.hprof文件
  生成.hprof文件的方法有很多,而且Android的不同版本中生成.hprof的方式也稍有差别,我使用的版本的是2.1,各个版本中生成.prof文件的方法请参考:
http://android.git.kernel.org/?p=platform/dalvik.git;a=blob_plain;f=docs/heap-profiling.html;hb=HEAD。
1. 打开eclipse并切换到DDMS透视图,同时确认Devices、Heap和logcat视图已经打开了;
2. 将手机设备链接到电脑,并确保使用“USB 调试”模式链接,而不是“Mass Storage“模式;
3. 链接成功后在Devices视图中就会看到设备的序列号,和设备中正在运行的部分进程;
4. 点击选中想要分析的应用的进程,在Devices视图上方的一行图标按钮中,同时选中“Update Heap”和“Dump HPROF file”两个按钮;
5. 这是DDMS工具将会自动生成当前选中进程的.hprof文件,并将其进行转换后存放在sdcard当中,如果你已经安装了MAT插件,那么此时MAT将会自动被启用,并开始对.hprof文件进行分析;
  注意:第4步和第5步能够正常使用前提是我们需要有sdcard,并且当前进程有向sdcard中写入的权限(WRITE_EXTERNAL_STORAGE),否则.hprof文件不会被生成,在logcat中会显示诸如
  ERROR/dalvikvm(8574): hprof: can't open /sdcard/com.xxx.hprof-hptemp: Permission denied.  
  的信息。
   
  如果我们没有sdcard,或者当前进程没有向sdcard写入的权限(如system_process),那我们可以这样做:
6. 在当前程序中,例如framework中某些代码中,可以使用android.os.Debug中的:
  public static void dumpHprofData(String fileName) throws IOException
  方法,手动的指定.hprof文件的生成位置。例如:
  xxxButton.setOnClickListener(new View.OnClickListener() {
  public void onClick(View view) {
  android.os.Debug.dumpHprofData("/data/temp/myapp.hprof");
  ... ...
  }
  }
  上述代码意图是希望在xxxButton被点击的时候开始抓取内存使用信息,并保存在我们指定的位置:/data/temp /myapp.hprof,这样就没有权限的限制了,而且也无须用sdcard。但要保证/data/temp目录是存在的。这个路径可以自己定义,当然 也可以写成sdcard当中的某个路径。

(二) 使用MAT导入.hprof文件
1. 如果是eclipse自动生成的.hprof文件,可以使用MAT插件直接打开(可能是比较新的ADT才支持);
2. 如果eclipse自动生成的.hprof文件不能被MAT直接打开,或者是使用android.os.Debug.dumpHprofData()方法手动生成的.hprof文件,则需要将.hprof文件进行转换,转换的方法:
  例如我将.hprof文件拷贝到PC上的/ANDROID_SDK/tools目录下,并输入命令hprof-conv xxx.hprof yyy.hprof,其中xxx.hprof为原始文件,yyy.hprof为转换过后的文件。转换过后的文件自动放在/ANDROID_SDK /tools目录下。OK,到此为止,.hprof文件处理完毕,可以用来分析内存泄露情况了。
3. 在Eclipse中点击Windows->Open Perspective->Other->Memory Analyzer,或者打Memory Analyzer Tool的RCP。在MAT中点击File->Open File,浏览并导入刚刚转换而得到的.hprof文件。
(三) 使用MAT的视图工具分析内存
  导入.hprof文件以后,MAT会自动解析并生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package类点右键,在弹出菜单中选择List objects->With incoming references。这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots -> exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。
  MAT的界面如下图所示。


  
  具体的分析方法在此不做说明了,因为在MAT的官方网站和客户端的帮助文档中有十分详尽的介绍。
  了解MAT中各个视图的作用很重要,例如www.eclipse.org/mat/about/screenshots.php中介绍的。
   
  总之使用MAT分析内存查找内存泄漏的根本思路,就是找到哪个类的对象的引用没有被释放,找到没有被释放的原因,也就可以很容易定位代码中的哪些片段的逻辑有问题了。
posted @ 2012-04-19 10:26 小果子 阅读(1317) | 评论 (0)编辑 收藏
仅列出标题
共58页: First 13 14 15 16 17 18 19 20 21 Last