由于新版本Eclips中ADT插件的升级,Google为了兼容旧版本的Activity Action样式,特意导入了android-support-v7-appcompat.jar库。
更新ADT版本后,使用新版Eclips所建立的Android工程,默认会改为继承ActionBarActivity,而不是以前旧的Activity类。
这样导致的直接结果是:使用新版本Eclips所生成的源码放入Android源码中,使用mmm编译通常都会报错。
特意花了些时间研究了一下。下面针对大家常见的三种情况,分别给出解决办法:
1、准备从头开始编写新APK?
这种情况下最简单的解决办法是:新建apk的时候,将sdk最低版本选择为4.0以上,这样会默认生成继承Activity类的apk,使用该方法写出的apk,放入源码中就能和旧时一样,修改Android.mk后直接使用mmm去成功编译apk src了。
2、直接将Eclips中编译好的apk文件放入源码,计划使用mmm打sign?
如果别人虽然用了新的Eclips编写code,但提供的不是源码,而是pre-build apk文件,那么对这种apk的源码编译操作方法也同旧时一样处理即可(mmm搭配Android.mk)。
3、最麻烦的就是别人提供了写好的apk src,并且这种src刚好也使用了新的v7库,那我们应该怎么办呢?
针对这种情况。首先,需要对常见的Android.mk添加res文件和lib文件的支持(尤其是res文件的支持,一般新版apk 编译不过的根本原因是由于 Theme中所定义的资源无法找到)
(修改好的Android.mk源文件如下)
##################################################
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := \ //增加lib的支持
android-support-v7-gridlayout \
android-support-v7-mediarouterLOCAL_RESOURCE_DIR = \
$(LOCAL_PATH)/res \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/gridlayout/res \
frameworks/support/v7/mediarouter/res //增加res的支持 (若不填写,则默认会自动查找工程路径下的res目录,所以很多v7的资源包会找不到。(补充下,假设仅仅只添加了v7的lib而未添加res资源文件,则由于res资源文件本身并不包含在lib里面的,故mmm编译时一样会报找不到res的相关错误)
LOCAL_AAPT_FLAGS := \
–auto-add-overlay \
–extra-packages android.support.v7.appcompat:android.support.v7.gridlayout:android.support.v7.mediarouter //将编译出的三种资源包组件,使用aapt tool打包到即将生成的Apk中,从而保证生成的Apk运行正常! What?? aapt tool你不知道是什么?? 哈哈,好吧,这个tool确实用的不多,例如与telephony相关有个叫做PhoneCommon的Apk中也用到了,该Apk被使用aapt tool集成到了call相关Apk中(由于Android L有变化,所以就不实名举例了)。综合,该tool的目的就是把另外一个Apk功能直接集成到一个Apk中。
#LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := myapk
include $(BUILD_PACKAGE)
##################################################
include $(call all-makefiles-under,$(LOCAL_PATH))