升级API33后Xamarin.Android应用DeepLink失效:无法找到MainActivity
解决方案
1. 移除AndroidManifest.xml中手动声明的MainActivity条目
Xamarin.Android会通过Activity特性自动生成对应的Manifest条目,你手动添加的.MainActivity条目会和自动生成的条目冲突,导致出现两个不同类名的MainActivity(一个是你写的.MainActivity,另一个是Xamarin自动生成的crc64xxxx.MainActivity),这是异常的核心原因。
删除Manifest中这段代码:
<activity android:name=".MainActivity" android:exported="true"> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW"/> ... </intent-filter> </activity>
2. 在MainActivity的特性中显式指定类名、Exported属性及IntentFilter
把IntentFilter直接通过特性添加到MainActivity上,同时指定固定的类名,避免Xamarin自动生成crc64前缀的类名:
[Activity( ScreenOrientation = ScreenOrientation.Portrait, NoHistory = true, MainLauncher = true, Name = ".MainActivity", // 显式指定类名,和DeepLink期望的一致 Exported = true)] // API33要求有IntentFilter的Activity必须显式设置Exported=true [IntentFilter( new[] { Android.Content.Intent.ActionView }, AutoVerify = true, DataSchemes = new[] { "your-deeplink-scheme" }, // 替换成你的DeepLink Scheme DataHost = "your-deeplink-host", // 替换成你的DeepLink Host Categories = new[] { Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable })] public class MainActivity : AppCompatActivity { ... }
3. 清理并重建项目
- 右键项目 → 清理
- 删除项目根目录下的
bin和obj文件夹 - 重新生成解决方案,确保Manifest是Xamarin自动生成的正确版本
4. 调整ProGuard/R8配置(如果启用)
如果你的项目启用了代码混淆,添加以下规则避免MainActivity被混淆:
-keep class PACKAGENAME.MainActivity { *; }
将PACKAGENAME替换成你的应用实际包名。
问题说明
日志中出现的crc645ff435851f1c2612.MainActivity是Xamarin自动生成的类名,当你没有通过Name特性指定固定类名时,Xamarin会为了避免类名冲突生成带crc64前缀的类名,而你手动在Manifest中声明的是.MainActivity,导致DeepLink的Intent找不到正确的Activity,同时触发ClassNotFoundException。
内容的提问来源于stack exchange,提问作者Pavel Derevyankin
相关产品推荐
相关产品推荐

