Tencent / tinker

Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Other
17.18k stars 3.33k forks source link

Gradle sync failed with AGP 7.1.1 #1634

Open HardFatal opened 2 years ago

HardFatal commented 2 years ago

AGP 升级到 7.0 以上gradle sync失败。

异常类型:编译异常 tinker版本:如: 1.9.14.18 gradle版本:如:7.2

  1. 升级tinker-sample-android中gradle相关版本 tinker-sample-android/build.gradle classpath 'com.android.tools.build:gradle:3.5.3' 改为 classpath 'com.android.tools.build:gradle:7.1.1'

tinker-sample-android/gradle/wrapper/gradle-wrapper.properties distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip 改为 distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip

  1. 修改android AGP 7.0 不兼容的gradle配置
  2. 点击gradle sync
  3. sync 失败

Caused by: com.android.build.gradle.internal.dsl.AgpDslLockedException: It is too late to modify additionalParameters It has already been read to configure this project. Consider either moving this call to be during evaluation, or using the variant API. at com.android.build.gradle.internal.dsl.decorator.LockableList.add(LockableList.kt:83) at com.android.build.gradle.internal.dsl.AaptOptions.additionalParameters(AaptOptions.java:166) at com.android.build.api.dsl.AndroidResources$additionalParameters.call(Unknown Source) at com.tencent.tinker.build.gradle.task.TinkerResourceIdTask.injectStableIdsFileOnDemand(TinkerResourceIdTask.groovy:90) at com.tencent.tinker.build.gradle.task.TinkerResourceIdTask$injectStableIdsFileOnDemand.call(Unknown Source) at com.tencent.tinker.build.gradle.TinkerPatchPlugin$_apply_closure1.doCall(TinkerPatchPlugin.groovy:132)

nsacer commented 2 years ago

AGP7.0在版本1.9.14.19才支持的。升级吧。

cocpublic commented 2 years ago

1.9.14.19也不行,更新说明说是支持了AGP7、R8,实测并没有解决,除了这两个问题外还有一个Manifest钟tinkerid更新的问题

nsacer commented 2 years ago

1.9.14.19也不行,更新说明说是支持了AGP7、R8,实测并没有解决,除了这两个问题外还有一个Manifest钟tinkerid更新的问题

你新建项目接入试试,我已经成功接入了。

cocpublic commented 2 years ago

AGP7.0在版本1.9.14.19才支持的。升级吧。

你接入1.9.14.19、Gradle 7.0后,开启固定资源ID,没有遇到too late to modify additionalParameter的问题吗? 看源码逻辑 可以手动在build.gradle中指定aaptOptions.additionalParameters可以临时解决,暂未验证

还有这个开启R8的问题,R8 outlining 与 Tinker 存在兼容性问题 ,AGP7强制开启R8,如果使用,暂时可以在混淆规则中禁用优化,可临时解决-dontoptimize

还有一个随机出现的TinkerId未更新的问题,没遇上吗 , tinkerProcessManifest任务修改的目录是processManifest的产物目录build/intermediates/merged_manifests,在这里追加tinkerId,agp4.1后在processManifest新增的processManifestForPackage,产物目录是build/intermediates/packaged_manifests ,如果processManifestForPackage执行的比tinkerProcessManifest快,最后打进apk的AndroidManifest.xml中tinkerid并不是最新的。 我看源码里面只是声明了 tinkerProcessManifest 在processManifest的后面执行,并没有声明与processManifestForPackage的时序。 目前我是新加了一些代码,让processManifestForPackage 在tinkerProcessManifest之后执行解决的。

这几个问题,我解决方案都比较挫,大佬你们都是咋处理的?

huhuang03 commented 2 years ago

但是com.tencent.bugly.tinker-support。这个插件只支持AGP4。有没有办法使用AGP7呢。不用com.tencent.bugly.tinker-support而是使用com.tencent.tinker.patch吗。我想用bugly管理,不使用bugly提供的插件有影响吗

cocpublic commented 2 years ago

参考tinker-support的代码逻辑,我们自实现了一套逻辑,无痕替换了tinker-support。上面提到的问题除了R8外,其他固定资源Id、TinkerId未更新等问题刚适配了。 关于R8,目前打算把minifyEnabled 改为false,禁用掉R8,单独使用proguard提供的插件进行混淆。https://www.guardsquare.com/blog/using-proguard-with-the-android-gradle-plugin

huhuang03 commented 2 years ago

你们用bugly管理后台管理补丁包吗。tinker-support代码都没有开源啊。。你们反编译做的吗。这要不少的工作量吧。有点想弃坑,用sophix了。。。

huhuang03 commented 2 years ago

我刚看到文档,原来生成MF文档 这里有介绍tinker-support的工作产出。按照这个写的吧。

Aracoix commented 2 years ago

参考tinker-support的代码逻辑,我们自实现了一套逻辑,无痕替换了tinker-support。上面提到的问题除了R8外,其他固定资源Id、TinkerId未更新等问题刚适配了。 关于R8,目前打算把minifyEnabled 改为false,禁用掉R8,单独使用proguard提供的插件进行混淆。https://www.guardsquare.com/blog/using-proguard-with-the-android-gradle-plugin

老铁实现tinker-support有开源的么,不会写插件

wxy2016 commented 2 years ago

FAILURE: Build completed with 3 failures.

1: Task failed with an exception.

==============================================================================

2: Task failed with an exception.

==============================================================================

3: Task failed with an exception.

==============================================================================

yanbober commented 2 years ago

1.9.14.19也不行,更新说明说是支持了AGP7、R8,实测并没有解决,除了这两个问题外还有一个Manifest钟tinkerid更新的问题

你新建项目接入试试,我已经成功接入了。

提交了 pr,官方一直没收录,解决 tinker id 不更新问题 https://github.com/Tencent/tinker/pull/1550

yanbober commented 2 years ago

AGP7.0在版本1.9.14.19才支持的。升级吧。

你接入1.9.14.19、Gradle 7.0后,开启固定资源ID,没有遇到too late to modify additionalParameter的问题吗? 看源码逻辑 可以手动在build.gradle中指定aaptOptions.additionalParameters可以临时解决,暂未验证

还有这个开启R8的问题,R8 outlining 与 Tinker 存在兼容性问题 ,AGP7强制开启R8,如果使用,暂时可以在混淆规则中禁用优化,可临时解决-dontoptimize

还有一个随机出现的TinkerId未更新的问题,没遇上吗 , tinkerProcessManifest任务修改的目录是processManifest的产物目录build/intermediates/merged_manifests,在这里追加tinkerId,agp4.1后在processManifest新增的processManifestForPackage,产物目录是build/intermediates/packaged_manifests ,如果processManifestForPackage执行的比tinkerProcessManifest快,最后打进apk的AndroidManifest.xml中tinkerid并不是最新的。 我看源码里面只是声明了 tinkerProcessManifest 在processManifest的后面执行,并没有声明与processManifestForPackage的时序。 目前我是新加了一些代码,让processManifestForPackage 在tinkerProcessManifest之后执行解决的。

这几个问题,我解决方案都比较挫,大佬你们都是咋处理的?

提交了 pr,官方一直没收录,解决 tinker id 不更新问题 https://github.com/Tencent/tinker/pull/1550

eric-lian commented 2 years ago

问题是 ,你怎么保证 基础包和 patch包混淆一直那 ?

eric-lian commented 2 years ago

我自己试了一下 , 如果开启混淆 ,只添加 -dontoptimize 生成的patch 很会很大 , 目前发现要想解决只能禁用混淆 , 添加 -dontobfuscate

ysavr commented 2 years ago

我自己试了一下 , 如果开启混淆 ,只添加 -dontoptimize 生成的patch 很会很大 , 目前发现要想解决只能禁用混淆 , 添加 -dontobfuscate

hallo, where do you add -dontoptimize and -dontobfuscate ?