Xamarin安卓项目重命名后出现APT2008编译错误求助
解决Xamarin Android重命名后APT2008类名无效错误
刚踩过类似的坑,给你梳理清楚问题根源和解决步骤:
核心问题拆解
从你给出的错误日志、清单代码和C#类来看,三个关键点触发了APT2008错误:
- 类名大小写不匹配:你在
Service特性里写的com.my-domain.sub.android.activiteservice是全小写,但实际类名是ActiviteService(驼峰命名)——Java对类名大小写是严格区分的,系统根本找不到这个类。 - 相对类名的包上下文失效:清单里的
.ActiviteService是相对路径,依赖于Android项目的根包名,但你重命名解决方案后,项目的包名大概率和类所在的命名空间脱节了,导致相对路径指向错误。 - 自动生成的接收器类不匹配:那个
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
相关产品推荐
相关产品推荐

