without permission not exported from uid

本文记录了一次在Android开发过程中遇到的服务权限冲突问题及其解决过程。作者在一个已上线项目的调试过程中发现了由于两个应用注册了相同名称的服务而导致的安全异常,并通过删除其中一个应用解决了问题。

今天把以前的一个项目导入到工程中,调试一翻很满意之后,运行,发现报错,报错信息如下

01-16 09:45:32.870: E/AndroidRuntime(17685): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bxlt.android.aims.activity/com.bxlt.android.aims.activity.LoginActivity}: java.lang.SecurityException: Not allowed to start service Intent { act=InformationService } without permission not exported from uid 10154


刚开始有点发懵,因为这是一个已经上线的项目,怎么会出现这种问题,然后遍寻答案,在stackflow上找到了灵感,地址

http://stackoverflow.com/questions/11410718/permission-issue-while-starting-a-service-from-android

然后发现测试机里面有两个工程用的Service都是注册的同一个名称,所以卸载掉一个工程,问题解决

Android 开发或系统调试过程中,可能会遇到类似 `error: requires permission not exported from uid 1000` 的错误。这类问题通常出现在尝试访问需要特定权限的系统功能时,尤其是在使用 ADB 命令、运行自动化测试或尝试与系统服务交互时[^1]。 这个错误表明某个操作需要特定的权限,而该权限并未被导出(exported),因此无法从外部访问。UID 1000 是 Android 系统用户的标识符,通常代表系统进程。当一个应用试图以普通用户身份访问仅限系统使用的资源时,就会触发此类错误。 ### 解决方案 #### 1. 使用系统签名 如果应用需要访问受保护的 API 或系统服务,它必须使用与设备系统镜像中使用的相同密钥进行签名。这通常是 OEM 提供的平台签名。开发者可以通过构建自己的系统镜像并在其中安装应用来实现这一点,或者使用具有相应签名的应用包。 #### 2. 修改 AndroidManifest.xml 确保你的应用组件(如 Activity、Service、BroadcastReceiver)在 `AndroidManifest.xml` 中正确声明了所需的权限,并且这些组件没有设置为不导出(`exported=false`)。例如: ```xml <service android:name=".MySystemService" android:exported="true" android:permission="com.example.permission.MY_PERMISSION" /> ``` #### 3. 添加系统权限 某些权限只能在系统应用中使用,例如: - `android.permission.WRITE_SECURE_SETTINGS` - `android.permission.REBOOT` - `android.permission.DEVICE_POWER` 如果你的应用不是系统应用,则需要将其放入 `/system/priv-app` 目录并重新打包系统镜像才能使用这些权限。 #### 4. 使用 root 权限执行命令 在某些情况下,可以通过 root 权限绕过限制。例如,在 ADB shell 中使用 `su` 执行命令: ```bash adb shell su am start -n com.example.app/.MainActivity ``` 但请注意,这种方法在非 rooted 设备上不可用,并可能违反设备使用条款。 #### 5. 调整 SELinux 策略 SELinux 可能会阻止某些访问。你可以通过修改 sepolicy 文件(如 `device.te` 和 `app.te`)来允许特定的操作。例如: ```bash allow system_app my_service:service_manager find; ``` 此更改需在系统构建环境中进行,并重新编译和刷写系统镜像。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值