最近公司因爲要參加國際上的某個show,須要集成Google Maps和Google Search的apk,注意是源碼集成。在此過程當中遇到一些坑,總結下來但願你們注意,之後遇到相似問題能夠參考。html
你們都知道,源碼集成apk主要有兩種形式,一種是預裝到/system/app下邊,一種是預裝到/data/app下,固然還有一種比較特殊的是/system/priv-app。在集成以前,我先在某個應用市場下載了最新的幾個Google的apk (個人系統環境是5.0.1),它們分別是:Google Play Service、Google Service Framework、Google Play Store、Google Maps以及Google Search。我剛開始的作法是將這些apk直接集成到/system/app,以google maps爲例android
LOCAL_PATH := $(PREBUILT_PATH) include $(CLEAR_VARS) LOCAL_MODULE := GoogleMaps LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := APPS LOCAL_CERTIFICATE := PRESIGNED LOCAL_MODULE_SUFFIX := .apk LOCAL_SRC_FILES := ../n5100/system/app/GoogleMaps/GoogleMaps.apk include $(BUILD_PREBUILT)
可是編譯出來的rom在開機時會報錯,主要是兩種錯誤:一個是提示Google Play Service sopped;另外一個是Google Maps安裝位置不對。這兩個問題困惑了我很久。關於Google Maps的錯誤,我發如今普通install也就是安裝在/data/app目錄下時是能夠正常運行的,可是放到/system/app下就不行了。adb shell進去看目錄結構,突然發現app的目錄中還有依賴的so文件,這時才恍然大誤。/data/app下的apk會去本身目錄下的lib/arm中找so,而/system/app會從/system/lib下尋找,我以前只把apk集成到了/system/app,而忽視了/system/lib下的so,遂adb pull出data/app下的依賴so,而後集成到/system/lib下。Google Play Service跟Google Search一樣須要這一步,Google Play Store跟Google Service Framework就沒有依賴的so。以Google Maps爲例,添加如下so集成shell
LOCAL_PATH := $(PREBUILT_PATH) include $(CLEAR_VARS) LOCAL_MODULE := libcrashreporterer LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_CERTIFICATE := platform LOCAL_MODULE_SUFFIX := .so LOCAL_SRC_FILES := ../n5100/system/app/GoogleMaps/libs/libcrashreporterer.so include $(BUILD_PREBUILT) LOCAL_PATH := $(PREBUILT_PATH) include $(CLEAR_VARS) LOCAL_MODULE := libgmm-jni LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_CERTIFICATE := platform LOCAL_MODULE_SUFFIX := .so LOCAL_SRC_FILES := ../n5100/system/app/GoogleMaps/libs/libgmm-jni.so include $(BUILD_PREBUILT)
Ok,通過以上步驟,Google Maps不會報錯了,可是Google Play Service仍是報錯,看log是Google Service Framework中的一些permission找不到,此時靈光一現將Google Service Framework集成到了/priv-app下,居然鬼使神差般地work了。看來是得好好研究一下這幾個目錄的差別了。app
LOCAL_PATH := $(PREBUILT_PATH) include $(CLEAR_VARS) LOCAL_MODULE := GoogleServiceFramework LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := APPS LOCAL_CERTIFICATE := PRESIGNED LOCAL_PRIVILEGED_MODULE := true LOCAL_MODULE_SUFFIX := .apk LOCAL_SRC_FILES := ../n5100/system/priv-app/GoogleServiceFramework/GoogleServiceFramework.apk include $(BUILD_PREBUILT)
通過以上步驟,全部的工做大功告成。可是,仍是遇到了另一個問題,系統還要集成國內某個廠商的導航軟件,用以上這種方法會發現,該導航軟件依賴的某個so庫與系統原生的so會有命名衝突,看來應該是從某個android版本中抽取出來的so,鄙視一下也不改個名字,因此集成到/system/app下無望了,那就只能集成到 /data/app吧,關於集成apk到/data/app要遠比/system/app麻煩,網上差了一些資料,無外乎如下原理:將apk保存到系統rom中的某個文件夾下,待系統第一次啓動的時候經過init.rc中的某個daemon service執行一個腳本命令,將apk copy到/data/app下。ui
具體參考連接:http://blog.csdn.net/zuiaikg703/article/details/12445525 google
http://www.cnblogs.com/MMLoveMeMM/articles/4087014.html .net