-
Notifications
You must be signed in to change notification settings - Fork 584
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
Dynamic feature module support #109
Comments
使用 0.27.1 版本尝试了一下,第一次的时候编译没有问题,但是如果只在 application module 里面使用了 booster 插件,还是扫不到 dynamic feature 的代码,看了下实现是直接把 BoosterAppTransform 的 scopes 改成了 FULL_PROJECT,而 BoosterFeatureTransform 的 scopes 则是FULL_WITH_FEATURE。后来再重新试了一下,发现BoosterAppTransform的 scopes 又改回 FULL_WITH_FEATURE,这时候又会出现之前的编译错误(com.android.build.api.transform.TransformException: com.android.tools.r8.utils.FeatureClassMapping$FeatureMappingException)。看了一下这个错误,是因为base.jar 里面包含了 dynamic-feature.jar 的类,所以在 transformDexWithDexSplitterForDebug 会出现类重复的编译错误。 之前说 Transform 使用了 FULL_WITH_FEATURE的 scopes 后,要打开了混淆之后才能扫到dynamic feature 的类,是因为下面的代码:
只有满足 variantScope.consumesFeatureJars() || variantScope.getNeedsMainDexListForBundle()条件才会把 dynamic feature 添加到 Transform 的输入,而条件一则需要打开混淆才为 true,条件二则需要打开 multi dex。因此在 debug 版本没有打开混淆的情况下,即使使用了FULL_WITH_FEATURE 的 scopes 也扫不到 dynamic feature 的类。 而 3.2.1 不会出现上面的编译错误,3.5.1 会,则是由于因为下面的代码:
对比两个版本的代码可以知道,3.2.1 只有在 dynamic feature module 上 才会使用 MergeClassesTransform,而 3.5.1 则在base module 也有可能使用。前面提到的 base.jar 就是由 MergeClassesTransform 生成的。看了下 MergeClassesTransform 的实现,它只会通过 getReferencedScopes (FULL_PROJECT)读取 class 输入,并打包成 jar 输出到其他目录,不影响 Transform 的流程(Regarding Streams, this is a no-op transform as it does not write any output to any stream) 。既然它的 scopes 是 FULL_PROJECT,那它生成的 base.jar 为什么会包含 dynamic feature module 的类呢。原因如下:
这里是生成 Referenced streams 的地方,从注释可以知道,streams 可能会包含多于 Transform 所声明的,对应到我们这里的情况就是多出了 dynamic feature 的 stream。而MergeClassesTransform直接把所有的Referenced inputs (streams)都打到 jar 包里面去,所以 base.jar 就包含了 dynamic feature module 的代码。 针对上面的两个问题,我自己想到的解决办法是:
不过感觉上面的两个方法都不是很优雅,抛出来大家讨论一下看有没有更好的方法~ |
|
这样可以看到 dynamic feature 模块下的 classes ./gradlew :app:bundleDebug --info |
|
@Yang-yongwen 上述的问题你是采用的方案2解决的吗? |
在 Booster v4.16+ 对于 Dynamic Feature 模块的支持有可行的方案吗? |
No description provided.
The text was updated successfully, but these errors were encountered: