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相关推荐

  1. 使用代理下载android系统源码和SDK

    ** 使用代理下载android系统源码和SDK ** 谷歌被墙后,如何下载android源码和sdk?使用代理.步骤如下: 寻找可用代理 先在这里找一个可用的代理服务器:http://www.xic ...

  2. Android系统VIN码识别SDK

    Android系统VIN码识别SDK 什么是VIN码 汽车vin码是一组由十七个英数组成,用于汽车上的一组独一无二的号码,它可以识别汽车的制造商.发动机.底盘序列号等性能数据. VIN是英文(车辆识别 ...

  3. 基于Android系统的高精度定位SDK方案

    内容简介 1.Android经典架构 2.Android高精度SDK架构设计说明 3.Android高精度SDK系统层技术设计详解 课程实录 一.Android经典架构 Android系统的架构分为四 ...

  4. Android系统共享内存

    1.共享内存简介 共享内存是进程间通讯的一种方式,通过映射一块公共内存到各自的进程空间来达到共享内存的目的. 通常进程内存空间是4G,这个大小是由内存指针长度决定的,如果指针长度32位,那么地址最大编 ...

  5. 乐行天下激光雷达文件升级及wifi配置(Android系统版本)

    android demo程序和windos运行库可在github上获得 乐行天下激光雷达截至到目前阶段(2016/11/12),使用的算法版依然是android系统,这套系统整体说来算是一个不完整的版 ...

  6. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共 ...

  7. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(6)

    接下来,我们再来看看server模块的实现.在external/ashmem/common目录下,只有一个源文件SharedBufferServer.cpp,它实现了内存共享服务SharedBuffe ...

  8. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划

    在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中.它有两个特点,一是能够辅助内存管理系统来有效地 ...

  9. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析

    在前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析中,我们系统地介绍了Android系统匿名共享内存的实现原理,其中着重介绍了 ...

最新文章

  1. 文巾解题 1190. 反转每对括号间的子串
  2. processing图片粒子化_个人见到的processing(优质且全的教程,一定看原文)
  3. 内存分配,任意字节对齐
  4. 点钞机语音怎么打开_原来微信语音一样能转发? 居然还有人不知道
  5. graphpad7.04多组比较p值_R语言缺失值处理(MICE/Amelia/missForest/Hmisc/mi)
  6. python爬虫框架学习_学习Python爬虫必备框架:Scrapy
  7. 通过web前端实现水印制作
  8. 小白转行学IT入职BAT应该怎么做
  9. Win7C盘不能扩大怎么办?Win7C盘扩展卷不能点怎么解决
  10. Microsoft Visual SourceSafe 2005 简体中文版
  11. php时间转换位周月,php日周月统计代码
  12. [C#] DataView用法
  13. 免费的chk恢复工具
  14. 微带贴片天线-微带线馈电
  15. [CSP-J 2021] 网络连接
  16. 浏览器判断是否安装APP
  17. SSL数字证书(一)CA、根证书与数字证书
  18. Win10右键菜单栏目中增加新建excel的方法教学
  19. 屏幕截图--截取全屏幕
  20. 青少年ctf crypto easy 部分题解

热门文章

  1. 科大讯飞ai研究院_科大讯飞1024开发者大会:让AI赋能行业数字化升级
  2. react实战项目_React实战之React+Redux实现一个天气预报小项目
  3. oauth2 token为空拦截_feign之间传递oauth2-token的问题和解决
  4. 计算机入域时域控用到的端口,【ADDC】域控需要开放的端口
  5. 一样入职的应届生工资不一样_刘涛入职阿里:为什么阿里要招聘明星?明星入职和普通人一样吗...
  6. 华工网络计算机电路基础作业,2021年《计算机电路基础》-华工网络教育学院平时作业.doc...
  7. linux文件系统添加pcm,linux下用sox批量将pcm文件加wav头、批量修改采样率、切音频...
  8. 计算机上机模拟试题答案,2016计算机二级上机模拟试题及答案
  9. php第一行空白,网页头部多出一行空白问题的解决方法 (PHP文件头BOM问题)
  10. MySQL结构化查询,SQL结构化查询语言(二)