大部分android开发者只知道bitmap再使用之后,需要显式的调用一次bitmap.recycle,回收bitmap内存;

这个观点,在android3.0之后其实已经过时了,android3.0将bitmap所引用的位图资源从native heap移到虚拟机的heap空间,bitmap的生命周期由虚拟机管理,开发者只需要保证在应用中不在持有对bitmap的引用,即可保证不发生内存泄漏;位图资源的内存由GC进行回收;
将bitmap的位图内存转移到虚拟机heap后,由于位图资源本身较大,造成gc的概率的增加

bitmap proxy

在一般的应用场景中,bitmap的引用一般是和imageview关联;当大量imageview持有对bitmap的引用时,虚拟机无法释放bitmap的内存,导致oom;

针对这种场景,开发者可以实现一个bitmap的代理类,作为bitmap和imageview的中间层,在imageview不可见时(例如imageview是一个listview的子控件,listview发生滚动/activiy切换到后台),即释放掉对bitamp的引用;当imageview重新可见时,通过代理类重新去加载bitmap,以解耦bitmap和iamgeview的引用关系;

inBitmap

android在3.0之后新增了一个BitmapFactory.Options.inBitmap开关,加了这个开关之后,bitmapfactory在加载位图时候,会尝试使用inbitmap指向的已分配在heap中位图空间;而不是重新申请一块内存;从而减少了虚拟机最讨厌的短生命周期大内存对象; 不过这个开关有严格的使用场景,即两个bitamp的位图大小必须一致


查看全文
Posted by zhengwen

微信公共平台开放了几个操作webview界面的js接口
示例代码是这样的:

WeixinJSBridge.invoke('getNetworkType',{},
    function(e){
        WeixinJSBridge.log(e.err_msg);
    });

android的webview api中有开放过一个addJavaScriptInterface函数,这个函数的作用是在页面的Window中注入一个JS对象
如果你的应用中使用了这个api,建议先看一下国内安全领域第一人黑哥的这篇文章android webview 漏洞背后的节操,

没耐心的同学直接看结尾的解决方案吧:

第1个方案是设置信任域,这个问题其实是不太靠谱的,在我之前在kcon里演讲《去年跨过的浏览器》里有很多信任域带来的安全问题
第2个方案是使用 shouldOverrideUrlLoading 的方式,据说这个方案还是比较靠谱的,只是可能代价比较大
第3个方案就是教育那些开发商,没有必要用webview的时候就不要用,不要java与js交互就不要用

不过,按黑哥这篇文章的想法,这个漏洞危险等级很低,可以无视之
暂时把安全问题放一边,Js对象的注入,对函数的参数类型有严格要求,它只能传递基本数据类型以及JSON
但微信的JsApi中,参数三是一个函数对象,那他是如果做到的呢

逆向

Android原生的机制既然不能支持函数对象的传递,于是猜测微信是否会对原始的api做了一层包装;
先下载weixin …


查看全文
Posted by zhengwen

最近在做一个lua的android项目,对于lua的生态环境完全陌生,所以选用了个文档资料最全的lua bridge:luajava
luajava目前只支持到lua5.1,不过升级到5.2困难不大,主要是一些宏开关以及静态变量;然而实际运行的时候发现卡的很不行,ui频繁掉祯,profile后发现90%+的cpu耗时在luajava中

看了一下luajava本身代码量不大;索性就追了一下,luajava的native层就一个luajava.c,java层,除了LuaJavaApi.java,其他java类都是Value Object

lua逻辑分析

先看lua创建java object的代码,luajava.c中

int javaNewInstance( lua_State * L )
{     
    //some code …..
    method  = ( *javaEnv )->GetStaticMethodID( javaEnv , luajava_api_class , "javaNewInstance" ,"(ILjava/lang/String;)I" );
     //先调用java层创建javaobject
    javaClassName = ( *javaEnv )->NewStringUTF( javaEnv , className …

查看全文
Posted by zhengwen