最近需要定制一个mtk手持设备的Launcher,Android版本是4.4.2,Launcher版本是Launcher 3. 事实上网上已经有不少关于如何将Android 4.0的Launcher 2源码导入eclipse运行的文章了。比如:
1. http://blog.csdn.net/chenshaoyang0011/article/details/7857634
2. http://blog.csdn.net/klpchan/article/details/11843295。
同时我又找到了一片关于eclipse如何导入Launcher 3的文章:
http://blog.csdn.net/deng0zhaotai/article/details/42045359
基本上依照这三篇博文,我成功的将Launcher 3导入了eclipse从而方便做修改定制,遂记录之
第一步:import工程,命名为Launcher3. 创建完工程后需要选择Android SDK版本,右键工程->Properties->Android选择SDK版本,这里我选择的是API 19.
第二步:经过第一步后工程中依然会有无数错误,这是因为首先该工程是从源码上拉下来的,工程源码中用了很多Android未开放的API。这时就需要编译Android源码,因为要用到一些编译生成的class.jar文件,这样才能使用这部分API。编译完成后在out/target/common/obj/JAVA_LIBRARIES找到一下几个文件(箭头表示重命名为):
1. android_support_v13/class.jar -----> android_support_v13.jar
2. framework_intermediates/class.jar ----->framework.jar
3. common_intermediates/class.jar ----->common.jar
4. core_intermediates/class.jar ----->core.jar
上面四个文件用于在工程代码中调用Android未开放的API。在工程的Java Build Path中新建个User Library,然后将这4个jar文件加入该新建的User Library中。需要注意的是这个Library不需要编译进工程,因此在Java Build Path的Order and Export标签卡中,只需要把该Library移动到最上面,不需要勾选前面的复选框。否则编译会出错。
普通的Launcher 3就用到这几个jar。而从本工程的Android.mk文件的下面发现,该工程应该还需要另外的MTK的库,
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13 LOCAL_STATIC_JAVA_LIBRARIES += com.mediatek.launcher3.ext LOCAL_JAVA_LIBRARIES += mediatek-framework
5. mediatek-framework_intermediates/class.jar ----->mtk_framework.jar
6. com.mediatek.launcher3.ext_intermediates/class.jar ----->mtk_launcher3_ext.jar
将以上几个jar配置好后,发现仍然有错误。经检查源码发现还需要下面这个两个jar包
7. mediatek-common_intermedias/class.jar ----->mtk_common.jar
8. com.google.protobuf.jar(这个jar包是从网上下载的)
以上4个jar包需要编译进工程,因为代码中依赖这些包的API不属于Android。如果需要编译进工程中,导入的方式和之前的内部jar包不同。需要在将以上4个jar包添加到工程的libs文件夹中(如果没有则在工程的根目录中新建之)。所有导入到libs文件夹中的jar包,ADT都会自动将其添加到Java Build Path的Android Private Libraries中,而且默认勾选其前面的复选框(代表需要编译进工程)。
经过上面两次导入jar包后,错误减少了很多。但是工程中仍然有错误。最终查到是缺少了一个类BackupProtos.java。该类应该在com.android.launcher3.backup包中。其中BackupProtos.java在网上可以轻易找到。解决这个问题有两种方法,一种是直接在工程中新建相应的包,同时将BackupProtos.java放入内。另外一种是用jar -cf命令将该文件打包成jar包,然后放入libs文件夹内。
导入所有依赖的jar包后,发现编译时还是有错,出错提示工程中有重复的dex文件。经排查发现mtk_launcher3_ext.jar包中有com/android/launcher3的目录,推测应该是该包和工程的包产生了冲突。因此,将源码中生成该jar包的文件拉下来,删除com/android/launcher3目录,重新制作jar包并替换掉libs中的原来jar包。
经过以上的步骤,发现还是有错。 发现是mtk_launcher3_ext.jar中的LauncherLog类调用的Logx类找不到。为了方便,我直接在工程中新建了一个LauncherLog类,并将所有对mtk包中LauncherLog的引用替换。这样Launcher3就移植成功了。
但是这样还是不能Android模拟器上运行。因为com.android.launcher3的包名和模拟器中的launcher3报名相同,无法安装。一种解决方法是将工程的包名重新命名,这种方法要改动太多的地方。另一种方法是将模拟器上的Launcher3卸载掉。这涉及到如何通过adb删除系统app。运行adb shell, 然后通过下面的命令将/system目录重新挂载为可读写:
su mount | grep system #得知哪个盘挂在到/system目录了,比如/dev/sda6 mount -o rw,remount /dev/sda6 /system
然后使用adb uninstall命令或者直接删除/system/app文件夹中对应的apk文件就可以卸载系统软件了。这样就可以在模拟器上运行我们导入的Launcher3工程了。