|
楼主 |
发表于 2012-5-14 10:38:00
|
显示全部楼层
以下是引用aquasnake在2012-4-4 22:53:00的发言:
。
这几天我跟我朋友研究了一下展讯的库,发现某些东西实际上是开源代码来的,不过展讯是做了二次开发,比如lzma.a,应该很容易就把它反向工程了.
展讯的代码,mikal在08年以前作6600D应该还不是mocor平台,那个时候是用codeworrior IDE,用mcp工程文件去组织整个编译控制的,那个时候的特征是编译非常快(直接mcp调用arm cc与link),Bin code的ROM空间很优化,动态消息窗口判断的机制,都是在RAM中执行,很少静态的结构体,代码比较容易阅读,上手比较快;缺点是MMI执行比较慢,比MTK那种静态结构体组织的MMI模块模块方式要慢的多,同样ARM7 78Mhz下效率不如MTK.
在08年以后,特别是到10年,展讯在ARM7平台上的代码进入了一个完善阶段,平台换成MOCOR,利用perl解析make文件控制编译的方式,已经非常接近MTK的开发方式了,优点是各模块编译控制灵活,缺点是编译速度变慢,perl语言解释执行还是不如ADS的IDE上.mcp工程设置.但用make file控制编译宏,用perl脚本控制编译参数与调用编译/开发工具是大趋势,随着工程代码的增加,项目的扩展,你必须用这种组织工程开发模式.当时展讯的代码非常好上手,MTK的软件工程湿去转展讯平台都很容易.
在11年以后,展讯6620代码释放后,软件版本质量又走下坡路了,倒不是因为BUG,而是整个工程代码的控制,由于展讯一直对库比较封锁,所以必须出很多套库来对应各种make模板,由于不开源,导致了版本内部错误的增加,每一个子模块make file的宏不同,所产生的库是不同的,由于这种问题带来的版本维护与二次开发中导致的冲突增多.但其实这种情况是可以避免的,出版本的人也许根本不了解一些API的调用与工程组织结构,如果定义一套完整的API接口,所有工程模板都可以调用,只不过小功能版是全功能版本的子集(如6610_3216<6610_6416<6620_3232<6620_6432<6620_128_32).这限制了平台上二次开发的门槛,因为库封装的原因,有时候你必须逆向工程恢复出原始代码并统一成尽可能少的库函数调用.
PS:我们现在已经把6620的09A_W11.16_P13版本改成了只有两套库(一套对应6610的16Mb RAM,一套对应6620的32Mb RAM)的lib结构,并且恢复了一些展讯原本disable掉的宏功能(我相信展讯是因为版本ROM/RAM size超标的原因而关闭)在小版本6610上开放出来(我们当然逆向工程了库,并且尽可能多地还原成sourcecode,并不会对编译后的代码以及系统有任何不良负作用,有且仅有功能的提升).有想技术切磋的我可以专门开一个专题探讨研究.
好多年不上来了,今天有点空,上来猫猫,本想找点人,鬼使神差就看到这里,又勾起了我对以前手机代码的回忆。哈哈!
针对编译原理,没有太深究过,不过有些自己的看法:
1、如今ARM 公司出品的cpu,所有IDE或者 makefile 方式采用的都是 ARM的编译工具如ARMCC,链接工具如,ARMlink,至于GCCforARM应该
在feather phone领域比较少吧?当然基于linux的可能会用到gcc,没有做过安卓,不了解,所以不确定;针对aquasnake提出的
原来采用IDE codewarrie 和如今采用 makefile,在编译这块,如果编译器相同,编译效率应该是一样的,但是针对link这段,IDE
codewarrie也支持强大的link脚本,所以只要link脚本一样,那么IDE出来的和makefile出来的文件在优化和执行时间是一样的。但是
区别在于编译的体现方式方面,灵活度方面,makefile 貌似会简洁,但是如果对makefile深入了解,会发现IDE和makefile是一样的。
IDE仅仅是封装了makefile,而我们现在的makefile是全裸的罢了。所以,有时候不要迷恋linux所谓的cmd的makefile一方独大:)
2、aquasnake 提到的逆向工程(我一直喜欢说盗版:)),针对编译过的lib,如果没有enable的宏,在lib中还可见,这个我真不知道
希望学习下,我一直以为宏是在CC阶段处理的,但是按照您的意思可能是在link阶段处理的。我现在很懒惰了,都不太喜欢查资料。
希望 aquasnake 来扫扫盲。
3、aquasnake 提到的整合lib,并实施了,这是一个进步,说明您公司在你的带来下,还是很有深度的研究。希望aquasnake 多多
培养这样的人才,不仅仅是为公司,也是为社会。 |
|