adb shell am start 报SecurityException Permission Denial

使用 am start -n example.com.aidl/example.com.aidl.ItemDetailActiv
ity命令启动activity时,偶尔(某些activity)会碰到报此错误:

java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000
 cmp=example.com.aidl/.ItemDetailActivity } from null (pid=14917, uid=2000) not
exported from uid 10201
        at android.os.Parcel.readException(Parcel.java:1465)
        at android.os.Parcel.readException(Parcel.java:1419)
        at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerN
ative.java:2306)
        at com.android.commands.am.Am.runStart(Am.java:680)
        at com.android.commands.am.Am.onRun(Am.java:270)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
        at com.android.commands.am.Am.main(Am.java:76)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:243)
        at dalvik.system.NativeStart.main(Native Method)

我对比了情况,

<activity
            android:name=".ItemDetailActivity"
            android:label="@string/title_item_detail"
            android:parentActivityName=".ItemListActivity" >
            <intent-filter>
                <action android:name="com.aa.test" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".LoginActivity"
            android:label="@string/title_activity_login"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>

ItemDetailActivity可以,LoginActivity则报错,两者区别是是否定义了intent-filter action,现象很奇怪。

百度google了许久,竟然没有答案,难道都没有朋友碰到过这种情况吗。。。。

花了一下午研究这个问题,终于找到了问题所在。

Android组件中有个 exported 属性,见官方文档描述:

Flag indicating whether the given application component is available to other applications. If false, it can only be accessed by applications with its same user id (which usually means only by code in its own package). If true, it can be invoked by external entities, though which ones can do so may be controlled through permissions. The default value is false for activity, receiver, and service components that do not specify any intent filters; it is true for activity, receiver, and service components that do have intent filters (implying they expect to be invoked by others who do not know their particular component name) and for all content providers.

=结论===========

也就是说当组件没有intent-filter时exported 属性默认为false,此组件只能由本应用用户访问,配备了intent-filter后此值改变为true,允许外部调用。

这就解释了为什么am命令会报权限拒绝错误了,希望能帮到碰到此问题并且想搞懂原因的同学。

作者:高低调
来源:CSDN
原文:https://blog.csdn.net/lazyer_dog/article/details/46050211
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/c_z_w/article/details/87280257
今日推荐