Android library native 代码不能调试办理方法汇总

计算机软件开发 2024-9-10 07:22:14 45 0 来自 中国
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"            //...        }    }}ibrary模块和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。
参考资料

https://www.jianshu.com/p/76957970545e/
https://fucknmb.com/2017/05/11/Android-Studio-Library%E6%A8%A1%E5%9D%97%E4%B8%ADNative%E4%BB%A3%E7%A0%81%E8%BF%9B%E8%A1%8Cdebug%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%91/
https://www.jianshu.com/p/7f80be68f99b
https://www.jianshu.com/p/76957970545e/
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 20:34, Processed in 0.177918 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表