当应用程序处于调试状态时,为什么 Gradle 会在发布模式下构建我的模块

2023-12-26

我正在制作一个新的 Android 项目,符合标准'app'模块以及一个库项目(我们称之为'custom_lib')。在里面app's build.gradle文件中,我这样链接模块:

dependencies {
    compile project(':custom_lib')
}

当我触发构建过程时(菜单Build > Make Project),我在 Gradle 控制台中得到以下输出

Executing tasks: [clean, :app:compileDebugSources, :custom_lib:compileDebugSources]

Configuration on demand is an incubating feature.
:app:clean
:custom_lib:clean
:app:preBuild
:app:preDebugBuild
:app:checkDebugManifest
:app:preReleaseBuild
:custom_lib:compileLint
:custom_lib:copyReleaseLint UP-TO-DATE
:custom_lib:mergeReleaseProguardFiles UP-TO-DATE
:custom_lib:preBuild
:custom_lib:preReleaseBuild
:custom_lib:checkReleaseManifest
:custom_lib:prepareReleaseDependencies
:custom_lib:compileReleaseAidl
:custom_lib:compileReleaseRenderscript
:custom_lib:generateReleaseBuildConfig
:custom_lib:generateReleaseAssets UP-TO-DATE
:custom_lib:mergeReleaseAssets
:custom_lib:generateReleaseResValues UP-TO-DATE
:custom_lib:generateReleaseResources
:custom_lib:packageReleaseResources
:custom_lib:processReleaseManifest
:custom_lib:processReleaseResources
:custom_lib:generateReleaseSources
:custom_lib:compileReleaseJava
:custom_lib:processReleaseJavaRes UP-TO-DATE
:custom_lib:packageReleaseJar
:custom_lib:compileReleaseNdk
:custom_lib:packageReleaseJniLibs UP-TO-DATE
:custom_lib:packageReleaseLocalJar UP-TO-DATE
:custom_lib:packageReleaseRenderscript UP-TO-DATE
:custom_lib:bundleRelease
:app:prepareComAndroidSupportAppcompatV72102Library
:app:prepareComAndroidSupportSupportV42102Library
:app:prepareTestDoubleBuildCustom_libUnspecifiedLibrary
:app:prepareDebugDependencies
:app:compileDebugAidl
:app:compileDebugRenderscript
:app:generateDebugBuildConfig
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources
:app:mergeDebugResources
:app:processDebugManifest
:app:processDebugResources
:app:generateDebugSources
:app:compileDebugJava
:app:compileDebugNdk
:app:compileDebugSources
:custom_lib:preDebugBuild
:custom_lib:checkDebugManifest
:custom_lib:prepareDebugDependencies
:custom_lib:compileDebugAidl
:custom_lib:compileDebugRenderscript
:custom_lib:generateDebugBuildConfig
:custom_lib:generateDebugAssets UP-TO-DATE
:custom_lib:mergeDebugAssets
:custom_lib:generateDebugResValues UP-TO-DATE
:custom_lib:generateDebugResources
:custom_lib:packageDebugResources
:custom_lib:processDebugManifest
:custom_lib:processDebugResources
:custom_lib:generateDebugSources
:custom_lib:compileDebugJava
:custom_lib:compileDebugNdk
:custom_lib:compileDebugSources

BUILD SUCCESSFUL

Total time: 2.184 secs

让我困惑的是,构建机制触发了调试构建(如第一行所述),但几乎立即,Gradle 使用了该任务:app:preReleaseBuild这使我的custom_lib要使用发布配置构建的模块。

然后,在应用程序完全构建后,Gradle 使用调试配置编译我的模块。

所以我的问题是:

  • 为什么要进行这种看似不连贯的双重构建?
  • 当我启动调试构建过程时,如何确保库是使用调试配置构建的?

EDIT :

应用程序/build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.deezer.testdoublebuild"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    buildTypes {
        debug{
            debuggable true
        }
        release {
            debuggable false
            minifyEnabled false
        }
    }
}

dependencies {
    compile project(':custom_lib')
}

自定义库/build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.deezer.mylibrary"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
}

Note:我正在使用 Android Studio 1.0 RC 1 / Gradle 2.2,并通过从头开始创建一个新项目、添加一个空的 Android 库模块来重现此问题,然后“瞧”


将其放入您的应用程序依赖项中:

dependencies {
    debugCompile project(path: ':custom_lib', configuration: "debug")
    releaseCompile project(path: ':custom_lib', configuration: "release")
}

并在库的 build.gradle 中添加:

android {

    defaultConfig {
        defaultPublishConfig 'release'
        publishNonDefault true
    }

}

然后库将以与应用程序相同的模式构建。与此答案之前的修订相反,我已经确认库不需要风味(这可能是由于 Gradle 或 Android 插件版本 - 我使用 Gradle 2.14 和 Android 插件 2.1.0 并且不需要它) 。

编辑:如果修改 gradle 文件后不清理/重建,您可能会遇到麻烦,如中所述这个答案在这里。 https://stackoverflow.com/a/35338493/4516144

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当应用程序处于调试状态时,为什么 Gradle 会在发布模式下构建我的模块 的相关文章

  • Android:直接截屏到字节 - 跳过保存到文件

    我使用以下代码在 root 设备上截取屏幕截图 sh Runtime getRuntime exec su null null os sh getOutputStream os write system bin screencap p sd
  • 在 Android 应用程序中动态检查权限

    继我之前的question https stackoverflow com questions 18420994 multiple permissions in androidpermisson关于运行时的 android 权限强制执行 我
  • 如何将本地主机 IP 地址转发到 Android 模拟器?

    我知道可以将端口从我的开发机器转发到 Android 模拟器 但是这是如何完成的呢 我在 android developers 网站上找到了解决方案 但我不明白他们的说明是什么意思 有人对此有明确的指示吗 我的开发机器运行的是 Window
  • 使用 API 8 及以上版本获取用户/所有者个人资料联系人 URI 和用户图像

    从 API 14 Android 4 0 起 开始我可以使用ContactsContract Profile CONTENT URI得到手机所有者的联系个人资料 Uri 并通过该信息获取他们的头像 联系照片 我想知道如何从 API 8 An
  • ListView 滚动时隐藏和显示浮动按钮

    我正在我的应用程序中创建一个 listView 和一个浮动按钮 我希望根据滚动状态实现隐藏和返回的效果 当 的时候ListView滚动时按钮隐藏得很好 但是当滚动停止时按钮不会返回到其初始位置 有任何想法吗 My Code public c
  • Android问题:Eclipse找不到ADB.exe

    首先 我知道这个问题之前已经被问过 即 在我的工具文件夹中找不到 adb exe https stackoverflow com questions 4659014 could not find adb exe on my tools fo
  • 如何在运行时更改android应用程序名称和图标?

    安装 Android 应用程序后 当您按下应用程序中的按钮时 是否可以动态更改应用程序图标和名称 在运行时 这是到目前为止的代码 getPackageManager setComponentEnabledSetting new Compon
  • 如何在Android中设置对话框的图标

    我想在Android中自定义一个对话框 我知道如何设置对话框的标题 dialog setTitle O message 现在我想在标题前面设置图标 我怎样才能实现这个目标 Dialog dialog dialog new Dialog th
  • Firebase Android:电子邮件链接身份验证。意图过滤器不起作用

    我正在为 Android 实现 firebase 电子邮件链接身份验证机制 我已经使用 firebase 指南实现了它 但现在打开电子邮件中的链接后 应用程序始终会进入启动器活动 我无法调试该问题 我还在我的应用程序中实现了动态链接 效果很
  • 在 Android Webview 中加载 Angular JS 网站的问题

    大家好我正在尝试加载GTV http gtvqa com Android WebView 中 它在移动浏览器中加载得很好 但在 webview 中则不行 这是我的代码 WebView theWebPage new WebView this
  • 如何将点击事件从片段传递到容器活动?

    我正在实现一个导航抽屉活动 其中导航抽屉中有一个片段 由回收器视图组成 可以动态地将项目添加到导航抽屉 我已经成功实现了这个概念 但面临一个小问题 即当我单击片段中的任何项目时 导航抽屉不会关闭 这是因为我无法从片段访问 DrawerLay
  • 使用 sdk 3.0 在 Facebook 墙上发布

    我试图在由其 ID 定义的用户墙上发布一条消息 但作为响应 我收到错误 未知方法 我的代码是 final Bundle params new Bundle params putByteArray message Test getBytes
  • 如何从 Android 应用程序调试共享库 [单独的项目]

    我正在开发一个 Android 应用程序并在项目中使用密集的 C 代码 首先 我将c 源代码放入项目中 并使用以下指南在Android应用程序中具有本机调试的NDK功能 http tools android com recent using
  • 如何在首次运行时填充大型 SQLite 数据库

    我正在开发一个基于 SQLite 数据库的字典应用程序 该数据库包含超过 300 000 行 问题在于 最终形式的数据库文件由全文索引表组成 并且重量远远超过150Mb 我通过创建无内容的 fts4 表设法将 db 文件大小降至最低 数据库
  • 在 Java/Android 中查找 UTF-8 字符串中的字符数

    我试图找出字符串以 UTF 8 存储时的长度 我尝试了以下方法 String str Charset UTF8 CHARSET Charset forName UTF 8 byte abc str getBytes UTF8 CHARSET
  • 为并行的小型已知冻结进程创建匿名 AsyncTask 是一个好习惯吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 例如 您要做一些需要几秒钟的事情 并且不想冻结您的 UI 线程 对吗 您可以使用 AsyncTask 但您不想创建外部 或内部 类来解决小冻结问
  • Android 基础知识:在 UI 线程中运行代码

    从在 UI 线程中运行代码的角度来看 以下两者之间有什么区别 MainActivity this runOnUiThread new Runnable public void run Log d UI thread I am the UI
  • 注意通知持续时间

    是否可以将抬头通知的持续时间设置为无限 现在它只显示 5 秒 已经尝试过不同的事情 例如更改类别 但持续时间始终为 5 秒 这是我的代码 Notification notification notificationBuilder setCa
  • android中使用xml的新自定义字体方法

    随着 android 发布 O 预览版 添加了一个新功能 称为xml 中的字体 它很容易实现 但我没有什么疑问 让我首先添加最好的方法1 右键单击资源文件夹并前往新建 gt Android 资源目录 新的出现资源目录窗口 2 在资源类型列表
  • 在Android中创建自定义按钮类

    我正在尝试为我的 Android 应用程序创建自定义按钮类 public class TicTacButton extends Button 我已经在里面设置了所有构造函数TicTacButton并创建了自定义方法和属性 在我的主要活动中

随机推荐