转载,原博地址:http://blog.csdn.net/klpchan/article/details/11843295
==================================================================================================================================
项目源码已整理上传,欢迎下载。
Launcher2 http://download.csdn.net/detail/klpchan/6796511
Gallery2 http://download.csdn.net/detail/klpchan/6796541
库中所需jar包 http://download.csdn.net/detail/klpchan/6796469
Google在7月25发布了Android4.3源码——最后一个版本的JB,开发者很多时候需要研究源码,每次都在Linux环境下编译难免有些烦躁,尤其对于上层应用开发者,4.3里的app有不少经典案例,能够把他们移到Eclipse下进行编译调试,效率会高很多,下面以Launcher和Gallery2源码为例,一简一繁,简要总结下“移植”思路,供参考~
需完成准备工作:
a ) 已成功下载全编Android4.3_r1源码,out目录约大小12G。
b ) 使用4.3 的SDK、API18的平台版本,可通过http://developer.android.com/sdk/index.html下载。如Eclipse升级无障碍,可自行升级平台。
c ) JDK版本1.6及以上,升级平台后环境变量需正确设置。
准备工作完成后,就可以开始“移植”工作了,因为本文使用源码是4.3,所以SDK版本也需同步,较4.2及以前框架层对于不少管理器做了小幅修改,如果你准备编译的是其它版本的应用程序,选择对应的的SDK版本即可。
=====Launcer2 (android-4.3_r1\packages\apps)======
把大象塞冰箱里,一共分几步?
三步:
1)打开冰箱门
2)把大象塞进去
3)把冰箱门关上
问:移植Launcher2需要几步?也是三步
1)开门 :把应用文件夹Copy出来放到特定位置,使用Eclipse导入已存在项目,选择Launcher2后,确定。
2)塞进去 :
有编译错误,还好不多,在Launcher.java文件中找不到Search类
Launcher2应用和Eclipse水土不服,主要原因是在Linux下编译会用到框架层提供的一些静态库,这些静态库被封装起来,并没有暴露给我们当做SDK来使用,Search就是一例,源码位置在frameworks\ex\common\java\com\android\common中,编译后在哪呢?Android为了让编译器知道该模块在编译时需要哪些链接库,在每个模块根目录下都写了一个Android.mk文件,在该文件中能够找到答案
Launcher2在Linux下编译时需要使用android-common和android-support-v13两个静态库,这两个静态库在全编时已经被输出\out\target\common\obj\JAVA_LIBRARIES中,我们只需要到这个目录下把jar包取出,作为系统库的jar包放到Eclipse的buildpath中去即可排除此类问题。
把JAVA_LIBRARIES下的android-common_intermediates和android-support-v13_intermediates目录下的jarlib.jar取出,分别改名为common_intermediate.jar和support_v13_intermediates.jar,然后新建一个System lib,取名为Launcher_Jars,把这两个jar包添加进来,clean,build通过。
3)关门 :
项目视图及在电信S3上的运行效果如下图, 提示:Launcher2比较特殊,安装apk后需要点击Home按键,选择启动器才行。
====Gallery2 (android-4.3_r1\packages\apps)======
前面小试牛刀,难度较小,导入源码后编译错误较少,达不到练兵的目的,于是本人不自觉的把Gallery2的源码Copy了出来,据听过谷歌自4.1后开始将Gallery和Camera及图片处理源码打包,涉及到静态库和图像效果处理,木有关系,试试嘛~
项目导入时,tests和test_camera都是测试程序,暂时不需要,直接选择项目源码即可。
导入源码编译后,基本是红成一片,是可忍孰不可忍,但有个原则,当你看到零星的编译错误时,可以尝试逐个修改,红成一片的情况就不要一个一个查了,需要策略性的行为。按照上文思路找到Android,mk中定义的的静态库,如下:
按照Launcher2中的相关步骤,用这些jar包建立Eclipse系统库并导入,完成后的项目部分视图如下,
重新clean编译后,会发现红成一片的效果有了明显的改善,也就是说由于静态库缺失导致的一类问题已经解决,编译错误一般都是分类出现,红成一片时需要的解决一类问题而不是一个,我们按照顺序查看当前的第一个错误,出现在CameraActivity.java中
类LightCycleHelper无法解析,我们已经完成了对引用库的导入,为啥还找不到?莫非这个类不在框架层?需要找到该类的位置及其编译后的jar包,比较尴尬的是,你会发现这个类就定义在源码中,src_pd/com/android/gallery3d/util下,src_pd和gallerycommon两个文件夹中的源码在Linux环境下是参与编译的,我们移植到Eclipse上时默认只是编译了src文件下的,完全忽略了android.mk文件里对LOCAL_SRC_FILES常量的定义。
把另外两个源码文件夹也添加进来:
重新编译后,gallerycommon文件夹有个包名错误的问题,因为Linux编译条件比较灵活,Eclipse下会把源码根目录当做包名起始地址,我们只需要手动更改文件路径即可,把gallerycommon中的src文件夹下的com目录剪切到gallerycommon文件夹中,删除src文件夹重新编译即可。
进行到这,整个项目只剩下两个编译错误了,ImageFilterRS和ImageFilterSharpen,主要原因是两个类文件的缺失,ScriptC_convolve3X3和Script_grey脚本文件,这两个类是图像处理相关的,因为使用到grew和convolve3X3两个解释文件,ScriptC_convolve3X3文件很诡异的编译到gen目录下,把他拷贝过来,删除gen目录下的对应包,因为源代码里使用的是R.raw.grey和R.raw.convolve3X3,为了保证编译通过,把convolve3x3.rs和grey.rs重命名成convolve3x3和grey放置到res目录下的raw目录中,确实的脚步文件可以从http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/4.3_r2.1/com/android/gallery3d/filtershow/filters/ScriptC_grey.java?av=f下载后获得,整理后即可编译成功。这里推荐下grepcode网站,这个在进行此类app移植编译时相当实用,可以搜寻类位置及相应的源码文件,如果想研究Android源码文件及社区开发者为此所做的修改及版本控制,可以参考Android项目在github上的镜像https://github.com/android。
项目试图及在S3上的运行效果如下
有些童鞋可能发现了,framework_intermediate.jar和layoutlib.jar怎么也在,好吧,这个纯属个人习惯,这两个jar包都是针对可能会使用非官方开放接口所提供的补充,针对于可能出现的类缺失编译问题,使用这两个包是通用行为,并不仅仅针对Gallery2。
小结
本文一简一繁,简要介绍了把4.3源码app应用Launcher2和Gallery2”移植“到Eclipse上的思路和方法。针对编译错误,划分成多种类型,结合Linux下编译特点及MK文件提示,修改大类及个别文件的错误。确定源码位置比较重要,结合grepcode及github分析编译错误疑点,必要时可直接下载替换或注释。 目前所做的“移植”仅仅是完成了Eclipse下的编译及基本功能运行,4.3的app建议跑在4.3的设备上,我们并没有把系统中所有与Gallery2相关的其它模块移植进来,也就是说,移植后的应用bug比较常见,机型不同、平台不同,FC时常发生,请忽略或者自行解决~
~版权所有~转载请声明~