Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: 修复IDE中直接Run运行Host错误 #1360

Closed

Conversation

AntonioShare
Copy link
Contributor

环境变量的方式识别是否是Run构建的。
反之则是通过assemble任务构建的
#1263

环境变量的方式识别是否是Run构建的。
反之则是通过assemble任务构建的
@shifujun
Copy link
Collaborator

虽然经过仔细研究,还是决定不采用这个修复手段了。但还是非常感谢你贡献这个代码。

我查了一下idea.active这个属性的相关信息。验证了一下,它确实能反映当前是在IDE里执行的。
但是IDE其实不只是有一个Run按钮,还可以在Gradle任务列表里直接执行任务。这时是和命令行构建一样的。

所以这个PR应用之后,在IDE中直接执行installDebug,或者assembeDebug都反而会失败。

然后让ShadowPluginHelper依赖接入项目定义了apkDirName这么个变量也很不友好。

我本来试着在ShadowPluginHelper内部通过分析apk_ide_redirect_file来自动变化路径。
但没那么容易,这个package任务写的不太好,它假定了apk路径在配置期就确定了,所以没法在执行期修改这个路径。

想来想去,都已经把这个问题又拿起来研究了。就干脆写了一个复制的脚本 #1362,也算是解决了这个问题了。

还是感谢你贡献代码!

@shifujun shifujun closed this Dec 25, 2024
@AntonioShare
Copy link
Contributor Author

虽然经过仔细研究,还是决定不采用这个修复手段了。但还是非常感谢你贡献这个代码。

我查了一下idea.active这个属性的相关信息。验证了一下,它确实能反映当前是在IDE里执行的。 但是IDE其实不只是有一个Run按钮,还可以在Gradle任务列表里直接执行任务。这时是和命令行构建一样的。

所以这个PR应用之后,在IDE中直接执行installDebug,或者assembeDebug都反而会失败。

然后让ShadowPluginHelper依赖接入项目定义了apkDirName这么个变量也很不友好。

我本来试着在ShadowPluginHelper内部通过分析apk_ide_redirect_file来自动变化路径。 但没那么容易,这个package任务写的不太好,它假定了apk路径在配置期就确定了,所以没法在执行期修改这个路径。

想来想去,都已经把这个问题又拿起来研究了。就干脆写了一个复制的脚本 #1362,也算是解决了这个问题了。

还是感谢你贡献代码!

关于这个 PR 的设计,之所以选择使用 apkDirName 而没有采用 apk_ide_redirect_file 的方式,主要是基于以下几点考虑:

  1. 错误场景的范围
    这个问题主要出现在用户通过 IDE 执行任务时。因此,我们的解决方案希望能直接针对 IDE 环境进行处理,而非在任务执行阶段去动态调整路径。

  2. 未来兼容性
    假设后续 AGP(Android Gradle Plugin)版本更新了新的构建机制,若通过 hook 的方式解决问题,可能需要在每次 AGP 升级时都调整 hook 逻辑。而采用 idea.active 的形式,则能通过统一的入口设置 apk 输出路径。这样,即便后续 AGP 的输出路径规则有所改变,我们只需要在一个地方(如 build.gradle 中)调整路径配置即可,而不是重新适配任务 hook。

@shifujun
Copy link
Collaborator

我能理解到你关注的重点。可是idea.active并不是单纯反映点击工具栏上的Run按钮。你在IDE只直接执行Gradle任务也会有这个变量,而此时输出路径还是在outputs目录中,这和代码的逻辑不符。

解决这个问题的根本途径确实是去掉Shadow提供的那个打包的任务中对outputs目录的hardcode。它应该就简单的让用户传入一个路径。

我写的那个复制apk出来的修复呢,确实是dirty的。但我的目的仅仅是为了修复Shadow这个项目自身无法点Run运行的问题。它应该只会在Shadow自身这个项目升级自己的AGP版本时,需要重新兼容这个修复。这不是一个高频的操作。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants