【问题标题】:How to add debug symbols to build.gradle如何将调试符号添加到 build.gradle
【发布时间】:2026-01-15 23:15:01
【问题描述】:

我已经创建了我的 Flutter 应用程序的 android 版本。

然后我创建了一个内部测试版本。它显示警告

此 App Bundle 包含原生代码,而您尚未上传调试 符号。我们建议您上传符号文件以使您的崩溃 和 ANR 更易于分析和调试。

基本上我要做的就是根据他们显示的链接将以下内容添加到 build.gradle 文件中。

android.buildTypes.release.ndk.debugSymbolLevel = { SYMBOL_TABLE | FULL }

我认为他们正在谈论的是 android/app/build.gradle。

不确定我必须在该文件中的确切位置添加这一行。

有人能指出在哪里添加这一行吗?

【问题讨论】:

标签: android flutter debugging release android-app-bundle


【解决方案1】:

在 app/build.gradle 中有两个地方可以指定调试符号与应用的捆绑。如果您使用android.defaultConfig.ndk.debugSymbolLevel,它将应用于所有构建类型(即调试和发布构建)。另一方面,如果您使用android.buildTypes.release.ndk.debugSymbolLevel,它将仅适用于您的发布版本。

这些选项必须按照您的猜测添加到您的app/build.gradle 文件中。当您看到以这种虚线表示的构建属性时,它实际上对应于 build.gradle 中的嵌套块,看起来有点像这样:

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId 'com.example.foo'
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 42
        versionName "4.0.2"
        ndk {
            debugSymbolLevel 'SYMBOL_TABLE'
        }
    }
    // Rest of the file
}

HTH

【讨论】:

  • 在哪里可以找到要上传到 Playstore 的文件?
  • 原生调试符号包含在应用程序包中,但如果您使用 apk,它们位于此处:app/build/outputs/native-debug-symbols/variant-name/native-debug-symbols.zip
  • 将符号文件添加到混淆包中是否没有意义?一方面我想进行困难的逆向工程,另一方面我希望能够阅读我的 stackTrace(我正在使用 firebase crashalytics)@Alberto
  • 这不是问题。 proguard 映射和未剥离的库在用户安装您的应用程序时永远不会发送给他们,因此不可能进行逆向工程。它都安全地存储在 Play 管理中心并用于崩溃报告功能。
【解决方案2】:

要使用docs 中所写的选项ndk debugSymbolLevel,您需要一个android gradle 插件4.1 或更高版本。在撰写本文时,最新的 4.1 版本是 4.1.2

您还需要安装ndk and cmake for android studio

在您的 android build.gradle 中,您需要设置 android gradle 插件版本 4.1.2:

buildscript {
    ...
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.2'
        ...
    }

然后在android/app build.gradle 中添加:

...
android {
    ...
    // you see the ndk version in the android studio sdk-manager
    // have a look also here: https://*.com/a/65747847/9481613
    ndkVersion "21.3.6528147" 
    ...
    buildTypes {
        release {
            ...
            ndk {
                debugSymbolLevel 'SYMBOL_TABLE'
            }
        }   
    }
}

当你运行时:flutter build appbundle 它应该会在一段时间后完成一个两倍大小的 appbundle。

【讨论】:

  • 最新 gradle (4.2.0-alpha12') 插件所需的 gradle-wrapper.properties 中的最小 gradle-6.6.1-all.zip
  • gradle-6.5 是最低要求。只需更改插件版本:* gradle 文件中的 classpath 'com.android.tools.build:gradle:4.1.0' 。这将提示修复 gradle 并将安装 6.5。请记住,这需要 android studio 4.1 或更高版本。
  • 太棒了,谢谢!问题:为什么选择'SYMBOL_TABLE' 而不是'FULL'
  • 嗨@pierrea,这两个属性都在答案的第一个链接中进行了描述。基本上它要包含多少调试信息:Note: There is a 300 MB limit for the native debug symbols file. If your debug symbols footprint is too large, use SYMBOL_TABLE instead of FULL to decrease the file size.
  • 如果appbundle的大小是原来的两倍,那么play store上的app是不是也有两倍的大小?
【解决方案3】:

使用Android 4.1及以上版本目前有4.1 RC 3和4.2 Canary 13可用,同样使用com.android.tools.build:gradle 4.1及以上版本,可以搜索适合的版本from here

然后在你的应用程序 build.gradle 文件中的 android -> defaultConfig 中使用这一行

    ndk { debugSymbolLevel 'FULL' }

【讨论】:

    【解决方案4】:

    如果所有解决方案都不起作用,您还可以从 Android Studio 的项目模板创建示例 JNI 应用程序。构建它并检查它是否构建成功并安装在设备上。

    我已经检查了它的应用 build.gradle,检查了我的 Flutter 的 build.gradle 并添加了使其工作:

    defaultConfig {
    
        // append below:
        externalNativeBuild {
                cmake {
                    cppFlags "-std=c++17"
                }
            }
    }
    
    

    【讨论】: