標籤:
最近公司由於要參加國際上的某個show,需要整合Google Maps和Google Search的apk,注意是源碼整合。在此過程中遇到一些坑,總結下來希望大家注意,以後遇到類似問題可以參考。
大家都知道,源碼整合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為例
LOCAL_PATH := $(PREBUILT_PATH)include $(CLEAR_VARS)LOCAL_MODULE := GoogleMapsLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := APPSLOCAL_CERTIFICATE := PRESIGNEDLOCAL_MODULE_SUFFIX := .apkLOCAL_SRC_FILES := ../n5100/system/app/GoogleMaps/GoogleMaps.apkinclude $(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整合
LOCAL_PATH := $(PREBUILT_PATH)include $(CLEAR_VARS)LOCAL_MODULE := libcrashreportererLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_CERTIFICATE := platformLOCAL_MODULE_SUFFIX := .soLOCAL_SRC_FILES := ../n5100/system/app/GoogleMaps/libs/libcrashreporterer.soinclude $(BUILD_PREBUILT)LOCAL_PATH := $(PREBUILT_PATH)include $(CLEAR_VARS)LOCAL_MODULE := libgmm-jniLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := SHARED_LIBRARIESLOCAL_CERTIFICATE := platformLOCAL_MODULE_SUFFIX := .soLOCAL_SRC_FILES := ../n5100/system/app/GoogleMaps/libs/libgmm-jni.soinclude $(BUILD_PREBUILT)
Ok,經過以上步驟,Google Maps不會報錯了,但是Google Play Service還是報錯,看log是Google Service Framework中的一些permission找不到,此時靈光一現將Google Service Framework整合到了/priv-app下,竟然鬼使神差般地work了。看來是得好好研究一下這幾個目錄的差異了。
LOCAL_PATH := $(PREBUILT_PATH)include $(CLEAR_VARS)LOCAL_MODULE := GoogleServiceFrameworkLOCAL_MODULE_TAGS := optionalLOCAL_MODULE_CLASS := APPSLOCAL_CERTIFICATE := PRESIGNEDLOCAL_PRIVILEGED_MODULE := trueLOCAL_MODULE_SUFFIX := .apkLOCAL_SRC_FILES := ../n5100/system/priv-app/GoogleServiceFramework/GoogleServiceFramework.apkinclude $(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下。
具體參考連結:http://blog.csdn.net/zuiaikg703/article/details/12445525
http://www.cnblogs.com/MMLoveMeMM/articles/4087014.html
http://blog.chinaunix.net/uid-29535415-id-4168539.html
Android系統整合Google Maps和Google Search apk注意事項