Commit 55fa709
[Xamarin.Android.Build.Tasks] default proguard rules for BroadcastReceiver (#4178)
Fixes: #4110
A crash was reported when using either Proguard or R8:
java.lang.RuntimeException: Unable to get provider mono.MonoRuntimeProvider_1: java.lang.ClassNotFoundException: Didn't find class "mono.MonoRuntimeProvider_1" on path: DexPathList[[zip file "/data/app/myApp-61Sw26LCrQQYfOvCs2GsDw==/base.apk"],nativeLibraryDirectories=[/data/app/myapp-61Sw26LCrQQYfOvCs2GsDw==/lib/arm64, /data/app/myapp-61Sw26LCrQQYfOvCs2GsDw==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
at android.app.ActivityThread.installProvider(ActivityThread.java:7152)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:6630)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6525)
at android.app.ActivityThread.access$1400(ActivityThread.java:220)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1883)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7520)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.ClassNotFoundException: Didn't find class "mono.MonoRuntimeProvider_1" on path: DexPathList[[zip file "/data/app/myapp-61Sw26LCrQQYfOvCs2GsDw==/base.apk"],nativeLibraryDirectories=[/data/app/myapp-61Sw26LCrQQYfOvCs2GsDw==/lib/arm64, /data/app/myapp-61Sw26LCrQQYfOvCs2GsDw==/base.apk!/lib/arm64-v8a, /system/lib64, /system/product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:230)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.AppComponentFactory.instantiateProvider(AppComponentFactory.java:147)
at android.app.ActivityThread.installProvider(ActivityThread.java:7136)
This could be reproduced in a new project, just by enabling a Code
Shrinker and adding a `BroadcastReceiver`:
[BroadcastReceiver(Process = ":remote", Name = "foo.MyReceiver")]
public class MyReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent) { }
}
This generated a file in:
obj\Release\100\android\src\mono\MonoRuntimeProvider_1.java
We have no default proguard rule in `proguard_xamarin.cfg` that would
cover inclusion of this Java class for ProGuard or R8.
We can simply add a trailing `*` to the Java class name of an existing
rule:
-keep class mono.MonoRuntimeProvider* { *; <init>(...); }
I also added a test for this scenario that will verify ProGuard & R8.1 parent 1524e6e commit 55fa709
File tree
2 files changed
+16
-1
lines changed- src/Xamarin.Android.Build.Tasks
- Resources
- Tests/Xamarin.Android.Build.Tests
2 files changed
+16
-1
lines changedLines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
Lines changed: 15 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3607 | 3607 | | |
3608 | 3608 | | |
3609 | 3609 | | |
| 3610 | + | |
| 3611 | + | |
| 3612 | + | |
| 3613 | + | |
| 3614 | + | |
| 3615 | + | |
| 3616 | + | |
| 3617 | + | |
| 3618 | + | |
| 3619 | + | |
| 3620 | + | |
| 3621 | + | |
| 3622 | + | |
3610 | 3623 | | |
3611 | 3624 | | |
3612 | 3625 | | |
| |||
3691 | 3704 | | |
3692 | 3705 | | |
3693 | 3706 | | |
| 3707 | + | |
| 3708 | + | |
3694 | 3709 | | |
3695 | 3710 | | |
3696 | 3711 | | |
| |||
0 commit comments