问题:在使用aidl进行跨进程通信的时候,通过bindService()绑定远程service,但一直返回false
// AndroidManifest.xml
<application
...
<service
android:name=".service.MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.benny.bind" />
</intent-filter>
</service>
...
</application>
// Client
bindService(Intent().apply {
component = ComponentName("com.benny.app.a", "com.benny.app.a.service.MyService")
}, object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.d(TAG, "onServiceConnected")
IMyAidlInterface.Stub.asInterface(service).setUIType(111)
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.d(TAG, "onServiceDisconnected")
}
}, Context.BIND_AUTO_CREATE).let {
Log.d(TAG, "bindService: $it")
}
2022-10-18 18:34:23.264 15569-15569/com.benny.app.b D/ZP: bindService: false
原因:Google在API30以后加强了包可见性限制,如果需要跨进程访问某个应用,需要在AndroidManifest中声明要访问的应用。详情参考https://developer.android.google.cn/guide/topics/manifest/queries-element?hl=en--
解决方案:
第一种方案:
修改client targetSdk版本到30以下。
第二种方案:
targetSdk版本在30以上,在AndroidManifest中,按照Google要求需要在Client注册需要使用的包名。
// AndroidManifest.xml
<queries>
<!--如果想要与其他的应用进行AIDL通信的话,需要在这里注册包名的信息-->
<!--谷歌的文档说明 https://developer.android.google.cn/guide/topics/manifest/queries-element?hl=en-->
<package android:name="com.benny.app.a" />
</queries>
<application
...
<service
android:name=".service.MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.benny.bind" />
</intent-filter>
</service>
...
</application>
网友评论