Android强制类型转换报错,android常见错误记录--持续更新中

本文针对Android开发过程中常见的错误进行了解析,包括Glide版本兼容问题、RxJava配置冲突、Android 10文件访问权限、依赖库最小版本冲突、Gradle插件版本问题、Dialog显示异常及ClassCastException等问题,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1-Glide版本兼容问题

报错日志:

java.lang.NoSuchMethodError: No virtual method centerCrop()Lcom/bumptech/glide/request/RequestOptions; in class Lcom/bumptech/glide/request/RequestOptions;

报错原因:

Glide版本兼容问题,老的版本类RequestOptions没有centerCrop方法

解决:

更新版本

2-rxjava.properties文件重复

报错日志:

More than one file was found with OS independent path 'META-INF/rxjava.properties

解决:

在app下的build.gradle里面的defaultConfig里面添加:

defaultConfig {

packagingOptions {

exclude ‘META-INF/rxjava.properties’

}

}

3-android 10 访问文件

报错日志:

java.io.FileNotFoundException: open failed: EACCES (Permission denied)

解决:

请移步google文档

https://developer.android.com/training/data-storage/files/external-scoped#java

4-依赖库最小版本问题

报错日志:

Manifest merger failed : uses-sdk:minSdkVersion 11 cannot be smaller than version 14 declared in library

解决:

报错原因是moudle app gradle的minSdkVersion 比依赖库的低,修改minSdkVersion大于依赖库的minSdkVersion

5-classpath 'com.android.tools.build:gradle:'版本问题

报错日志:

Dex file with version ‘39’ cannot be used with min sdk level ‘25’.

解决:

classpath 'com.android.tools.build:gradle 适配版本

6-Dialog显示报错

报错日志:

android.view.WindowManager$BadTokenException:Unable to add window-token android.os.BinderProxy ;is your activity running?

报错原因:

例如:异步操作中,Activity已经退出,但是异步线程还没有执行完毕,如果此时异步线程通知主线程显示Dialog,将发生Dialog找不到可以依赖的Activity报错

解决:

Dialog在调用show或dismiss的时候,判断dialog所依赖的activity是否被销毁,否则将有可能发生这样的问题

7-java.lang.ClassCastException

报错原因:

该异常表示类型转换异常,通常是因为一个类对象转换为其他不兼容类对象抛出的异常

解决:

一般在强制类型转换时出现,例如如果A向B转换,而A不是B的父类时,将产生java.lang.ClassCastException异常。一般建议做这时要使用instanceof做一下类型判断,再做转换

常见场景:

android布局,ViewA的父布局是FrameLayout,这个时候如果在代码中给ViewA设置LayoutParams的类型不是FrameLayout会报错

如果有幸帮到你,请动动小手支持一下!

<think>我们面对的是两个主要问题: 1. NFC服务启动失败,SELinux错误提示:无法为aidl服务执行ctl.interface_start,并指出文件标签或域转换问题。 2. 编译错误:未知类型android_hardware_nfc_infc_service。 根据错误信息,我们需要: - 修正SELinux策略以允许服务启动 - 确保在SELinux策略中正确定义了服务类型 ### 解决步骤: #### 1. **诊断SELinux拒绝详情** 首先需要获取确切的SELinux拒绝日志。在设备上执行: ```shell adb shell "dmesg | grep avc" > avc_denials.txt ``` 查找与nfc相关的拒绝条目,例如: ``` avc: denied { execute } for pid=426 comm="init" name="android.hardware.nfc2-service.nxp" dev="dm-0" ino=12345 scontext=u:r:init:s0 tcontext=u:object_r:vendor_file:s0 tclass=file permissive=0 ``` [^1] #### 2. **修正SELinux策略** 根据拒绝日志,我们需要在设备SELinux策略中添加规则。 - **问题1:init域无法执行NFC服务二进制文件** 在`init.te`文件中添加: ```te # 允许init执行NFC服务二进制文件 allow init vendor_file:file execute; ``` 但更安全的做法是为NFC服务创建独立的域,并允许init域自动转换到该域。 - **为NFC服务创建新域** 在`/device/<vendor>/<device>/sepolicy`目录中操作: - 创建或修改`file_contexts`,为二进制文件设置正确的标签: ``` /vendor/bin/hw/android\.hardware\.nfc2-service\.nxp u:object_r:nfc_hal_default_exec:s0 ``` - 创建`nfc_hal_default.te`域文件: ```te type nfc_hal_default, domain; type nfc_hal_default_exec, exec_type, vendor_file_type, file_type; init_daemon_domain(nfc_hal_default) # 允许域访问必要的资源 allow nfc_hal_default nfc_device:chr_file { open read write }; allow nfc_hal_default self:capability net_admin; ... ``` - 在`service_manager.te`中允许查找和添加服务: ```te allow nfc_hal_default android_hardware_nfc_infc_service:service_manager { add find }; ``` - **解决编译错误:未知类型android_hardware_nfc_infc_service** 这个错误通常是因为策略中缺少类型定义。在`service_contexts`文件中添加: ``` android.hardware.nfc.INfc/default u:object_r:android_hardware_nfc_infc_service:s0 ``` 然后在`service.te`中定义该类型: ```te type android_hardware_nfc_infc_service, service_manager_type; ``` #### 3. **验证服务启动脚本** 检查`/vendor/etc/init/android.hardware.nfc2-service.nxp.rc`文件内容: ```rc service nxp_nfc_hal /vendor/bin/hw/android.hardware.nfc2-service.nxp class hal user nfc group nfc capabilities NET_ADMIN rlimit rtprio 10 10 shutdown critical ``` #### 4. **编译和刷写** 修改策略后重新编译系统: ```shell source build/envsetup.sh lunch <device>-userdebug make sepolicy # 如果修改了rc文件或二进制文件,可能需要重新编译整个镜像 make -j$(nproc) ``` 然后将新编译的`sepolicy`刷入设备: ```shell adb push out/target/product/<device>/vendor/etc/selinux /vendor/etc/selinux adb reboot ``` #### 5. **调试技巧** - 临时禁用SELinux强制模式: ```shell adb shell setenforce 0 ``` - 检查服务状态: ```shell adb shell service list | grep nfc adb shell getprop | grep nfc ``` ### 相关问题 1. 如何为Android HAL服务创建正确的SELinux域? 2. Android init进程启动服务时如何配置SELinux域转换? 3. 如何调试Android系统中的SELinux拒绝问题? 4.Android中,如何为AIDL HAL服务定义service_contexts? 5. 如何修复Android编译过程中的SELinux策略类型未定义错误? [^1]: Android SELinux策略调试指南</think>### Android NFC服务启动失败与SELinux配置修复方案 针对您遇到的NFC服务启动失败和编译错误问题,以下是完整的解决流程: --- #### 1. **诊断核心问题** 根据错误日志分析: ```log Could not ctl.interface_start for &#39;aidl/android.hardware.nfc.INfc/default&#39; File has incorrect label or no domain transition unknown type android_hardware_nfc_infc_service compilation error ``` 这表明存在两个关键问题: 1. SELinux策略阻止NFC服务启动(域转换失败) 2. 策略编译时缺少类型定义(android_hardware_nfc_infc_service未声明) --- #### 2. **修复SELinux策略文件** 在设备源码中修改以下文件(路径:`device/<vendor>/<device>/sepolicy`): **a. 添加缺失的类型定义**(解决编译错误) 在`service.te`文件中添加: ```te type android_hardware_nfc_infc_service, service_manager_type; ``` **b. 配置域转换规则**(解决启动失败) 在`init.te`文件中添加: ```te # 允许init域启动NFC服务 allow init nfc_hal_default_exec:file { execute_no_trans }; ``` **c. 设置文件标签** 在`file_contexts`中确保二进制文件正确标记: ```te /vendor/bin/hw/android\.hardware\.nfc.*-service.* u:object_r:nfc_hal_default_exec:s0 ``` **d. 创建策略规则**(新建`nfc_hal_default.te`) ```te # 允许访问NFC设备节点 allow nfc_hal_default nfc_device:chr_file { open read write }; # 允许注册服务 allow nfc_hal_default android_hardware_nfc_infc_service:service_manager { add }; # 允许与硬件交互 allow nfc_hal_default hardware_nfc:dir search; allow nfc_hal_default hardware_nfc:file r_file_perms; ``` --- #### 3. **修正服务启动脚本** 检查`/vendor/etc/init/android.hardware.nfc-service.rc`,确保包含: ```rc service nfc_hal /vendor/bin/hw/android.hardware.nfc-service class hal user nfc group nfc capabilities NET_ADMIN seclabel u:r:nfc_hal_default:s0 # 关键:指定安全上下文 shutdown critical ``` --- #### 4. **编译与部署** ```shell # 编译SELinux策略 make sepolicy # 推送新策略到设备 adb push out/target/product/<device>/vendor/etc/selinux /vendor/etc/selinux # 重启设备 adb reboot ``` --- #### 5. **验证修复** ```shell # 检查服务状态 adb shell service check nfc # 查看SELinux日志 adb shell "cat /proc/kmsg | grep -E &#39;avc:|nfc&#39;" ``` 预期成功输出: ```log Service nfc: found avc: granted { execute } for scontext=u:r:init:s0... ``` --- #### 6. **调试技巧** - **临时关闭SELinux**(仅调试): ```shell adb shell setenforce 0 ``` - **检查服务注册**: ```shell adb shell service list | grep nfc ``` - **查看进程上下文**: ```shell adb shell "ps -Z | grep nfc" ``` > **注意**:所有策略修改后需重新编译系统镜像。如果使用AOSP,需执行`make -j$(nproc)`完整编译[^1]。 --- ### 相关问题 1. 如何解析Android SELinux的avc denied日志中的类型和权限? 2. Android Treble架构下HAL服务的SELinux策略有哪些特殊要求? 3. 调试Android硬件服务启动失败的系统工具有哪些? 4. 如何为自定义硬件服务编写正确的.rc启动脚本? 5. Android系统服务注册失败(ServiceManager)的常见原因有哪些? [^1]: Android SELinux策略开发指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值