日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android系统共享一套sdk

發布時間:2024/1/17 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统共享一套sdk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

在一個Android系統中,尤其是開發各個app模塊的開發人員,可能會用到同一個第三方的sdk,比如xutils、volley、gson、amap、imageloader等。目前大家通常的做法是把第三方sdk集成到自己的app中,與app一起打包生成一個apk。這樣做固然沒有問題,但是會給系統帶來一些額外的不好影響:比如多個app都用了同一個sdk,造成了sdk的冗余,增大了整個系統ota包的大小;在寫Andriod.mk時,需要注意聲明使用的sdk是否與系統中其他app使用的sdk重名;不同的app可能使用了不同版本的sdk,導致sdk版本不統一。那是否有一種方案能解決這個問題呢?答案是肯定的,而且Android系統本身就給我們提供了這鐘機制,那就是“uses-library”。"uses-library"只是解決了使用的問題,具體還涉及到系統源碼和編譯腳本的一些修改,下邊就來具體說一說,如何做到解決編譯時依賴、運行時動態加載sdk的問題:

1、在系統源碼里聲明sdk,其實是sdk中的jar包。這個可以參考編譯好的rom中的/system/etc/permission/xxx.xml,我們可以考慮修改/framework/base/data/etc/platform.xml,可以添加以下內容:

<!--?This?is?a?list?of?all?the?amap?libraries?available?for?applicationcode?to?link?against.?--><library?name="android.amap.location"file="/system/framework/android.amap.location.jar"?/><library?name="android.amap.services"file="/system/framework/android.amap.services.jar"/><library?name="android.amap.map"file="/system/framework/android.amap.map.jar"/><library?name="android.amap.2dmap"file="/system/framework/android.amap.2dmap.jar"/>

2、將第三方sdk的jar包集成到系統的/system/framework/下,這個可以在vendor/xxx/prebuilt/(不同的項目對應的目錄可能不同)中新建一個項目,把第三方sdk的jar和so提取出來,編寫Android.mk腳本,以android.amap.map為例,

include?$(CLEAR_VARS) LOCAL_MODULE_TAGS?:=?optional LOCAL_SRC_FILES?:=?$(call?all-java-files-under,?.) LOCAL_NO_STANDARD_LIBRARIES?:=?true LOCAL_STATIC_JAVA_LIBRARIES?:=?amap_loc LOCAL_MODULE?:=?android.amap.location LOCAL_MODULE_CLASS?:=?JAVA_LIBRARIES LOCAL_NO_EMMA_INSTRUMENT?:=?true LOCAL_NO_EMMA_COMPILE?:=?true LOCAL_DX_FLAGS?:=?--core-library include?$(BUILD_JAVA_LIBRARY)################################################# include?$(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES?:=?amap_loc:libs/AMap_Location_v1.4.0_20150830.jar include?$(BUILD_MULTI_PREBUILT) #################################################include?$(CLEAR_VARS) LOCAL_MODULE????????:=?libamapv304 LOCAL_MODULE_TAGS???:=?optional LOCAL_MODULE_CLASS??:=?SHARED_LIBRARIES LOCAL_CERTIFICATE???:=?PRESIGNED LOCAL_MODULE_SUFFIX?:=?.so LOCAL_SRC_FILES?????:=?so/libamapv304.so include?$(BUILD_PREBUILT)

3、在以上步驟之后,還需要將編譯出來的module集成到系統中,也就是在prebuilt.mk或者其他什么地方PRODUCT_PACKAGES中添加上對應的module name,不然系統編譯沒有問題,生成的rom包中確沒有對應的文件內容。

4、修改完系統的編譯問題后,接下來需要解決APP的編譯問題,將Android.mk中聲明的JAVA_STATIC_LIBRARIES依賴去除,改為使用LOCAL_JAVA_LIBRARIES,如下:

LOCAL_JAVA_LIBRARIES?:=?android.amap.location

5、最后要修改的是AndroidManifest.xml中使用library問題,在application元素內聲明如下,一定要在application標簽內哦:

<uses-library?android:name="android.amap.location"?/>

????最后,需要注意一個坑:如果jar包中有asset怎么辦?比如map sdk中有一些依賴的asset資源,在之前靜態編譯依賴時沒有問題,但是使用uses-library方式時,由于jar包是動態加載,asset資源在運行時無法被找到,所以解決方法是:事先將sdk中的asset解壓出來放到app的asset中,系統集成的sdk中可以將asset目錄刪除了。


轉載于:https://my.oschina.net/kingguary/blog/530975

總結

以上是生活随笔為你收集整理的Android系统共享一套sdk的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。