Xamarin.Android如何正确排除库不参与链接以解决动画异常问题
解决方案
你可以尝试以下几个针对性方案解决链接裁剪失效问题:
- 直接在项目csproj文件中配置硬编码链接跳过规则
不要依赖IDE可视化配置的参数,直接在对应构建配置的PropertyGroup节点下添加如下节点,注意程序集名称区分大小写:
保存后清空项目bin、obj目录再重新编译,验证规则是否生效。<AndroidLinkSkip>tk.supernovaic.MaterialSearchBar;Xamarin.AndroidX.AppCompat;Xamarin.AndroidX.ConstraintLayout;Xamarin.AndroidX.RecyclerView;Xamarin.AndroidX.CardView</AndroidLinkSkip> - 新增Xamarin专属链接器描述文件
你之前配置的ProGuard规则仅作用于Java字节码裁剪,Xamarin的托管代码裁剪由专属链接器控制,你需要在主项目根目录新建LinkerDescription.xml文件,内容如下:
右键点击该文件,将「生成操作」设置为<?xml version="1.0" encoding="utf-8" ?> <linker> <!-- 完全保留自定义搜索栏库所有内容 --> <assembly fullname="tk.supernovaic.MaterialSearchBar"> <type fullname="*" preserve="all" /> </assembly> <!-- 保留依赖的AndroidX库核心内容 --> <assembly fullname="Xamarin.AndroidX.AppCompat"> <type fullname="*" preserve="all" /> </assembly> <assembly fullname="Xamarin.AndroidX.ConstraintLayout"> <type fullname="*" preserve="all" /> </assembly> <assembly fullname="Xamarin.AndroidX.RecyclerView"> <type fullname="*" preserve="all" /> </assembly> <assembly fullname="Xamarin.AndroidX.CardView"> <type fullname="*" preserve="all" /> </assembly> <!-- 保留动画相关所有类型 --> <assembly fullname="Mono.Android"> <type fullname="Android.Animation.*" preserve="all" /> </assembly> </linker>LinkDescription,再重新编译即可。 - 强制保留动画资源引用
在自定义搜索栏控件的静态构造函数中,强行引用所有用到的动画资源ID,让链接器识别到资源被使用,不会被误裁剪:static MaterialSearchBar() { // 强行引用所有动画资源,避免被裁剪 _ = Resource.Animator.back_to_menu_morph; _ = Resource.Animator.back_to_menu_rotation; _ = Resource.Animator.menu_to_back_morph; _ = Resource.Animator.menu_to_back_rotation; _ = Resource.Anim.fade_in_left; _ = Resource.Anim.fade_in_right; _ = Resource.Anim.fade_out; _ = Resource.Anim.fade_out_left; } - 全量编译避免缓存异常
部分场景下增量编译会导致资源裁剪缓存不更新,可在csproj中添加如下配置强制全量处理资源:
每次编译前手动清空bin、obj目录后再构建即可。<PropertyGroup> <AndroidUseAapt2>True</AndroidUseAapt2> <AndroidResgenExtraArgs>--no-crunch</AndroidResgenExtraArgs> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Federico Navarrete
相关产品推荐
相关产品推荐

