昨天收到个Bug,是关于Google输入法调用后报异常,Log信息大概是说找不到JNI方法nativeImOpenDecoder(),
后发现在编译此版本系统前的TARGET_BUILD_VARIANT选项是user,和平时用的eng有所不同,重新烧了eng和user版本验证下确实有此问题,刚开始想都没想直接就去看Make脚本了,因为一定有所不同,看了半小时后头昏眼花,最主要是没看太明白,放弃。。。
后拿来user版和eng版的GooglePinyin.apk比较了下,发现user版的大小少了100多byte,原来缺少代码,网上一顿
搜罗反编译工具,最后确定在PinyinDecoderService.java类里缺少nativeImOpenDecoder()方法,此方法是native方法,所以在加载.so文件时没有找到该方法报出异常,又在项目中查找下引用,才知道整个项目任何并没有调用过此方法,到此可以判断出在编译的时候系统做了优化,把无用的代码做了过滤。好,那我就在编译时强制保留此方法,了解到Android系统编译是用ProGuard来进行代码优化和混淆工作的,OK,参照别的Android.mk文件加了参数:
LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags
又创建了proguard.flags文件,内容如下:
-keep class com.android.inputmethod.pinyin.PinyinDecoderService {
static *;
}
最后重新编译并测试,可成功调用Google输入法。
总结下,在编译代码过程中ProGuard起了关键作用,所以了解还是非常必要的,特转以下文章地址来学习下:
http://www.cnitblog.com/zouzheng/archive/2011/01/12/72639.html