आपको यह अहम जानकारी मिल सकती है कि आपका ऐप्लिकेशन और उसकी डिपेंडेंसी, निजी डेटा को कैसे ऐक्सेस करती हैं
डेटा ऐक्सेस ऑडिटिंग करके उपयोगकर्ताओं से शेयर किया जा सकता है. यह प्रोसेस, Android 11 (एपीआई लेवल 30) और उसके बाद के वर्शन वाले डिवाइसों पर उपलब्ध है. इससे, आपको अनचाहे डेटा ऐक्सेस की बेहतर तरीके से पहचान करने में मदद मिलती है. आपका ऐप्लिकेशन किसी इंस्टेंस को रजिस्टर कर सकता है
AppOpsManager.OnOpNotedCallback
का, जो काम कर सकता है
हर बार इनमें से किसी इवेंट के होने पर कार्रवाइयां:
- आपके ऐप्लिकेशन का कोड, निजी डेटा को ऐक्सेस करता है. यह पता लगाने के लिए कि आपके ऐप्लिकेशन के किस लॉजिकल हिस्से ने इवेंट को ट्रिगर किया है, एट्रिब्यूशन टैग के हिसाब से डेटा ऐक्सेस को ऑडिट किया जा सकता है.
- डिपेंडेंट लाइब्रेरी या SDK टूल में मौजूद कोड, निजी डेटा को ऐक्सेस करता है.
डेटा ऐक्सेस ऑडिटिंग उस थ्रेड पर शुरू की जाती है जहां डेटा का अनुरोध किया जाता है. इसका मतलब है कि अगर आपके ऐप्लिकेशन में तीसरे पक्ष का कोई SDK टूल या लाइब्रेरी, निजी डेटा ऐक्सेस करने वाले एपीआई को कॉल करती है, तो डेटा ऐक्सेस की ऑडिटिंग की मदद से आपके OnOpNotedCallback
को कॉल की जानकारी की जांच करने की सुविधा मिलती है. आम तौर पर, यह कॉलबैक ऑब्जेक्ट, ऐप्लिकेशन की मौजूदा स्थिति को देखकर यह बता सकता है कि कॉल आपके ऐप्लिकेशन से आया है या SDK टूल से. जैसे, मौजूदा थ्रेड का स्टैक ट्रेस.
डेटा का ऐक्सेस लॉग करें
AppOpsManager.OnOpNotedCallback
के किसी इंस्टेंस का इस्तेमाल करके, डेटा ऐक्सेस की ऑडिटिंग करने के लिए, उस कॉम्पोनेंट में कॉलबैक लॉजिक लागू करें जहां आपको डेटा ऐक्सेस की ऑडिटिंग करनी है. जैसे, किसी गतिविधि के onCreate()
तरीके या ऐप्लिकेशन के onCreate()
तरीके में.
यह कोड स्निपेटAppOpsManager.OnOpNotedCallback
सिर्फ़ एक गतिविधि में डेटा के ऐक्सेस का ऑडिट करना:
override fun onCreate(savedInstanceState: Bundle?) { val appOpsCallback = object : AppOpsManager.OnOpNotedCallback() { private fun logPrivateDataAccess(opCode: String, trace: String) { Log.i(MY_APP_TAG , "Private data accessed. " + "Operation: $opCode\nStack Trace:\n$trace") } override fun onNoted(syncNotedAppOp: SyncNotedAppOp) { logPrivateDataAccess( syncNotedAppOp.op, Throwable().stackTrace.toString()) } override fun onSelfNoted(syncNotedAppOp: SyncNotedAppOp) { logPrivateDataAccess( syncNotedAppOp.op, Throwable().stackTrace.toString()) } override fun onAsyncNoted(asyncNotedAppOp: AsyncNotedAppOp) { logPrivateDataAccess(asyncNotedAppOp.op, asyncNotedAppOp.message) } } val appOpsManager = getSystemService(AppOpsManager::class.java) as AppOpsManager appOpsManager.setOnOpNotedCallback(mainExecutor, appOpsCallback) }
@Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { AppOpsManager.OnOpNotedCallback appOpsCallback = new AppOpsManager.OnOpNotedCallback() { private void logPrivateDataAccess(String opCode, String trace) { Log.i(MY_APP_TAG , "Private data accessed. " + "Operation: $opCode\nStack Trace:\n$trace"); } @Override public void onNoted(@NonNull SyncNotedAppOp syncNotedAppOp) { logPrivateDataAccess(syncNotedAppOp.getOp(), Arrays.toString(new Throwable().getStackTrace())); } @Override public void onSelfNoted(@NonNull SyncNotedAppOp syncNotedAppOp) { logPrivateDataAccess(syncNotedAppOp.getOp(), Arrays.toString(new Throwable().getStackTrace())); } @Override public void onAsyncNoted(@NonNull AsyncNotedAppOp asyncNotedAppOp) { logPrivateDataAccess(asyncNotedAppOp.getOp(), asyncNotedAppOp.getMessage()); } }; AppOpsManager appOpsManager = getSystemService(AppOpsManager.class); if (appOpsManager != null) { appOpsManager.setOnOpNotedCallback(getMainExecutor(), appOpsCallback); } }
onAsyncNoted()
और onSelfNoted()
तरीकों को खास स्थितियों में कॉल किया जाता है:
onAsyncNoted()
उसे तब कॉल किया जाता है, जब आपके ऐप्लिकेशन के एपीआई कॉल. इसका सबसे सामान्य उदाहरण यह है कि जब आपका ऐप्लिकेशन किसी लिसनर को रजिस्टर करता है और लिसनर के कॉलबैक को हर बार ट्रिगर करने पर डेटा ऐक्सेस होता है.onAsyncNoted()
में दिए गएAsyncNotedOp
आर्ग्युमेंट में, तरीका है, जिसेgetMessage()
कहा गया है. इस तरीके से, डेटा ऐक्सेस करने के बारे में ज़्यादा जानकारी मिलती है. लोकेशन कॉलबैक के मामले में, मैसेज में यह शामिल होता है लिसनर का सिस्टम-आइडेंटिटी-हैश.onSelfNoted()
को बहुत कम मामलों में तब कॉल किया जाता है, जब कोई ऐप्लिकेशन अपना UID,noteOp()
में पास करता है.
एट्रिब्यूशन टैग के हिसाब से डेटा ऐक्सेस को ऑडिट करना
आपके ऐप्लिकेशन में इस्तेमाल के कई मुख्य उदाहरण हो सकते हैं. जैसे, उपयोगकर्ताओं को ऐप्लिकेशन कैप्चर करने की अनुमति देना
फ़ोटो शेयर करें और इन फ़ोटो को अपने संपर्कों के साथ शेयर करें. अगर आपने कई कामों के लिए कोई ऐप्लिकेशन डेवलप किया है, तो उसके डेटा ऐक्सेस का ऑडिट करते समय, अपने ऐप्लिकेशन के हर हिस्से पर एट्रिब्यूशन टैग लागू किया जा सकता है. attributionTag
संदर्भ वापस दिखाया जाता है
onNoted()
को कॉल को पास किए जाने वाले ऑब्जेक्ट में.
इससे आपको डेटा के ऐक्सेस को अपने कारोबार के लॉजिकल हिस्सों तक आसानी से ट्रेस करने में मदद मिलती है
कोड.
अपने ऐप्लिकेशन में एट्रिब्यूशन टैग तय करने के लिए, नीचे दिए गए सेक्शन में दिया गया तरीका अपनाएं.
मेनिफ़ेस्ट में एट्रिब्यूशन टैग की जानकारी देना
अगर आपका ऐप्लिकेशन Android 12 (एपीआई लेवल 31) या उसके बाद के वर्शन को टारगेट करता है, तो आपको अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में एट्रिब्यूशन टैग का एलान करना होगा. इसके लिए, यहां दिए गए कोड स्निपेट में दिखाए गए फ़ॉर्मैट का इस्तेमाल करें. अगर किसी ऐसे एट्रिब्यूशन टैग का इस्तेमाल किया जा रहा है जिसका इस्तेमाल नहीं किया जा रहा है, तो
एलान करती है, तो सिस्टम आपके लिए एक null
टैग बनाता है और
Logcat में कोई मैसेज लॉग करता है.
<manifest ...> <!-- The value of "android:tag" must be a literal string, and the value of "android:label" must be a resource. The value of "android:label" is user-readable. --> <attribution android:tag="sharePhotos" android:label="@string/share_photos_attribution_label" /> ... </manifest>
एट्रिब्यूशन टैग बनाना
इस
onCreate()
गतिविधि का वह तरीक़ा जिसके ज़रिए आपने डेटा को ऐक्सेस किया. जैसे, वह गतिविधि
जगह की जानकारी का अनुरोध करें या उपयोगकर्ता के संपर्कों की सूची ऐक्सेस करें, कॉल करें
createAttributionContext()
एट्रिब्यूशन टैग पास करना जिसे आपको अपने
है.
यहां दिए गए कोड स्निपेट में, किसी ऐप्लिकेशन के फ़ोटो-जगह की जानकारी शेयर करने वाले हिस्से के लिए एट्रिब्यूशन टैग बनाने का तरीका बताया गया है:
class SharePhotoLocationActivity : AppCompatActivity() { lateinit var attributionContext: Context override fun onCreate(savedInstanceState: Bundle?) { attributionContext = createAttributionContext("sharePhotos") } fun getLocation() { val locationManager = attributionContext.getSystemService( LocationManager::class.java) as LocationManager // Use "locationManager" to access device location information. } }
public class SharePhotoLocationActivity extends AppCompatActivity { private Context attributionContext; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { attributionContext = createAttributionContext("sharePhotos"); } public void getLocation() { LocationManager locationManager = attributionContext.getSystemService(LocationManager.class); if (locationManager != null) { // Use "locationManager" to access device location information. } } }
ऐक्सेस लॉग में एट्रिब्यूशन टैग शामिल करें
अपने AppOpsManager.OnOpNotedCallback
कॉलबैक को अपडेट करें, ताकि आपके ऐप्लिकेशन के लॉग में, आपके तय किए गए एट्रिब्यूशन टैग के नाम शामिल हों.
नीचे दिया गया कोड स्निपेट, अपडेट किया गया लॉजिक दिखाता है जो एट्रिब्यूशन टैग लॉग करता है:
val appOpsCallback = object : AppOpsManager.OnOpNotedCallback() { private fun logPrivateDataAccess( opCode: String, attributionTag: String, trace: String) { Log.i(MY_APP_TAG, "Private data accessed. " + "Operation: $opCode\n " + "Attribution Tag:$attributionTag\nStack Trace:\n$trace") } override fun onNoted(syncNotedAppOp: SyncNotedAppOp) { logPrivateDataAccess(syncNotedAppOp.op, syncNotedAppOp.attributionTag, Throwable().stackTrace.toString()) } override fun onSelfNoted(syncNotedAppOp: SyncNotedAppOp) { logPrivateDataAccess(syncNotedAppOp.op, syncNotedAppOp.attributionTag, Throwable().stackTrace.toString()) } override fun onAsyncNoted(asyncNotedAppOp: AsyncNotedAppOp) { logPrivateDataAccess(asyncNotedAppOp.op, asyncNotedAppOp.attributionTag, asyncNotedAppOp.message) } }
@Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { AppOpsManager.OnOpNotedCallback appOpsCallback = new AppOpsManager.OnOpNotedCallback() { private void logPrivateDataAccess(String opCode, String attributionTag, String trace) { Log.i("MY_APP_TAG", "Private data accessed. " + "Operation: $opCode\n " + "Attribution Tag:$attributionTag\nStack Trace:\n$trace"); } @Override public void onNoted(@NonNull SyncNotedAppOp syncNotedAppOp) { logPrivateDataAccess(syncNotedAppOp.getOp(), syncNotedAppOp.getAttributionTag(), Arrays.toString(new Throwable().getStackTrace())); } @Override public void onSelfNoted(@NonNull SyncNotedAppOp syncNotedAppOp) { logPrivateDataAccess(syncNotedAppOp.getOp(), syncNotedAppOp.getAttributionTag(), Arrays.toString(new Throwable().getStackTrace())); } @Override public void onAsyncNoted(@NonNull AsyncNotedAppOp asyncNotedAppOp) { logPrivateDataAccess(asyncNotedAppOp.getOp(), asyncNotedAppOp.getAttributionTag(), asyncNotedAppOp.getMessage()); } }; AppOpsManager appOpsManager = getSystemService(AppOpsManager.class); if (appOpsManager != null) { appOpsManager.setNotedAppOpsCollector(appOpsCollector); } }