Android स्रोत कोड में @hide का क्या अर्थ है?


120

के लिए Activityस्रोत कोड , लाइन 3898 (नीचे के पास):

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

क्या @hideमतलब है?

मैंने पाया कि मेरा public class ChildActivity extends Activity { ... }उपयोग / देख नहीं सकता Activity.isResumed()। क्या यह सामान्य है? मैं इसे कैसे एक्सेस कर सकता हूं?

जवाबों:


182

एंड्रॉइड में दो प्रकार के एपीआई हैं जो एसडीके के माध्यम से सुलभ नहीं हैं।

पहला पैकेज में स्थित है com.android.internal। दूसरा एपीआई प्रकार वर्गों और विधियों का एक संग्रह है जो @hide Javadoc विशेषता के साथ चिह्नित हैं ।

एंड्रॉइड 9 (एपीआई स्तर 28) से शुरू होकर, Google गैर-एसडीके इंटरफेस के उपयोग पर नए प्रतिबंधों का परिचय देता है , चाहे सीधे प्रतिबिंब के माध्यम से, या जेएनआई के माध्यम से। जब भी कोई एप्लिकेशन गैर-एसडीके इंटरफेस का संदर्भ देता है या प्रतिबिंब या जेएनआई का उपयोग करके अपने हैंडल को प्राप्त करने का प्रयास करता है तो ये प्रतिबंध लागू होते हैं।

लेकिन एपीआई स्तर 28 से पहले, छिपे हुए तरीकों को अभी भी जावा प्रतिबिंब के माध्यम से एक्सेस किया जा सकता है। @hideइसलिए विशेषता, जावाडोक (droiddoc भी) का सिर्फ एक हिस्सा है @hideसिर्फ सीधा सा अर्थ विधि / कक्षा / क्षेत्र एपीआई डॉक्स से बाहर रखा गया है।

उदाहरण के लिए, उपयोग checkUidPermission()में विधि :ActivityManager.java@hide

/** @hide */
public static int checkUidPermission(String permission, int uid) {
    try {
        return AppGlobals.getPackageManager()
                .checkUidPermission(permission, uid);
    } catch (RemoteException e) {
        // Should never happen, but if it does... deny!
        Slog.e(TAG, "PackageManager is dead?!?", e);
    }
    return PackageManager.PERMISSION_DENIED;
}

हालाँकि, हम इसे प्रतिबिंब द्वारा कह सकते हैं:

Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class});
Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});

1
hello @StarPinkER क्या मैं "android.permission.CHANGE_CHPONENT_ENABLED_STATE" परमिशन को हिडन या इंटरनल एपि का इस्तेमाल करके या रिफ़्लेक्शन के द्वारा दे सकता हूँ?
हार्दिक

1
पहले इस उत्तर की जाँच करें । यह अनुमति एक हस्ताक्षर / प्रणाली की अनुमति है। ज्यादातर मामलों में, आपको यह अनुमति तब तक नहीं मिल सकती है जब तक कि यह सिस्टम एप्लिकेशन नहीं है। इसका मतलब है कि आपको अपने ऐप को स्वीकार करने या अपने ऐप को सिस्टम-ऐप बनाने और इसे साइन करने के लिए एंड्रॉइड सोर्स को संशोधित करने की आवश्यकता है। हालाँकि, आप ऐसा तब तक नहीं कर पाएंगे जब तक आप अपना Android सिस्टम नहीं बना लेते। प्रतिबिंब "छिपाना" को संभाल सकता है लेकिन यह एंड्रॉइड सिक्योरिटी सिस्टम के तर्क को बदल नहीं सकता है। आप कल्पना कर सकते हैं कि अगर हम ऐसा करने में सक्षम हैं तो हम आसानी से एंड्रॉइड डिवाइस पर हमला कैसे कर सकते हैं। @ हार्दिक
स्टारपाइकर

2
उत्तर के लिए धन्यवाद, लेकिन मुझे लगता है कि उत्तर में दो समस्याएं हैं, मुझे गलत होने पर सही करें। यदि मुझे "android.app.ActivityManager" और "m.invoke (c) के बजाय" एक्टिविटी मैनजर "द्वारा खोजने का प्रयास करने पर क्लासनॉटफ़ाउंड त्रुटि मिलती है, तो लगता है कि" m.invoke (अशक्त), स्थिर तरीकों के लिए और "एम। इनवोक (ओ, ", जहां ओ गतिशील प्रकार के लिए सी का एक ऑब्जेक्ट है। मेरे पोलिश व्याकरण के लिए क्षमा करें :)
lindenrovio

3
प्रतिबिंब के संबंध में बस एक नोट: जैसा कि उन तरीकों / क्षेत्रों में आधिकारिक एसडीके का हिस्सा नहीं है, इस बात की कोई गारंटी नहीं है कि वे भविष्य के किसी भी Android संशोधन में मौजूद होंगे।
sstn

2
यदि एनोटेशन केवल प्रलेखन से विधि निकालता है, तो मैं अभी भी कोड में इसका उपयोग क्यों नहीं कर सकता हूं?
जेवियर डेलगाडो

25
  1. @hideउन चीजों के लिए उपयोग किया जाता है जिन्हें विभिन्न कारणों से दिखाई देने की आवश्यकता होती है लेकिन वे प्रकाशित API का हिस्सा नहीं हैं । जब वे स्वचालित रूप से एपीआई को स्रोत से निकालते हैं, तो उन्हें दस्तावेज में शामिल नहीं किया जाएगा।

  2. आप सही हैं, आप इसे ओवरराइड नहीं कर सकते। यह सामान्य है, यह डिज़ाइन के अनुसार है, क्योंकि यह चिह्नित है final। आपको इसका उपयोग करने में सक्षम होना चाहिए , हालांकि एक संपादक आपको यह नहीं दिखा सकता है कि यह जो भी उपयोग करता है, उसमें से एक विकल्प के रूप में इसे चिह्नित किया गया है @hide, और आपको नीचे बिंदु 3 का ध्यान रखना चाहिए।

  3. आपको इसका उपयोग बिल्कुल नहीं करना चाहिए क्योंकि यह एपीआई का हिस्सा नहीं है और डेवलपर्स जब चाहें इसे हटा सकते हैं। वे अपने अधिकारों के भीतर भी होंगे, क्या वे उदास रूप से झुके हुए थे, इसे एक ऐसे फ़ंक्शन के साथ बदलने के लिए जो उस उपकरण को चला गया था (हालांकि शायद सख्त कानूनी अर्थ में नहीं)।


ओह, हाँ ... यह finalनिश्चित रूप से मैं इसे ओवरराइड नहीं कर सकता। क्षमा करें कि मेरी गलती है: x
midnite

क्या आपका मतलब है, यह publicविकास के चरण के दौरान सभी वर्गों में है। लेकिन यह हमारे जैसे उपयोगकर्ताओं के लिए privateया उनके जैसे कार्य करता /*package*/है?
मध्याह्न

हम्म ... यह सिर्फ एक टिप्पणी है। मैं इसका अर्थ समझता हूं। लेकिन इस व्यवहार को कोड-स्तर पर क्या और कहाँ लागू करना है?
मध्याह्न

1
यह सार्वजनिक क्यों है, मैं वास्तव में टिप्पणी नहीं कर सकता। हो सकता है कि लागू करने वाला कोड Activityबहुत सारी कक्षाओं में फैला हो और उन्हें इस सदस्य तक पहुंचने की आवश्यकता हो। लब्बोलुआब यह है कि यह है सार्वजनिक जिसका अर्थ है आप अपने जोखिम पर इसका इस्तेमाल एपीआई का हिस्सा नहीं है, लेकिन।
पैक्सिडाब्लो

1
@midnite, एक्लिप्स में इसका अपना जावा कंपाइलर है जो इंटेलीजेंस सामान के साथ एकीकृत होने में कोई संदेह नहीं है। मेरा सुझाव है कि यदि आपने इसे जावा एसडीके के साथ संकलित किया है, तो यह ठीक होगा। ऐसा नहीं है कि मैं यह निश्चित रूप से
सुझा

4

@hideएनोटेशन मतलब यह है कि इस इंटरफेस सार्वजनिक एपीआई का हिस्सा नहीं है और अपने कोड में नहीं किया जाना चाहिए। एओएसपी के आंतरिक उपयोग के लिए विधियां ही हैं।

Google ने वास्तव में गैर-एसडीके इंटरफेस के उपयोग को प्रतिबंधित करना शुरू कर दिया है । इसमें शामिल इंटरफेस शामिल हैं@hide

विधियों को चार सूचियों में वर्गीकृत किया गया है:

  • श्वेतसूची: एसडीके
  • प्रकाश-स्त्रीलिंग: गैर एसडीके विधियाँ / क्षेत्र जो अभी भी सुलभ हैं।
  • काले greylist:
    • ऐसे ऐप्स के लिए जिनका लक्ष्य SDK API स्तर 28 से नीचे है: एक डार्क ग्रीलिस्ट इंटरफ़ेस के प्रत्येक उपयोग की अनुमति है।
    • उन ऐप्स के लिए जिनका लक्ष्य SDK API स्तर 28 या उच्चतर है: ब्लैकलिस्ट के समान व्यवहार
  • ब्लैकलिस्ट: लक्ष्य SDK की परवाह किए बिना प्रतिबंधित। प्लेटफ़ॉर्म ऐसा व्यवहार करेगा जैसे कि इंटरफ़ेस अनुपस्थित है। उदाहरण के लिए, जब भी ऐप इसे इस्तेमाल करने की कोशिश कर रहा होगा, यह NoSuchMethodError / NoSuchFieldException को फेंक देगा और जब ऐप किसी विशेष वर्ग के फ़ील्ड / विधियों की सूची जानना चाहता है, तो इसे शामिल नहीं करेगा।

सूचियाँ यहाँ देखी जा सकती हैं: https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.