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

Xamarin安卓项目重命名后出现APT2008编译错误求助

解决Xamarin Android重命名后APT2008类名无效错误

刚踩过类似的坑,给你梳理清楚问题根源和解决步骤:

核心问题拆解

从你给出的错误日志、清单代码和C#类来看,三个关键点触发了APT2008错误:

  1. 类名大小写不匹配:你在Service特性里写的com.my-domain.sub.android.activiteservice是全小写,但实际类名是ActiviteService(驼峰命名)——Java对类名大小写是严格区分的,系统根本找不到这个类。
  2. 相对类名的包上下文失效:清单里的.ActiviteService是相对路径,依赖于Android项目的根包名,但你重命名解决方案后,项目的包名大概率和类所在的命名空间脱节了,导致相对路径指向错误。
  3. 自动生成的接收器类不匹配:那个crc6426b0443894528d3f.BlockCalls是Xamarin自动生成的绑定类,重命名后程序集信息变化,导致生成的类名和清单里的引用对不上。

分步解决办法

1. 修正Service特性的类名大小写

先把C#类里的Service特性改成和类名一致的驼峰格式,同时确保包名和你的命名空间对应:

namespace Sub.Droid 
{
    // 把activiteservice改成ActiviteService,和类名保持一致
    [Service(Name = "com.my-domain.sub.android.ActiviteService")] 
    class ActiviteService : Service 
    {
        // ... 你的业务代码
    }
}

2. 统一清单里的服务引用

别再混用相对路径和绝对路径,直接用和特性里一致的绝对类名替换清单里的服务标签,还能合并重复的注册:

<application android:label="Link" android:icon="@drawable/logo">
    <!-- 合并所有属性,用绝对类名注册 -->
    <service 
        android:enabled="true" 
        android:name="com.my-domain.sub.android.ActiviteService" 
        android:exported="false" 
        android:directBootAware="true" />
</application>

3. 修复BlockCalls接收器的自动生成问题

那个crc64xxxx.BlockCalls是Xamarin为你的广播接收器生成的包装类,你需要手动指定它的类名:

  • 先给BlockCalls类加上BroadcastReceiver特性并指定全限定类名:
    [BroadcastReceiver(Name = "com.my-domain.sub.android.BlockCalls")]
    public class BlockCalls : BroadcastReceiver
    {
        // ... 你的接收器代码
    }
    
  • 然后替换清单里的接收器标签,用你指定的绝对类名:
    <receiver android:name="com.my-domain.sub.android.BlockCalls">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>
    

4. 彻底清理重建项目

做完上面的修改后,执行更彻底的清理操作(普通清理可能残留缓存):

  • 右键解决方案 → 清理解决方案
  • 手动删除每个项目下的bin、obj、debug文件夹
  • 关闭Visual Studio,删除项目根目录的.vs隐藏文件夹(Windows环境)
  • 重新打开解决方案,右键项目 → 生成(先别用重建,生成更稳妥)

额外检查项

  • 确认Android项目的包名(项目属性→Android Manifest里的Package name)和你在特性、清单里用的包名前缀完全一致
  • 检查所有自定义组件(Activity、Service、Receiver等)的特性,确保Name属性都是正确的全限定类名,大小写无差错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:57:55