使用新版Eclips编写的APK(V 7包)放入Android源码中mmm编译,报错的两种解决办法

        由于新版本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-v4 \ android-support-v7-appcompat \
 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))   

        最后的最后,我需要为大多数刚入门的朋友做一下补充:
那就是由于绝大多数情况下,Android Source Code编译过程中,默认并不去编译V7包相关的这三个lib,所以需要在编译apk之前手动mmm编译一次。
命令如下:
mmm framework/support/v7/appcompat 
mmm framework/support/v7/gridlayout 
mmm framework/support/v7/mediarouter(各个平台的v7包所放位置可能需要自行去查找)
最后,我们再用mmm去编译前面的apk就成功了。
世界又美好了!!!  


猜你喜欢

转载自blog.csdn.net/a4262562/article/details/51469979