变更最少的代码以保证应用可以仍能正常运行。
在运行 AndroidX 迁移工具后,大量的代码被变更,然而项目却无法编译成功。此时,我们仅仅做了最少量的工作来使应用重新运行起来。
这个方法有利于把流程拆解为可控的步骤。我们留下了一些任务,诸如修复导入顺序、提取依赖变量、减少完整 classpath 的使用,以便后续的清理工作。
刚开始出现的报错之一是重复的类 —— 像这种情况,PathSegment
:
Execution failed for task ‘:app:transformDexArchiveWithExternalLibsDexMergerForDebug’.
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
如何解决这个问题参考这里: https://developer.android.com/studio/build/dependencies#duplicate_classes.
Program type already present: androidx.core.graphics.PathSegment
这是一个由迁移工具生成错误依赖(androidx.core:core-ktx:0.3
)导致的报错。我们手动更新(参考这次提交)到正确的依赖版本(androidx.core:core-ktx:1.0.0
)。这个bug 已经在 Android Studio 3.3 Canary 9 及之后的版本被修复。我们指出这点是因为你或许在迁移过程中会遇到类似的问题。
接下来,Palette
API 在新版中变得可以为空,为了暂时避开(参考这次提交)这点,我们添加了!!
(非空断言操作符)。
然后我们遇到了一个 plusAssign
缺失的报错。这个加载在 1.0.0 版本中被移除。plusAssign
的使用被临时注释掉了(参考这次提交)。本文的后面我们会研究对 Palette
和 plusAssign
问题的可持续解决方案。
现在应用可以运行了,到清理代码的时候了!
清理代码
应用在运行中,但是我们的持续集成系统报告了代码提交后的构建错误:
Execution failed for task ‘:designernews:checkDebugAndroidTestClasspath’.
Conflict with dependency ‘androidx.arch.core:core-runtime’ in project ‘:designernews’.
Resolved versions for runtime classpath (2.0.0) and compile classpath (2.0.1-alpha01) differ. This can lead to runtime crashes.
To resolve this issue follow advice at https://developer.android.com/studio/build/gradle-tips#configure-project-wide-properties.
Alternatively, you can try to fix the problem by adding this snippet to /…/plaid/designernews/build.gradle:
dependencies {
implementation(“androidx.arch.core:core-runtime:2.0.1-alpha01”)
}
我们依照测试日志中的参考建议,添加了缺失的依赖模块(参考这次提交)。
我们也借此机会更新了我们的 Gradle 插件版本、Gradle wrapper 版本、Kotlin 版本(参考这次提交)。Android Studio 推荐我们安装 28.0.3 版本的构建工具,我们也照做了。在使用 Gradle 3.3.0-alpha13 版本插件时我们遇到的问题,通过降级到 3.3.0-alpha8 版本的方式得到解决。
迁移工具的一个缺点是:如果你在依赖版本项使用了变量,迁移工具把它们自动内联。我们从 build.gradle 文件中重新提取了这些版本(参考这次提交)。
上文中我们提到了运行 AndroidX 迁移工具后对 plusAssign
和 Palette
问题的临时解决方案。我们通过将 AndroidX 版本降低来重新添加了 plusAssign 函数和相关测试(参考这次提交),并且恢复了被注释了的代码。与此同时,我们把 Palette
参数更新到可以为空的这个版本(参考这次提交),这样就无需使用操作符 !!
。
同样的,自动转化可能使得某些类需要使用它们的完整类路径。做最少的手工修正是一个好的思路。作为清理工作的一部分,我们移除了完整类路径,并在必要时重新添加了相关引用。
最后,一些少量测试相关的修改被加入工程,围绕着测试过程中的依赖冲突(参考这次提交)和 Room 的测试用例(参考这次提交)。这时我们的工程完成全部转化,并且我们的测试都已通过。
结束过程
尽管遇到了一些障碍,AndroidX 的迁移进展得比较顺利。遇到的问题主要涉及依赖库或类的错误转换,以及新库中的 API 变化。 幸运的是这些都相对容易解决。Plaid 现在已经准备好再被用起来了!
如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。
最后
**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:
他们打算入行不是因为兴趣,而是因为所谓的IT行业工资高,或者说完全对未来没有任何规划。
刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。
技术提升遇到瓶颈了?缺高级Android进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!
来获取学习资料提升自己去挑战一下BAT面试难关吧
对于很多Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
最后祝各位新人都能坚持下来,学有所成。