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

androidx 直接用是没有问题的,但我有个疑问 #818

Open
MRwangqi opened this issue May 15, 2020 · 2 comments
Open

androidx 直接用是没有问题的,但我有个疑问 #818

MRwangqi opened this issue May 15, 2020 · 2 comments

Comments

@MRwangqi
Copy link

看了 Arouter 的源码,我有一个疑问

在 RouterProcessor.java 中,获取 Fragment 的 RouteMeta 信息代码部分:

  } else if (types.isSubtype(tm, fragmentTm) || types.isSubtype(tm, fragmentTmV4)) {
                    logger.info(">>> Found fragment route: " + tm.toString() + " <<<");
                    routeMeta = new RouteMeta(route, element, RouteType.parse(FRAGMENT), null);
                } else {
                    throw new RuntimeException("ARouter::Compiler >>> Found unsupported class type, type = [" + types.toString() + "].");
                }

这段代码判断的是,Route 注解的类是否是 android.support.v4.app.Fragmentandroid.app.Fragment 的子类型,但我使用的是 androidx 下的 fragment,包名为 androidx.fragment.app.Fragment,实际上来说,是不匹配这个 FRAGMENT 的条件的,但在实际运行中,却是可以找到这个 Fragment,有疑惑呀。

上面的 Activity 的判断,在 androidx 下是没有问题的,虽然我们使用的 AppCompatActivity 是在 androidx.appcompat.app 包下,但他的父类查下去,依然是 android.app.Activity,所以,我比较怀疑的是 Fragment 的这个问题,谁能来解惑一下呀

@hellowmq
Copy link

hellowmq commented Jul 9, 2020

@MRwangqi 这应该是 Androidx 的 Android Gradle 插件的原因:

Arouter 的 dex 在这个插件的作用下被修改了。

android.support.v4.app.Fragment 被替换成 androidx.fragment.app.Fragment

这导致 types.isSubtype(tm, fragmentTmV4) 实际上在 dex 中的逻辑是 object instanceof androidx.fragment.app.Fragment,而这个条件是可以通过的。

android.enableJetifier:该标记设置为 true 时,Android 插件会通过重写其二进制文件来自动迁移现有的第三方库,以使用 AndroidX 依赖项。如果未指定,该标记默认为 false。

相关的参考链接如下:

AndroidX 概览
jetifier

@MRwangqi
Copy link
Author

MRwangqi commented Jul 10, 2020

@hellowmq 感谢回复,我看了下 jetifier 的源码部分和试验了一下,在 JetifyTransform 中,会对 jar、aar 的 Class 进行映射替换。我新建了一个 support 项目,写了 String FRAGMENT = "android.support.v4.app.Fragment" 并进行 androidx 项目的转换,jetifier 并不会对常量路径进行转换。

然后我我贴一下 Arouter 源码:

// Consts.FRAGMENT_V4 就直接替换成常量值吧
 TypeMirror fragmentTmV4 = elementUtils.getTypeElement(”android.support.v4.app.Fragment“).asType();

if (types.isSubtype(tm, type_Activity) || types.isSubtype(tm, fragmentTm) || types.isSubtype(tm, fragmentTmV4)) 
   // 做解析收集操作

如果要想 isSubtype 有效的话,则 fragmentTmV4 返回的就是 androidx.fragment,app.Fragment 了,但 getTypeElement 拿的是 support 的 Fragment,所以,还是有点疑惑在。

参考源码:https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-jetifier-release/jetifier/
参考文章: https://yuweiguocn.github.io/migrate-to-androidx/

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

No branches or pull requests

2 participants