懒癌晚期,一年多没更新blog,近一两月项目以外做了两件事情:

  • 在听云和infoq的apmcon大会做了个android 编译器hook的分享,ppt地址在网易APM hook方案探索,介绍了我们在编译期做bytecode植入的一些实践工作,有兴趣的同学可以和我私信交流;

  • 和杭研的同事们一起做了在线的Android课程,讲师基本囊括了网易杭研院各部门的大牛,课程针对在校生和1年以下工作经验的新同学。想了解我们工作方式的同学可以看看,通过下面这个链接购买成功的朋友,也可以私信我下,我再返个微信红包给你 :)

android网易云课堂微专业:android

ios网易云课堂微专业:ios


查看全文
Posted by zhengwen

前言

最近airbnb开源了DeepLinkDispatch项目,DeepLinkDispatch是一个基于注解的链接跳转库,简单了解完其实现后,想起了Facebook今年5月公布的另一个项目AppLink,于是有了这篇文章。

AppLink

与其说AppLink是一个框架,更不如说他是一个规范。当app内嵌WebView遇到自定义的Schema时,app只能简单的将url转交给系统,或直接显示页面无法加载。AppLink规范旨在解决各个平台的app跳转的问题。第三方网页或者app接入applink后,跳转方可以根据AppLink规范进行精确的目标跳转以及数据传输。 引用官方文档中的例子,example.hmtl:

<html>
<head>
    <meta property="al:ios:url" content="applinks://docs" />
    <meta property="al:ios:app_store_id" content="12345" />
    <meta property="al:ios:app_name" content="App Links" />
    <meta …

查看全文
Posted by zhengwen

在android开发中,有两条很重要的编程准则

  • 不要堵塞ui线程
  • 不要在非ui线程操作ui控件

开发者必须这两个遵守单线程模型的准则,将耗时的逻辑转移到非ui线程进行,得出计算结果后,通知ui线程进行数据的展现。本文介绍一下android的异步编程。

android线程模型

同hotspot vm一样,在daivlk vm中,采取的是1:1线程模型,每一个android thread对应一个Native Linux thread;linux内核通过cfs(completely fair scheduler)来进行线程调度,在cfs中着影响一个线程时间分配的因素有两个:

  • thread priority
  • thread group

thread group

线程的thread group是动态改变的,在android framework层面,android的应用有5个等级,分别是

  • foreground process
  • visible process
  • service process
  • backgroud process
  • empty process

它们的thread …


查看全文
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