Android library native 代码不能调试解决方法汇总

news2024/9/30 17:26:50

android native开发会碰到native代码无法调试问题,而app主工程中的native代码是可以调试的。如果项目中存在多个module,那么在application模块中依赖library模块,并且library模块中有native代码的时候,当debug library模块中的这些native代码时可能会发现断点打不进去。导致这个问题的根本原因是因为即使在运行application模块的debug构建时,其依赖的library模块并不是以debug构建,而是以release构建。

方法一

在library模块和application模块中加入忽略strip的正则匹配,如下

android {
    //...
   if (isDebug()) {
        packagingOptions {
            doNotStrip "*/armeabi/*.so"
            doNotStrip "*/armeabi-v7a/*.so"
            doNotStrip "*/arm64-v8a/*.so"
            doNotStrip "*/x86/*.so"
            doNotStrip "*/x86_64/*.so"
            doNotStrip "*/mips/*.so"
            doNotStrip "*/mips64/*.so"
            //...
        }
    }
}

library模块和application模块中的gradle都需要加入。但是打正式release包的时候是需要剔除so的符号表的,防止so被破解。因此,最好配置一个开关,且这个开关不会被提交到git中去,因此local.properties是最合适的。isDebug方法写在顶层的build.gradle中,这样各个module里边都可以引用。

boolean isDebug() {
    boolean ret = false
    try {
        Properties properties = new Properties()
        File file = project.rootProject.file('local.properties')
        if (!file.exists()) {
            return false
        }
        properties.load(file.newDataInputStream())
        String debugStr = properties.getProperty("debug")
        if (debugStr != null && debugStr.length() > 0) {
            ret = debugStr.toBoolean()
        }
    } catch (Throwable throwable) {
        throwable.printStackTrace()
        ret = false
    }
    project.logger.error("[${project.name}]Debug:${ret}")
    return ret
}

然后在local.properties中加入debug=true,修改packagingOptions配置,增加判读逻辑isDebug()。

如果使用上述方式还不行,将主app也添加cmake,包含native代码。gradle参考配置如下:

plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.app2"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_ARM_MODE=arm', '-DANDROID_STL=c++_static'
                cppFlags "-std=c++11 -frtti -fexceptions"
            }
        }

        ndk {
            abiFilters "arm64-v8a"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.18.1"
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    if(isDebug()){
        packagingOptions {
            doNotStrip "*/armeabi/*.so"
            doNotStrip "*/armeabi-v7a/*.so"
            doNotStrip "*/arm64-v8a/*.so"
            doNotStrip "*/x86/*.so"
            doNotStrip "*/x86_64/*.so"
            doNotStrip "*/mips/*.so"
            doNotStrip "*/mips64/*.so"
            //...
        }
    }

}

方法二

在Run -> Edit Configuration的配置页面,Debugger -> Symbol Directories里面添加第一步生成debug aar的代码目录。

gradle中的task未显示问题:

解决方法: 依次点击:File -> Settings -> Experimental -> 取消勾选 “Do not build Gradle task list during Gradle sync”,如下图所示 最后,sync 一下即可。

debug aar的生成:

点击执行assembleDebug。
然后配置Symbol Directories中的符号表目录。

 

方法三

 

在Project Structure中,对应module的Debuggable和Jni Debuggable置为true。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何高效获取数据价值?

导读:上一篇《大数据架构知识点详解:国产数据库创新、湖仓一体实践…》中我们阐述了四大体系之数据架构体系,解释了云原生大数据实践、国产数据库创新变革、湖仓一体落地实践、OLAP 发展趋势四个论坛的架构思路。 接下来是四大体系之二数据效…

【Linux】2、Linux 的基本命令

目录一、Linux 的目录结构二、Linux 命令三、ls 命令四、cd五、pwd六、特殊路径符七、mkdir八、touch九、cat 命令十、more十一、cp十二、mv十三、rm十四、which十五、find十六、grep十七、wc十八、管道符十九、echo二十、重定向符二十一、tail 命令一、Linux 的目录结构 &…

直播观看指南|SOFA 五周年,Live Long and Prosper!

SOFA 五周年活动将于 2023 年 4 月 15 日(周六)12:00 在北京朝阳区恒通国际创新园 C6 栋 C work 举行!期待社区的小伙伴和对开源感兴趣的小伙伴们一起来现场玩哦~当然啦,不能来现场的小伙伴们也别担心,我们…

第二十一章 案例TodoList之新增数据

前一小节,我们已经完成了数据的动态展示,现在我们要完成数据的动态添加。如何添加呢?肯定是要通过Header组件来添加,但是Header组件如何将收集的任务数据,交给App组件并更新状态数据呢? 在Header组件中收集…

实现vue的条件渲染

我的需求是根据设备不同的状态 渲染不同的标签。设备状态用device_State表示。 在线上面是一个vue的标签,我有一个数据state ,如何让这个标签根据数据的取值 ,修改内容,如state1时,标签修改为离线 要根据数据的取值动态…

Python曲线拟合详解

文章目录入门参数多元拟合入门 scipy.optimize中,curve_fit函数可调用非线性最小二乘法进行函数拟合,例如,现在有一个高斯函数想要被拟合 yaexp⁡−(x−bc)2y a\exp-(\frac{x-b}{c})^2 yaexp−(cx−b​)2 则调用方法如下 import numpy as…

STM32基础代码学习G070CB串口透传调试(出厂默认)代码

先下载 一定记得回车换行勾选 可以参考“Quectel_BC260Y-CN_AT命令手册_V1.0.pdf” ATCGMI 查询制造商信息 ATCGMM 查询模块型号 ATCSQ 上报信号质量 ATCGATT? PS 域附着或去附着查看板子是否正常 再激活 ATQIACT1,最后查询ATQIACT? 配置阿里云mqtt atqmtc…

【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)

1、主循环 《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。如下图所示,图中的balls和foods代表服务端的状态,在循环中执行“食物生成”“位置更新”和“碰撞检 测”等功能,从而…

学习笔记 —— C++并行库OpenMP

ContentsInstallationImplement1、一个最简单的OpenMP代码:2、如何规定线程数2、如何设置OpenMP分配线程的schedule3、 冲突避免机制 --Reduction(规约)Discovery写在最前面: 并行化虽好,但并不是所有任务在并行化后都…

【MySQL学习】MySQL表的操作

目录一、表的创建1.1 创建表的语法1.2 案例二、查看表结构三、查看建表语句四、修改表4.1 修改表的语法4.2 修改案例五、删除表一、表的创建 1.1 创建表的语法 语法: CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set…

透视Android系统AMS、PMS和WMS,了解开发中的重要角色

原理 在Android系统中,AMS(Activity Manager Service)、PMS(PackageManager Service)和WMS(Window Manager Service)是三个重要的系统服务,它们负责管理应用程序的生命周期、处理应…

Backblaze + Cloudflare + Picgo 打造免费顺畅的图床体验

本文xlog地址:https://x.cosine.ren/backblaze-cloudflare-picgo-imgbed hexo 地址:https://ysx.cosine.ren/backblaze-cloudflare-picgo-imgbed 同步发布 最近有用到oss存储的需求,跟群友调研了下国内 & 国外的 oss 后,深感找…

大爽pygame入门教程 第一节 基础知识

作者自我介绍:大爽歌, b站小UP主 ,编程1对1辅导老师 本节掌握要点: 文本, 图形, 键鼠事件,动态展示。 一、实现基础窗口 0 - 新建文件 新建001.py文件,内容如下 import pygamepygame.init() # pygame 初始化&#x…

什么是远程桌面连接?如何操作远程桌面?

随着时代越来越信息化、智能化、自动化,越来越多的企业和个人开始使用远程办公软件进行办公。其中远程桌面连接是一种非常流行的办公方式。那么,什么是远程桌面连接?如何操作远程桌面? 一、什么是远程桌面连接? 远程桌面连接是一种远程访问计算机的…

nginx缓冲区关闭导致下载失败问题-方案篇

问题描述 导出操作。小于200k的excel正常下载,大于200K的下载失败,异常信息如下: Cannot forward to error page for request [/xx/xx] as the response has already been committed. As a result,the response may have the wrong status code. If you…

程序员工作久了,都不会好好说人话了...互联网人的....黑话

原来工作也是会被腌入味的 前段时间有位博主吐槽 工作太久都不会说人话了 这张口的互联网味儿 瞬间梦回自己的工位 而评论区的网友们表示 这不就是”世另我“吗 一场关于互联网黑话的"掰头" 就此开始了... 维护厨房 (厨房秒变公司) 新…

Bagging算法预测银行客户流失率

Bagging算法预测银行客户流失率 描述 为了防止银行的客户流失,通过数据分析,识别并可视化哪些因素导致了客户流失,并通过建立一个预测模型,识别客户是否会流失,流失的概率有多大。以便银行的客户服务部门更加有针对性…

【CSS】使用 CSS 实现三角形 ( 宽高设置为 0 | 设置四个边框宽度 / 样式 / 颜色值 | 兼容低版本浏览器 | 基本示例 | 对话框示例 )

文章目录一、使用 CSS 实现三角形二、使用 CSS 实现三角形代码示例三、使用 CSS 实现 对话框 代码示例一、使用 CSS 实现三角形 使用 CSS 实现三角形步骤 : 首先 , 宽度 / 高度 设置为 0 ; /* 宽高设置为 0 像素 */width: 0;height: 0;然后 , 设置 4 个边框 , 每个边框都要设置…

【软考备战·希赛网每日一练】2023年4月14日

文章目录一、今日成绩二、错题总结第一题第二题第三题第四题三、知识查缺题目及解析来源:2023年04月14日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析: 具有 最优子结构 特点的问题可以使用 动态规划法 进行求解。计算m数组中每项的值&am…

日撸 Java 三百行day28-30

文章目录说明day28-30 Huffman 编码 (节点定义与文件读取)1.建树过程(以图为例)2.哈夫曼树特点3.分析代码过程3.1 抽象成员变量3.2结合文章梳理思路1.读文本2.解析文本内容:3.建树4.生成哈夫曼编码5.编码6.解码4.其他4.1 java 类型强转4.2 ja…