适配 AGP8.5 版本,各种问题(三)

[Android] build.gradle.kts SigningConfig with name ‘myConfig‘ not found 最后原因就是因为我把 signingConfigs 写到了 buildTypes 的后面,, 但通过 signingConfigs.findByName 返回 null。文件的时候,通过 getByName 一直提示。根据目录下:keystore.properties。,就完美解决了这个问题。 阅读详情

请添加图片描述

地点:深圳、西丽湖环湖碧道
时间:2025年2月23日

1. 签名创建 & 配置

应该说是 kts 和 gradle 的区别

build.gradle.kts

signingConfigs {
        create("myrelease") {
            storeFile = File(project.projectDir, "aa.keystore")
            storePassword = "aa"
            keyAlias = "aa"
            keyPassword = "aa"
        }

        create("mydebug") {
            storeFile = File(project.projectDir, "bb.keystore")
            storePassword = "bb"
            keyAlias = "bb"
            keyPassword = "bb"
        }
    }

    buildTypes {
        debug {
            signingConfig = signingConfigs["mydebug"]
        }
        release {
            signingConfig = signingConfigs["myrelease"]
        }
    }
} 

build.gradle

 signingConfigs {
        debug {
            keyAlias 'aa'
            keyPassword 'aa'
            storeFile file('aa.keystore')
            storePassword 'aa'
        }
        release {
            keyAlias 'bb'
            keyPassword 'bb'
            storeFile file('bb.keystore')
            storePassword 'bb'
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.release
        }
        release {
            signingConfig signingConfigs.release
        }
    }
}

2. Groovy 编译问题

问题: Groovy 代码写的类找不到,编译失败

我的插件里存在 Kotlin、Java、Groovy 代码(历史问题),升级到 AGP8+ 之后编译失败,在 AGP7+ 时没有发现问题,可能是那时候还没引入 Kotlin 代码。

我们看打包成功的例子,Kotlin、Java、Groovy 代码编译任务执行先后顺序是这样的:

  • compliteKotlin
  • compliteJava
  • compliteGroovy

我遇到的问题是:项目里面存在 Groovy 代码(位于 groovy 目录下),Kotlin 和 Java 代码(位于 java 目录下),当编译项目是发生了错误,Java 和 Kotlin 代码里找不到 Groovy 代码的类

看代码编译任务顺序可能理解了大概:Groovy 代码还没编译呢,就先编译引用了 Groovy 的 Java 代码肯定报错吧

解决:

  • 能不能把 Groovy 编译任务先于前面两个?(我不知道如何处理,未验证,只是一个猜想)
  • 把 Groovy 代码以 Kotlin 重写(是可以的,代码太多只是重写麻烦)

在这里插入图片描述

3. compliteGroovy 未执行

问题: Groovy 代码为打包进 jar 里

在插件发布时,发现项目里 java 目录下的 Groovy 代码没有生成到 jar 里面

再次打包也注意到运行的 Task 列表里面没有 compliteGroovy,说 Groovy 代码根本没有参与编译过程

后来关注到 main 下面可以创建者四个目录:

  • groovy:存放 Groovy 代码
  • java:存放 Java 代码
  • kotlin:存放 Kotlin 代码
  • resources:存放资源文件

解决:把 Groovy 代码移到 groovy 目录下重新编译,终于看到了 compliteGroovy 也编译正常

在 AGP7+ 时我的 Groovy 代码也是在 java 目录下却能正确编译,到 AGP8+ 就不行了

在这里插入图片描述

4. AsmClassVisitorFactory 编译失败

错误日志:Could not serialize value of type GameManagerClassVisitor

注意:他是运行时编译失败(就是引入插件后,在 app 目录打包 assembleRelease 执行时),不是插件发布编译成 jar 时

在这里插入图片描述

我的代码:

我有一个常量gameManagerClassname ,根据以往的编码习惯,直接接声明为对象的属性(感觉没问题啊),可以一开始编译就报错!(超乎想象,全是知识盲区)

abstract class GameManagerClassVisitor : AsmClassVisitorFactory<EmptyParam> {

    private val gameManagerClassname = "com.vimedia.game.GameManager"

    override fun createClassVisitor(
        classContext: ClassContext,
        nextClassVisitor: ClassVisitor
    ): ClassVisitor {
        return FindDispatchMethodVisitor(Opcodes.ASM9, nextClassVisitor)
    }

    override fun isInstrumentable(classData: ClassData): Boolean {
        return classData.className == gameManagerClassname
    }
}

根据前两篇文章,大概了解到 AsmClassVisitorFactory 的是一个接口:

interface AsmClassVisitorFactory<ParametersT : InstrumentationParameters> : Serializable {

    //这些参数可被实例化,并在实例化对象时注入
    @get:Nested
    val parameters: Property<ParametersT>

	//一些 asm 参数
    @get:Nested
    val instrumentationContext: InstrumentationContext

    // asm 工厂类,实际上委托给别的具体类实现操作
    fun createClassVisitor(
        classContext: ClassContext,
        nextClassVisitor: ClassVisitor
    ): ClassVisitor

    //返回布尔值,执行当前类是否需要处理
    fun isInstrumentable(classData: ClassData): Boolean
}

解决:所以我把这个 gameManagerClassname 转换为 InstrumentationParameters 实现,问题解决了

abstract class GameManagerClassVisitor : AsmClassVisitorFactory<GameManagerClassVisitor.P> {

    override fun createClassVisitor(
        classContext: ClassContext,
        nextClassVisitor: ClassVisitor
    ): ClassVisitor {
        return FindDispatchMethodVisitor(Opcodes.ASM9, nextClassVisitor)
    }

    interface P : InstrumentationParameters {
        @get:Input
        val gameManagerClassname: Property<String>
    }
}

如何传递参数:

    private fun registerTransform(project: Project) {
        project.plugins.withType(AppPlugin::class.java) {
            val androidExt =
                project.extensions.getByType(AndroidComponentsExtension::class.java)
            androidExt.onVariants { variants ->

                variants.instrumentation.transformClassesWith(
                    GameManagerClassVisitor::class.java,
                    InstrumentationScope.ALL
                ) { params ->
                    params.gameManagerClassname.set("com.vimedia.game.GameManager")
                }
            }
        }
    }

5. 添加 Http Maven 仓库

AGP7+

 maven {
	allowInsecureProtocol true
    url 'http://developer.huawei.com/repo/'
}

AGP8+

 maven {
	isAllowInsecureProtocol = true
    url = uri("http://developer.huawei.com/repo/")
}

6. 添加 Manifest 占位符

AGP7+

//先获取 Android 扩展
if (isAppExtension(mProject)) {
    android = mProject.extensions.findByName("android")
} else {
    android = null
}

//placeInMap 就是一个 Map<String, Object>
android.defaultConfig.manifestPlaceholders = placeInMap

AGP8+

val manifestPlaceholder = mapOf(
    "PRJID" to "333",
    "CHANNEL" to "222",
    "APPID" to "111",
    "APPKEY" to "123"
 )

private fun setManifestPlaceholders(
    project: Project,
    manifestPlaceholder: Map<String, String>
) {
    project.plugins.withType(AppPlugin::class.java) {
        val appAndroidExt =
            project.extensions.getByType(ApplicationAndroidComponentsExtension::class.java)
        appAndroidExt.onVariants { variant ->
        	//如果存在多个变体,会执行多次,可根据需要调整
            manifestPlaceholder.forEach { (k, v) ->
                CmdColorPrintUtils.outputGreen("添加 Manifest 参数:$k  ->  $v")
                variant.manifestPlaceholders.put(k, v)
            }
        }
    }
}

7. 获取所有依赖项

AGP7+

static void loadAddDependencies(Project project, DependenciesCallback callback) {
    def dp = new ArrayList()
    project.configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            String module = details.requested.module.group + ":" + details.requested.module.name + ":" + details.requested.version
            if (!dp.contains(module)) {
                dp.add(module)
            }
            callback.onResult(dp)
        }
    }
}

AGP8+

@JvmStatic
fun loadAddDependencies(project: Project, callback: DependenciesCallback) {
    val dp = ArrayList<String>()
    val androidExt =
        project.extensions.getByType(AndroidComponentsExtension::class.java)
    androidExt.onVariants { variants ->
        variants.components.forEach { component ->
            component.runtimeConfiguration.resolutionStrategy.eachDependency {
                val details = it as DefaultDependencyResolveDetails
                val module =
                    details.requested.module.group + ":" + details.requested.module.name + ":" + details.requested.version
               	//如果存在多个变体,会执行多次,可以去重
                if (!dp.contains(module)) {
                    dp.add(module)
                }
                callback.onResult(dp)
            }
        }
    }
}
Android软键盘系统深度解析:架构、原理与实现 Android软键盘系统深度解析:架构与实现原理 本文系统剖析了Android软键盘的核心工作机制。作为系统级输入服务,软键盘具有双重属性:既是可安装的独立应用,又深度集成于系统框架中。文章详细解读了软键盘的系统架构,包括其与InputMethodManagerService(IMMS)和WindowManagerService(WMS)的交互机制,以及通过InputConnection实现的跨进程通信流程。同时分析了输入法窗口的特殊管理策略、布局调整模式,并深入探讨了输入预测引擎的实现原理,包括词典加载、 阅读详情

相关推荐

手把手教你用Cesium和RayMarching实现逼真体积云(附完整Shader代码)

本文详细介绍了如何利用Cesium和RayMarching技术实现逼真的体积云效果,包括环境准备、核心逻辑、云层建模和光照增强等关键步骤,并提供了完整的Shader代码。通过噪声函数选型、动态风场模拟和多重散射近似等技术,开发者可以在数字地球可视化项目中创建沉浸式天气效果,显著提升场景的真实感。

weixin_29230649的博客 417

Android - kts文件配置应用签名

升级最新的AndroidStudio后,gradle配置文件从Groovy 迁移到 KTS,这里把自己配置应用签名遇到的问题及注意事项分享下。Google官方说明地址。

孔小乐的博客 6106

LangChain + PlayWright实战:5分钟搞定网页自动化测试(附完整代码)

本文详细介绍了如何利用LangChain与PlayWright构建智能网页自动化测试系统。通过环境配置、核心架构设计、实战Agent构建及性能优化等步骤,开发者可以快速实现高效的Web操作自动化,提升测试效率。文章还提供了完整代码示例和典型问题解决方案。

weixin_27791839的博客 240

Android Gradle 的配置从 Groovy 迁移到 KTS

虽然与 Groovy 相比,KTS 当前能更好地在 Android Studio 的代码编辑器中集成,但采用 KTS 的构建速度往往比采用 Groovy 慢,因此在迁移到 KTS 时应考虑构建性能。在kts中写法为:implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))。一个好的策略是首先对所有不明确的语句进行属性分配,然后通过将失败的语句转换为函数调用来修复构建。代码块指定的自定义存储库中提供的插件。

xiaowang_lj的博客 5451

Matlab Arduino 硬件支持包安装 MATLAB_Support_Package_for_Arduino_Hardware

Matlab Arduino硬件支持包离线安装

weixin_43283734的博客 2842

浅谈“无人机通感一体化(ISAC)”

总的来说,通信和感知一体化是一个循序渐进的过程,是未来一个比较有潜力的发展场景,当然,需要研究的内容有很多,面临的挑战也有很多,但是它值得我们去探索和学习!

m0_69182322的博客 4202

AGP7.0|kts 搞一个加固插件

每次都要手动使用工具去手动加固,非常麻烦,所以自己搞一个加固插件来提高生产力 开发环境使用的AGP7.0.2 ,相比较之前的版本,改动还是蛮大的,自己也踩了不少坑。 更多AGP7.0的内容可以关注一下虾哥的文章 掘金:https://juejin.cn/post/7056395437544046606 我们分为以下几步去完成: 获取apk产物 获取签名 获取加固工具 进行加固 获取APK AGP7获取apk 的方式跟以前也大不相同了 ,我们需要借助Variant API apk 来进行获取 Var

WangYilei0318的博客 1933

【OpenClaw从入门到精通】第34篇:医疗AI的“Agent OS”时代:基于WiseClaw构建医院专属智能体平台(2026实测版)

2026年医疗AI迈入实战落地新阶段,全球首个医疗OpenClaw平台WiseClaw正式发布,香港中文大学(深圳)医院完成业内首个私有化部署。本文基于真实医疗场景需求与公开技术资料,系统拆解医疗智能体平台的建设逻辑:从医疗Agent OS的五大核心特性切入,详解门诊病历质控、用药审查、医院运行管理三大临床场景的智能体搭建流程,提供完整的私有化部署代码、安全配置方案与实操演示。文章兼顾新手入门与进阶需求,严格遵循医疗合规要求,强调“只读不写+人工复核”原则,所有方案均经过虚拟实测验证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 788

Android Studio 2025 kts配置signingConfigs

例如使用同一个签名文件对debug包和release进行签名,方便覆盖操作。又或者是换了电脑之后直接覆盖debug包(如果默认签名,每个电脑签名文件不一样,导致换了电脑无法覆盖debug包)打包场景:如果想直接打包一个release的apk顺带安装到设备上,可以双击这个任务。有时候debug包体验不好,直接看release的结果一步到位。创建签名文件过程忽略,as可以直接创建一个。高版本as中使用kts配置默认签名文件。签名文件的位置如图,放项目根目录。打包正常点击as的run即可。

学习记录 637

如何给数据添加高斯白噪声?

首先测试集应该是加噪声的,至于训练集需不需要加噪声就见仁见智了。我个人测试的结果是,训练集如果不加噪声的话效果特别差,如果加噪声的话效果就比较好接受,大家可以自己试试看。在轴承故障研究中免不了要涉及到给数据主动加入噪声的情况,一般我们加的是高斯白噪声。由于热噪声是由大量自由电子的运动产生的,其统计特性服从高斯分布,故常将热噪声称为高斯白噪声。的频谱是均匀分布的,好像白光的频谱在可见光的频谱范围内均匀分布那样,所以热噪声又常称为。定义一:如果一个噪声,它的瞬时值服从。又是均匀分布的,则称它为高斯白噪声。

weixin_50642818的博客 5220

Android16 自定义HAL层适配一些VINTF和SELINUX问题修改

在RK里面一般权限矩阵在/rockchip/common/manifests/目录,我这版Android16的代码比较特殊,这里重点修改/device/rockchip/rockchip_generic/manifests/frameworks_compatibility_matrix.xml这个文件,不同的版本注册方式不同,在。hal_ruip_default.te,hal_ruip.te,attributes文件。拓展策略的方式添加,但是在Android16里面发现用不了。发现HAL层服务注册成功了。

tzj1058756809的博客 243

AGP 升级,适配 8.5 版本(一)

本次升级是从之前的 AGP7+ 升级到 AGP8+

Primer5 2839

《Scratch图形化等级考试(1~4级)历届真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国电子学会《全国青少年软件编程等级考试》Scratch图形化等级考试(1~4级)历届真题解析。🚀 订阅专栏:原价 99.9,🔥 火爆订阅中 🔥,限时 19.9。订阅后可阅读专栏内所有文章,本专栏持续更新中,欢迎订阅!

人生就是一个不断学习的过程 1万+

Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)

Failed to transform core-for-system-modules.jar to match attributes

crasowas的博客 9917

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

适配 AGP8.5 版本,字节码转换(二)

今日图片时间:2025.02.14 周五地点:深大地铁站。

Primer5 1080

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

适配 AGP8.5 版本,Transform(四)

支持的组件输出、输入类型支持的转换类型:(列举几个常用的)

Primer5 716

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android中AGP各个版本都有哪些特性以及升级时需要注意的问题

Android AGP各个版本的特性

liupengcaho的博客 2808

AGP 8.0 适配 ---- jvm target compatibility

这个属性与Gradle JDK的版本设置是不同的。AGP升级的过程,主要是Gradle JDK的版本的修改,所以为了尽量不影响代码功能,我们应该为java和kotlin代码指定具体的jvmTarget,这个Gradle JDK的升级,只需要适配编译脚本的jdk兼容性,而不需要考虑代码的jdk兼容性。Gradle JDK的选择决定了在构建过程中使用的Java版本。大家从上图可以看出,每次Android编译系统AGP的升级,尤其是大版本的变动,都会导致Jdk的升级,而jdk升级,很容易导致编译出错。

zhuzhumouse的专栏 3166

适配 AGP8.5 版本,版本依赖管理(五)

骑车吗,累了吗?到哪里都能躺下。

Primer5 333

AGP 8.5.1升级指南:解决Android 16K Page Size适配中的常见问题

本文详细解析了升级AGP 8.5.1以适配Android 16K Page Size的完整实战流程。针对动态库(.so文件)对齐问题,提供了从问题诊断、依赖溯源到分步修复的系统性解决方案,帮助开发者彻底攻克兼容性难题,确保应用在新设备上稳定运行。

resnet7explorer的博客 364

AGP 8.x vs AGP 9.x 稳定性对比, AGP 3.5.4项目迁移到 AGP 8.13

<think>我们根据要求:根据以下内容,生成≤150字的文章摘要。内容是关于AGP 8.x vs 9.x稳定性对比和迁移分析。需要提炼核心要点。注意字数限制。输出摘要。</think>AGP 8.13作为8.x最终版,经过两年迭代极其稳定,社区生态完善;而AGP 9.x虽为最新,但破坏性变更多、强制内置Kotlin,且第三方插件兼容性差。对纯Java项目,建议分步迁移至AGP 8.13(需改namespace、JDK 17、DSL等),暂缓升级9.x,待生态成熟后再考虑。

白高林的专栏 349

Android Studio中AGP 与 Gradle 的区别

在 Android Studio 中,(简称 AGP)与Gradle是两个紧密相关但不同的构建组件,它们之间有。

photoshopjava的博客 1879

【Gradle】AGP升级7.0及适配Replugin的多包名工程改造

随着AGP版本以及kotlin的普及,以及compose逐渐被大家接受,为了可以使用更多的新特性以及更好的性能,升级Android Gradle Plugin(AGP)以及Kotlin Gradle Plugin (KGP)已经是必不可少的步骤之一,其中AGP版本7.0、8.0的更新有较大的变化,本文会对自己的玩安卓项目进行AGP7.0的升级并且分享最近遇到的多包名工程化改造以及适配遇到的问题。

weixin_41802023的博客 3311

Arouter适配AGP 7.3.0版本

如何调试arouter 源码 arouter的代码 主要分为 3个部分,一个是基础的arouter-api包, 然后是注解处理器arouter-compile包 最后是arouter-register 这个包, 简单概述一下 这3个模块的具体作用吧arouter-api:99%的人使用arouter代码 都是直接用这个包下面的api,大部分用下注解就可以了arouter-compiler:这里是注...

Android技术之家 2031

Android Studio、AGP、Gradle 及 SDK 版本对应关系

Android开发涉及多个工具的版本协调,主要包括Android Studio、Gradle、AGP(Android Gradle Plugin)和SDK。AGP作为Gradle的专用插件,负责处理Android项目的特殊构建需求。各版本之间存在严格的对应关系。特定API级别也有最低工具版本要求。开发者需确保各组件版本匹配以避免兼容性问题。

自己在学习过程中的总结 752

适配 AGP8.5,构建参数 targetSdk 等配置(六)

找到这个 jar 使用 JADX 打开搜索设置 compileSdk 相似接口就发现了。对我们来说 AGP8+ 可能是新事物,这能这样慢慢摸索了,除非官方文档有相应的 demo。同样的,targetSdk、minSdk 你也可以这样寻找。设置 compileSdk 怎么找到。

Primer5 634
上一篇: Android:启动本地 http-server 加载 h5 游戏
下一篇: 适配 AGP8.5 版本,Transform(四)
Primer@.com
博客等级 码龄9年 524粉丝 292原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值