c++_shared库引入的问题
项目组提供了一个AAR文件供下游业务团队集成。
某天,下游团队反馈了一个紧急的问题,最终客户的开发者使用Android Studio打包时,构建工具提示构建失败,原因是存在重复的c++_shared库文件,建议使用pickFirst命令来修复。
最终客户的开发者查阅了一些资料,按照帖子的建议,在项目对应的build.gradle文件中尝试增加pickFirst相关的指令后,问题依然存在,构建仍然失败。
检查我们项目提供的AAR包,确实存在libc++_shared.so文件,据下游团队和最终客户的开发者反馈,他们的项目中依赖的其它AAR,也都存在libc++_shared.so文件。
使用C++编写代码时,通常都会使用到STL,NDK针对各平台,分别提供了动态库和静态库版本,即libc++_shared.so和``libc++_static.a。 安卓官网推荐开发者在build.gradle中通过指定变量ANDROID_STL的值来决定使用动态库还是静态库,即在build.gradle`中,增加类似如下配置:
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
...
// 使用静态库
arguments "-DANDROID_STL=c++_static"
// 或者使用动态库
arguments "-DANDROID_STL=c++_shared"
...
}
}
...
}
...
}
经过咨询部门内其它产品的同事,确认本问题最简洁有效的修复方案即在构建时,静态链接C++ STL的库文件。
最终的修复操作如下:
- 修正C++项目的构建脚本,屏蔽掉链接C++ STL动态库的指令。
- 修正项目中的Java代码,去掉加载动态库
c++_shared的代码。 - 修正AAR的构建脚本,指定链接C++ STL的静态库文件。
经过上述修复操作,重新构建AAR包。检查该AAR文件,未找到libc++_shared.so文件。
相关文件提供给下游团队,并提供给最终客户的开发者集成后,报错现象消失,通过Android Studio打包构建成功,相关功能经验证,正常可用,问题得到解决。
参考资料
- Android 引用三方库导致 so 库冲突的解决办法
- Android Studio build.gradle 中配置 cmake,及各 arguments 详解
- Android开发之引用三方库导致SO库冲突的解决办法
c++_shared库引入的问题的更多相关文章
- NDK(三方库引入、Mk文件)
NDK笔记-----第三方库引入 一.字符操作: 1 二.NDK*(JNI)对象操作: 2 1.C++调用java对象 3 三.Android.mk说明: 3 四.Application.mk说明 3 ...
- 如何将icon图标库引入自己的项目中
---恢复内容开始--- 今天是18年的国庆,趁着国庆的这股开心劲儿,开开心心的写点东西: 第一篇:关于如何将icon图标库引入自己的项目(此方法Taro,微信小程序,支付宝小程序等均适用,不会存在不 ...
- 静态库引入引起的错误解决方案,ld: warning: ignoring file ”…/XXX.a”, file was built for archive which is not the architecture being linked (armv7): “…/XXX.a” Undefined symbols for architecture armv7: "_OBJC_CLASS_$
想目中不免会引入一些静态库,可是有时加入'.a'文件后编译便会报以下错误 ld: warning: ignoring file ”…/XXX.a”, file was built for archiv ...
- Oracle JET 使用RequireJS第三方工具或库引入
在 Oracle JET 应用程序中使用 RequireJS 添加第三方工具或库. 步骤: 1.如果使用工具框架脚手架,需要一下操作. a.使用 npm 安装你需要的库. npm install my ...
- 自己动手写UI库——引入ExtJs(布局)
第一: 来看一下最终的效果 第二: 来看一下使用方法: 第三: Component类代码如下所示: public class Component { pub ...
- [Android Tips] 31.如何将第三库引入的 Permission 删除掉
Just declare the incriminated permission in your (main) Manifest with the tools:node="remove&qu ...
- 同一页面中引入多个JS库产生的冲突解决方案(转)
发生JS库冲突的主要原因:与jQuery库一样,许多JS库都使用‘$’符号作为其代号.因此在一个页面中引入多个JS库,并且使用‘$’作为代号时,程序不能识别其代表哪个库(这个是我自己的解释,但更深的原 ...
- Vue引入第三方JavaScript库和如何创建自己的Vue插件
一 第三方JavaScript库 前言 .vue文件 中不解析 script标签引入js文件,只能用 import 引入 有两种用法: 1.import a from '../a' 2.import ...
- AngularJS2.0 hello world例子——引入这么多额外的依赖库真是很忧伤啊
初识Angular2 写一个Angular2的Hello World应用相当简单,分三步走: 1. 引入Angular2预定义类型 import {Component,View,bootstrap} ...
- 百度静态资源库CDN库, cdnjs库,引入JS
不适用本地引入js文件,而使用其他服务器引入JS文件,1,减轻服务器压力2,速度快3,可以缓存 cdnjs库,更新比较快https://cdnjs.com/ cdn库 引入JS文件如:jquerybo ...
随机推荐
- 变量,六大数据类型之字符串、列表、元祖----day02
1.变量:可以改变的量,实际具体指的是内存中的一块存储空间 (1)变量的概念 (2)变量的声明 (3)变量的命名 (4)变量的交换 *常量就是不可改变的量,python当中没有明确定义常量的关键字,所 ...
- 51从零开始用Rust编写nginx,江湖救急,TLS证书快过期了
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,会将实 ...
- 百度爱番番基于图技术、流式计算的实时CDP建设实践
导读:随着营销3.0时代的到来,企业愈发需要依托强大CDP能力解决其严重的数据孤岛问题,帮助企业加温线索.促活客户.但什么是CDP.好的CDP应该具备哪些关键特征?本文在回答此问题的同时,详细讲述了爱 ...
- 四: Mysql用户管理
# 用户与权限管理 MySQL用户可以分为普通用户和root用户, root用户是超级管理员,拥有所有权限,包括创建用户.删除用户和修改用户的密码等管理权限:普通用户只拥有被授予的各种权限. MySQ ...
- vscode 批量函数前加const 正则表达式替换
需求 有200多个函数,我要在前面加const devService_importCertificate_result = function (args) { 方案 vscode 替换 打开正则的图标 ...
- [VueJsDev] 基础知识 - snippetsLab 代码片段
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html 代码片段 ::: details 目录 目录 代码片段 St ...
- vscode 对js文件不格式化的修正方案 settings.json
修正1 "javascript.format.enable": true, // 这里false 改true 修正2 注释掉这个地方 // "[javascript]&q ...
- 【数据结构】哈夫曼树与哈夫曼编码(Huffman Encoding)
一.背景 编码是信息处理的基础(重新表示信息). 普通的编码是等长编码,例如7位的ASCIL编码,对出现频率不同的字符都使用相同的编码长度.但其在传输和存储等情况下编码效率不高. 可使用不等长编码,来 ...
- Java的Class类,注解与反射
Class对象: 我们每创建一个类,经过build都会生成对应的.class文件 该类无法只能由虚拟机创建对象,其构造函数为private 当我们创建某个类的对象,ClassLoader(一个类)就会 ...
- JavaXMail发送邮件功能实现
原文:JavaXMail发送邮件功能实现 | Stars-One的杂货小窝 好久之前实现的邮件发送功能,一直没整理出来,考虑到之后有个项目需要,先整理一波 提示: 本文代码例子是使用Kotlin语言编 ...