You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Android如何正确排除库不参与链接以解决动画异常问题

解决方案

你可以尝试以下几个针对性方案解决链接裁剪失效问题:

  • 直接在项目csproj文件中配置硬编码链接跳过规则
    不要依赖IDE可视化配置的参数,直接在对应构建配置的PropertyGroup节点下添加如下节点,注意程序集名称区分大小写:
    <AndroidLinkSkip>tk.supernovaic.MaterialSearchBar;Xamarin.AndroidX.AppCompat;Xamarin.AndroidX.ConstraintLayout;Xamarin.AndroidX.RecyclerView;Xamarin.AndroidX.CardView</AndroidLinkSkip>
    
    保存后清空项目bin、obj目录再重新编译,验证规则是否生效。
  • 新增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中添加如下配置强制全量处理资源:
    <PropertyGroup>
      <AndroidUseAapt2>True</AndroidUseAapt2>
      <AndroidResgenExtraArgs>--no-crunch</AndroidResgenExtraArgs>
    </PropertyGroup>
    
    每次编译前手动清空bin、obj目录后再构建即可。

内容的提问来源于stack exchange,提问作者Federico Navarrete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:54:00