Status Update
Comments
il...@google.com <il...@google.com>
an...@google.com <an...@google.com> #2
ap...@google.com <ap...@google.com> #3
Great! Thanks a lot, I'll look for the live updates soon!
il...@google.com <il...@google.com> #4
While -keepclassmembers
caused a regression in the allowsObfuscation
to allow even kept fragments to be obfuscated.
This will be available in the upcoming Fragment 1.2.4
and 1.3.0-alpha03
.
sa...@peilicke.de <sa...@peilicke.de> #5
The new release 1.2.4 now leads to a direct crash on app-start, i.e. when Android tries to inflate any Fragment referenced in the main navigation graph.
il...@google.com <il...@google.com> #6
Re #5 - please file a new bug with a sample project that reproduces your issue.
[Deleted User] <[Deleted User]> #7
This change in 1.2.4 also leads to ClassNotFoundException when a fragment is created by providing a name attribute to a FragmentContainerView if the referenced fragment class name is not explicitly kept and obfuscation is enabled:
<androidx.fragment.app.FragmentContainerView
...
android:name="fullClassName"
... />
This, of course, is the expected behavior, but I think it is too much of an API-breaking change for a patch release.
il...@google.com <il...@google.com> #8
Re #7 - please make sure you've followed the instructions in FragmentContainerView
referenced classes as per the
If you're using Android Gradle Plugin 4.1 Canary 4 or higher and you're not getting your classes properly kept and non-obfuscated when using FragmentContainerView
, please
sa...@peilicke.de <sa...@peilicke.de> #9
Re #6: It's essentially
aa...@gmail.com <aa...@gmail.com> #10
Thanks everyone
Description
Version used: androidx.fragment-fragment-1.2.2
Devices/Android versions reproduced on:
Either Android Gradle Plugin 3.5.3 or 3.6.0, build tools 28.0.3
Related (but not equivalent) issues:
Concerning the following consumer proguard rules we inherit:
# The default FragmentFactory creates Fragment instances using reflection
-if public class ** extends androidx.fragment.app.Fragment
-keep public class ** extends androidx.fragment.app.Fragment {
public <init>();
}
My understanding is that FragmentFactory requires R8 to be told that the default constructor to be kept, so it can be invoked via reflection. However I don't believe that requires the class' *name* to be kept, maybe I'm wrong here? A narrower rule that would meet the first requirement would be:
-keepclassmembers,allowobfuscation
Keeping the class name also keeps the package name the class is in, which also leads to greater portions an obfuscated app's internal directory structure appearing in clear text. (As a workaround we've often packaged Activities and Views separately and accepted that they're not well obfuscated, though it was a great convenience to us this was no longer the case with fragments). As a consequence, post-upgrade to 1.2.2 we notice many fragments and their directories appearing inside our app's APK, or by manual inspection of the mapping.txt