绕过GPL..

帮某家公司想的啦,我觉得这方法应该没有法律上的问题

有个核心算法库,没有依赖任何开源的东西,做成.so
外围,尤其是ui相关,用到了大量gpl代码,但是自己修改到的,也全部开源了,因为只要不涉及到核心算法的,也不是太在意啦
如果一般直接把.so带进去发布肯定是有问题的吧?

我想的是,我实现一个和这个.so一模一样接口的另一个dummy library,实际上用这个so就完全不能达到预期目的,但也不会运行出错,只是意义不大而已。这样整体开源发布就没有破坏gpl
然后,提供个小程序让用户下载实际可用的so文件替换掉那个假的so文件。
这样会有什么问题么?大家有什么想法?

周记

工作上面比以前忙了些,由新来的以色列大妈管着了,反正事情就是多些了。

看联通号一直闲置浪费,也开始用了,换到了主力手机上。发现n900不支持动感地带的号码(或者只是不支持134这些新号段的),只好又用起了680。
装了下qt 4.7 的技术预览版,还有新的qt creator。我以前基本上没有接触过qt,也算试试看啦。qt安装需要自己编译,真是漫长。。
qt的几个demo都不错,尤其mobile-demo,我觉得效果很好,在mac上看起来效果也不错。

昨天才发现,n900上的qt程序里不支持用mscim输入。看了下changelog,mscim上次更新都是一个多月前了。这两天有点点小改动,主要是原来版本卸载后系统输入法好像还是不能用,修正了一下。还有几个码表名字改得好看了一点儿。我有想是不是把scim-qtimm的qt支持模块也移植上来,可是看起来可能也不是很容易的活。倒是him-scim这个项目人家做得好像也还可以,不知道是不是也把mscim换用him的前端呢。可是明明him前端也是gtk immodule而已,为什么它就支持在qt中的输入?我是有担心接下来换meego上,这些工作都白费啦。

最近半年多在跟的小说只有《凡人修仙传》了,之前跟的两本都完结了。

好像也没什么了?。。。 我决定每周至少更新一篇blog,不然每周都是自动twitter合集的文了。。。

更新下飞信协议的研究

我很早很早前就抓包研究过下飞信协议,那时还比较简单,除了访问导航服务器获得通信服务器ip外,之后只用和通信服务器联系就可以了。最近在做adium的飞信插件,原来用libfetion.cn的库的,那个全包装完了,就不用自己操心了,现在我改用fetion for pidgin的开源版的库,就可以自己做些补充改进了。其实它工作得还挺好的,只是小细节问题也不断,所以我打算重新研究下飞信协议。

升级到最新的飞信官方版,3.5.2540,然后把抓包工具升级了一下。嗯,这里推荐一下这个叫科来网络分析系统的软件,是个国产工具,个人抓包用它的免费技术交流版就可以了。我感觉很好用,哈,可能只是因为全中文界面? read more

Android用NDK和整套源码下编译JNI的不同

前些天要写个jni程序,因为才几行代码,想着用ndk开发可能容易些,就先研究了下。不过最终我的代码虽然只有几行,但需要libdl,因为用到了dlopen一类的函数,只能又换到用android源码体系下编译。
不过两个都用了下,就发现了些不同。我其实并不能确定这些是不是实际存在的差异的,我只是拿ndk的sample和我见到的android源码里的jni代码做的比较
1. ndk支持的库很少,所以用以前最好先看看自己需要的功能是不是已经包括了,省得白忙活。不过人家是有解释的,说ndk里有的库才是稳定的,其它的建议你不要用。嗯,google总是这一套说辞,不公开的api也是。至于要看android源码中多了哪些库,make modules后grep一下lib开头的应该就是了,不过也不是所有都能用啦。
2. 注册函数的方法是不同的。举例说,我在com/evan129/jnitest/jniutils.java有个native int foo()方法,需要在jni中实现
在ndk中,你只要实现这个函数,然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说,如果你的jni只要实现这个函数,并且功能也很简单的话,那么你的jni c/cpp文件里只需要这一个函数就完事了。
但在android源码中编译jni代码是不同的,jni中的函数名无所谓。不过你至少还需要加一个
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法,这个方法你可以找个现有的复制一把就行,检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数,在这里把jni中的方法和java文件中的方法关联起来。
看起来像是ndk自动补上了这部分工作,我并不清楚原理啦。
3. 有个很诡异的区别,自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(…),而ndk中sample里的一处是(*env)->newstringutf(…) 这env和*env差很大吧。但两处函数传入的都是jnienv* env,我只能怀疑jnienv的定义是不是都是不同的。

末了,就是说下我这个很简单的jni折腾了我两天的一个问题。如前所说,我是用android源码来编译的,自己在packages/app/下建了pinyinjni工程,下面有个jni目录,每次直接用mmm packages/app/pinyinjni/jni来编译。jni目录下的android.mk中指定的名字是这样的local_module := libpinyin 每次编译都很顺利,生成了libpinyin.so。但是我在java文件里,system.loadlibrary(“libpinyin”)总是失败。感谢paranoia@newsmth帮我解决了这个问题,告诉我在loadlibrary时用”pinyin”。但是,这个事情实在太奇怪了,那文件名是libpinyin.so啊,而且我在这里用/data/data/…/libpinyin.so这种完整路径也会失败,我以前虽然没写过jni,但调用过,用完整路径指定jni so文件应该不会有问题的。或者,从另一个角度想,如果我local_module的名字不是用lib开头的,那它调用时应该用什么名字?这个”lib”前缀又是哪步删除的?我没有多做测试了,但是猜想ndk中应该是没有这种诡异的问题的。

Git-svn实在是有够慢

今天中午11点开始git svn checkout三个android源码副本,本地网络,网速超好,到下午五点,正好结束

objects数分别是135246, 95115, 108101。这还ok啦,毕竟svn 历史比较多。然后7pm前开始作svn源取下来后的一些操作,git gc, unpack一类的,到现在还有两个才压缩一半,最快的一个开始writing objects。不知道一个通宵搞不搞得完这些操作。

Howto change the startup animation of Android OS

the statup animation means the one you see before the launcher application comes out.
it was a line with a red point goes from left to right again and again before, in android 1.0. currently, on cupcake, it’s a text string, “android”, with shine goes from left to right.
i found someone add an advertisement logo to that animation in a customized rom. so i studied how to remove that, or make a new one by myself.

finally, i found it out. there are 2 pictures under frameworks/base/core/res/assets/images:
android-logo-mask.png
android-logo-shine.png

the 1st one is the background. then, you can edit it with picture editor, like add your own name on it.
well, after edited it, you need to build framework-res out, with command “make framework-res”. then, you will get a new framework-res.apk. but usually, you can not use this file to replace the one in the rom/firmware for real devices, like g1, g2. since, some resources are not under the same version.
what i do is pull out the original framework-res.apk from the rom. unzip both this framework-res.apk and the one i made by myself. replace the 2 pictures under assests/images with the one i made before. notice, you can not replace the files with the png files you edited, but not compiled.
then zip out framework-res.apk again, and sign with signapk tool. now you can use the new framework-res.apk to replace the original one.

糟糕的G1性能。。

今天工作需要,对g1上的数据操作做benchmark,真恐怖啊。删两千条短信要15分钟,zeze..
read more

试用git-svn

首先介绍下mac os x上用macports怎么安装git-svn,网上很多文章都说git在1.5.3版本后自带git-svn了,但我运行git svn提示是没有这个命令的。我的git是因为原来要下载android源码时,按google的说明,用sudo port install git-core安装的。
网上搜了半天,才知道结果,还有人自己编译的,依赖比较多,我觉得太麻烦了。简单来说,如果原来已经像上面说的已经装了git-core的话,需要先sudo port uninstall git-core。安装的话,是用sudo port install git-core +svn这个命令,就会在编译时带上+svn参数了

入门介绍的文章还是比较多的,比如 http://www.robinlu.com/blog/archives/194
在第一步git svn clone时确实比较花时间。看输出的log,似乎是首先取svn上最早的一个版本下来,然后不停的取下一个新版本的更新的部分。所以时间确实比较久,导出我们公司svn的trunk用了两个钟头才完。不过导出后,所有的svn log在本地都有记录了。目录并没有大多少。网上文章一般说在导出后需要做一次git gc。但是我目前用的这个版本git version 1.6.2.1,似乎已经会在git svn clone完后自动做一次git gc了。

刚刚开始使用,才第一次用它提交了个代码。再有心得时再补充吧

写了个Adium的飞信插件

下载页面请看这里 http://www.evan129.com/mywork/fetion-plugin-for-adium/

周末花了一天半写的。以前虽然看过点cocoa入门的文章,但从来没有试过,没有一个想做的东西,就不是很有热情投入去学习。因为我很早就研究过飞信的协议,曾经还做过一个java版的,所以本来想自己实现协议部分的。但完成了登录部分后,就发觉实在太麻烦了,一门不熟悉的语言,要处理字符串和线程一类的很让人头疼。于是就用了libfetion的库啦。这库用起来还是挺方便的,可惜出来都快一整年了,功能还是很少,比如没有读好友头像,传文件一类的。

打算接下来写篇关于adium插件开发的文章。嗯

Android中要小心的一种内存泄露

今天把android-developers blog上的一些文章看了下,有篇文章《avoiding memory leaks》虽然以前也扫了眼,今天再看了一遍,觉得好bt啊。

private static Drawable sBackground;
 
@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);
 
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
 
  if (sBackground == null) {
    sBackground = getDrawable(R.drawable.large_bitmap);
  }
  label.setBackgroundDrawable(sBackground);
 
  setContentView(label);
}

这段代码看得出会内存泄露么?按文中解释说,因为setbackgrounddrawable时,会在drawable中把label这个textview设为callback,就是说drawable中对label有引用,而label中对当前activity的context也有引用。所以当转屏时,系统自动重新建立ui时,原有的整个activity都不能被回收。

作为一个普通的java程序员,真的能想到这个么?文档里也没有提示过,没看到这篇文章,又没自己去看drawable的源代码的开发者,怎么能猜到这个。至少在我第一印象中,我是觉得drawable对象只是类似于image的一类对象。系统竟然在我不注意的时候自动设置了callback。唉,我得检查检查自己的代码中有没有这样的问题了。我不知道除了这个drawable外,还有没有其它类似的东西,真是防不胜防啊

03-15增: 不过我想了下,好像也有点不对啊
当第二次重设label.setbackgrounddrawable(sbackground);时,应该是把sbackground的
callback改回成当前的label啦。那这时gc不就应该能工作么