使用新版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就成功了。
世界又美好了!!!  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章