在Activity中獲取調用者身份,有兩個作用:一個是用於安全驗證,另一個是:記錄調用日誌,便於在後續分析日誌,發現非法調用。
Android中有如下API 可以實現獲取調用者:
-
Binder.getCallingUid()
和Binder.getCallingPid()
,然後根據uid,pid查找到包名 -
Activity的
getCallingPackage()
和getCallingActivity()
-
Activity的
getReferrer()
【注意:Android 5.1(Api level 22)中才引入的】,直接用過this.getReferrer()獲得。 -
反射的方式獲取Activity的
mReferrer
:reflectGetReferrer()
【注:自定義函數,目的是獲取到android.app.Activity
類的mReferrer
的值,也需要Api level 22(含)之後才能使用】
上述API安全結論:
方法1:需要基於Binder機制,不能在調用者startActivity()的時候獲取到調用者的包名,只能用於Activity用到的Binder同步調用的地方。
方法2: 在特定情況下可以使用getCallingPackage()
和 getCallingActivity()
,即如果Activity是通過startActivityForResult
啓動的,則可以使用。
方法3: Activity的getReferrer()
是不可靠的,因爲調用者可以自己設置referrer的值。
調用者通過Intent.EXTRA_REFERRER
修改referrer的值,intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse("android-app://com.test.app")); 然後再調用startActivity(intent).
方法4:是對方法3的改進,消除getReferrer()
可能返回的不可靠的值,直接獲取可靠的mReferrer
值(目前來看是可靠的)。
參考文章: