前端时间为了科学上网买了个vps,准备用aaapei这个主域名收回来,用在vps跑一些试验性服务,blog切到二级子域名 blog.aaapei.com

最近一两个月会将aaapei.com的80端口重定向到blog子域名,顺便扯一句,godaddy的重定向服务在国内被禁,所以在vps上又跑了个tornado实例,专门做重定向;google analytics上看月pv也就几百,我一定是想多了 :<


查看全文
Posted by zhengwen

“愤怒的小鸟”中,lua脚本是运行时部署在应用的data目录,同时做了脚本加密;
但是如果你的lua脚本有了模块包,脚本就会有多级目录,而android的data目录下是不允许有子目录;
当然,lua脚本也可以在运行时拷贝到外置sd卡中,不过既然放置在不安全的公共目录,就会有被第三方删除或篡改的危险,那么每次启动的时候必须做一次文件校验,同时,也必须对脚本进行加密,避免程序逻辑暴露;

lua自定义加载器

lua引擎提供了一个自定义加载器,当lua脚本中调用require时,会回调到自定义加载器的CFunction;利用这样特性,可以尝试取消掉脚本的运行时拷贝,而直接从应用的asset资源目录加载;自定义加载器的原理中,云风的blog中有介绍,以自定义方式加载lua模块
直接贴个代码实现

void addAssetLuaLoader(lua_State *L, lua_CFunction func)
{
   if (!func) return;

   lua_getglobal(L, "package");                   
   lua_getfield(L, -1, "loaders");   
   lua_pushcfunction(L, func);  
   int i=0;
   for ( i …

查看全文
Posted by zhengwen

前段时间在android环境中使用lua,采用的luabridge是luajava,遇到一个内存泄露问题,查了很久,终于定位了;

场景是这样的:
1:在lua中创建了一个java对象,将jobject指针传递给java;对应在luajava中,即传递了一个luaobject给java;java保存了这个对象;
2:在Lua中需要对这个java对象设置一个事件回调,比如说为某个控件setOnClickListener;
其中设置的代码是这样的:

local viewclick_cb={}
function viewclick_cb.onClick(v)
    self:cb(v)  
end
local listenerProxy  = luajava.createProxy('android.view.View$OnClickListener',viewclick_cb)       
javaobjhandler:setOnClickListener(ListenerProxy)   

lua和java交互时,对象生命周期管理分两种情况:

1:java对象传递个lua虚拟机,lua虚拟机为java对象创建一个userdata,在globalref中增加一个引用,标记这个java对象正在被使用;同时,为这个userdata设置一个__gc元方法,当lua对象需要被释放时,_gc元方法回调,释放掉java对象的globaref …


查看全文
Posted by zhengwen

大部分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