0%

目标 AGP 版本

classpath "com.android.tools.build:gradle:9.1.1"

修改编译产物文件名

Application

android {
    ...
    androidComponents {
        /**
         * {@link com.android.build.api.extension.impl.AndroidComponentsExtensionImpl}
         */
        onVariants(selector().withBuildType("release")) { variant ->
            /**
             * {@link com.android.build.api.component.analytics.AnalyticsEnabledApplicationVariant}
             * {@link com.android.build.api.variant.ApplicationVariant}
             * {@link com.android.build.api.variant.impl.ApplicationVariantImpl}
             * {@link com.android.build.gradle.internal.component.ApplicationCreationConfig}
             * {@link com.android.build.api.variant.impl.VariantOutputList}
             */
            variant.outputs.each { output ->
                /**
                 * {@link com.android.build.api.variant.impl.VariantOutputImpl}
                 */
                output.outputFileName.set('XXXXX_${output.versionName.get()}_${variant.buildType}.apk')
            }
        }
    }
}

Library

android {
    ...
    androidComponents {
        /**
         * {@link com.android.build.api.extension.impl.AndroidComponentsExtensionImpl}
         */
        onVariants(selector().withBuildType("release")) { variant ->
            /**
             * {@link com.android.build.api.component.analytics.AnalyticsEnabledLibraryVariant}
             * {@link com.android.build.api.variant.LibraryVariant}
             * {@link com.android.build.api.variant.impl.LibraryVariantImpl}
             * {@link com.android.build.gradle.internal.component.LibraryCreationConfig}
             * {@link com.android.build.gradle.internal.component.AarCreationConfig}
             */
            variant.delegate.aarOutputFileName.set("xxx-lib_${defaultConfig.versionName}_${variant.delegate.buildType}.aar")
        }
    }
}

参考

前言

在 AI 辅助编程的时代,OpenCode 作为一款强大的终端 AI 助手,能够帮助开发者完成各种编程任务。而 markitdown-mcp 则是一个基于 MCP (Model Context Protocol) 的服务,可以将各种资源(网页、文件、PDF 等)转换为 Markdown 格式,极大地扩展了 AI 的文档处理能力。

本文将详细介绍如何在 OpenCode 中配置和使用 markitdown-mcp。

阅读全文 »

前言

SSH(Secure Shell)是目前最常用的远程登录协议,它通过加密技术保证了在不安全网络中传输数据的安全性。本文将深入讲解 SSH 的加密原理,并重点介绍如何通过验证服务器指纹来防止中间人攻击。

阅读全文 »

1. 核心原理:为什么 HTTP 代理能承载非 HTTP 流量?

HTTP 代理之所以能够承载非 HTTP 协议(如 SSH、SMTP、数据库连接等)的流量,核心机制在于 HTTP CONNECT 方法 以及由此建立的 隧道(Tunneling) 技术。

简单来说,HTTP 代理在处理普通请求时是“应用层网关”(它解析并转发 HTTP 指令),但在处理 CONNECT 请求时,它退化为一个“透明的字节管道”(它不再关心内容,只负责双向传输数据)。

阅读全文 »

本文将深入介绍 GitHub 官方的 Spec-Kit、社区热门的 OpenSpec 以及跨平台方法论工具 Superpowers 三个 AI 编程辅助工具,从安装配置到实战使用,再到三者协同的最佳实践,带你全面掌握 AI 驱动的规范化开发新范式。

前言:为什么需要这些工具?

2024-2026 年,AI 编程工具经历了爆发式增长。从最初的代码补全,到如今的 AI Agent 自主编程,开发者面临一个核心问题:如何让 AI 真正理解我们的意图,并按照预期的方式工作?

三个工具应运而生,它们从不同角度解决这个问题:

工具 核心问题 类比
Spec-Kit “按什么规矩干” 建筑规范手册
OpenSpec “改了什么” 施工变更单
Superpowers “怎么干” 施工队工作手册

接下来,让我们逐一深入了解。

阅读全文 »

最近搞一个自动化小工具, 主要是控制浏览器干一些事情,最开始使用 Selenium 实现。

其中要用到了一些网络监听相关的功能。期间翻了很多博客,发现这些博客记录的信息都太累赘(使用不再维护的 Selenium-Wire 或者跑一个内置的代理服务器监听之类的)或太古老了(很早的实现方式,新版本 API 作了修改),完全用不了。

最终在仔细研究了几遍官网文档和外网的零星资料之后,终于是吧这个功能实现了。鉴于国内还没有很多这方面的信息,特此记录一下。

PS:后来还要实现通过浏览器下载文件的效果,这个时候发现了行业新秀 Playwright,这玩意对于这个场景太合适了,可以监控文件下载结果,这一点完全碾压 Selenium

阅读全文 »