Google ने एंड्रॉइड 9 में प्रतिबंध पेश किया है जिस पर डेवलपर्स द्वारा एपीआई तक पहुंचा जा सकता है। यहां उन छिपे हुए एपीआई प्रतिबंधों को बायपास करने का तरीका बताया गया है।
2018 में, Google ने Android Pie जारी किया। यूआई परिवर्तनों और नई सुविधाओं के बीच, कुछ डेवलपर-पक्ष परिवर्तन भी थे। उन परिवर्तनों में नए एपीआई, मौजूदा एपीआई के लिए बगफिक्स और भी शामिल थे छिपे हुए एपीआई तक पहुंच पर प्रतिबंध.
हालाँकि, सौभाग्य से, उन प्रतिबंधों से बचने के तरीके मौजूद हैं। इससे पहले कि मैं प्रतिबंधों को कैसे दरकिनार करूं, मुझे थोड़ा समझाना चाहिए कि छिपे हुए एपीआई क्या हैं, उन्हें पहले स्थान पर प्रतिबंधित क्यों किया गया था, और आप उन तक क्यों पहुंचना चाहते हैं।
हिडन एपीआई एंड्रॉइड में एपीआई हैं जिन्हें ऐप डेवलपर्स आमतौर पर नहीं देख सकते हैं। यदि आप AOSP के कोड पर एक नज़र डालें, तो आपको कक्षाओं, वेरिएबल्स और विधियों का एक पूरा समूह दिखाई देगा @hide
उनके ऊपर एक टिप्पणी ब्लॉक के अंदर एनोटेशन।
यह एनोटेशन एसडीके को संकलित करते समय Google द्वारा उपयोग किए जाने वाले किसी भी टूल को इसके अंतर्गत आइटम को बाहर करने का निर्देश देता है। उस एसडीके को एंड्रॉइड स्टूडियो के माध्यम से डाउनलोड किए गए एसडीके के अंदर डेवलपर्स को वितरित किया जाता है। जब तक आप संशोधित एसडीके का उपयोग नहीं करते, एंड्रॉइड स्टूडियो सोचेगा कि उनमें से कोई भी छिपा हुआ आइटम मौजूद नहीं है। यदि आप इसे सीधे उपयोग करने का प्रयास करते हैं, तो यह इसे लाल रंग में दिखाएगा और संकलित करने से इंकार कर देगा।
एपीआई के छुपे होने के कई कारण हो सकते हैं। कुछ चीज़ें केवल आंतरिक या सिस्टम ऐप्स द्वारा उपयोग किए जाने के लिए होती हैं और यदि किसी तृतीय-पक्ष ऐप द्वारा उपयोग की जाती हैं तो वे काम नहीं करेंगी। अन्य प्रायोगिक या अस्थिर हैं, और भविष्य में हटाए या बदले जा सकते हैं। कुछ तो केवल एपीआई हैं, यदि उन्हें कभी हटा दिया जाता है तो Google सामान्य बहिष्करण चक्र को लागू नहीं करना चाहता है।
जबकि मानक एंड्रॉइड एसडीके में एक है बहुत इसमें, कभी-कभी यह पर्याप्त नहीं होता है। कभी-कभी कुछ ऐसा होता है जो आप करना चाहते हैं जो एंड्रॉइड में पहले से मौजूद है, लेकिन सार्वजनिक रूप से उजागर नहीं किया गया है।
उदाहरण के लिए, मैं बहुत सारे ऐप्स बनाता हूं, जिनमें शामिल हैं सिस्टमयूआई ट्यूनर और लॉकस्क्रीन विजेट, विभिन्न छिपे हुए एपीआई के एक समूह का उपयोग करें। सिस्टमयूआई ट्यूनर को विकल्पों को ठीक से ट्रैक करने, बदलने और रीसेट करने के लिए कुछ तक पहुंचने की आवश्यकता है। लॉकस्क्रीन विजेट अन्य चीजों के अलावा, इसके नीचे वॉलपेपर दिखाने के लिए कुछ का उपयोग करता है।
अधिकांश डेवलपर्स को छिपे हुए एपीआई तक पहुंचने की आवश्यकता नहीं है, लेकिन कभी-कभी वे काफी उपयोगी हो सकते हैं।
एंड्रॉइड 9 (पाई) की रिलीज के साथ, Google ने छिपी हुई एपीआई ब्लैकलिस्ट पेश की। प्रत्येक छुपे हुए एपीआई को शामिल नहीं किया गया था, और सूचियों के विभिन्न स्तर थे। श्वेतसूची पर छिपे एपीआई तक कोई भी पहुंच सकता है। लाइट-ग्रेलिस्ट पर छिपे एपीआई को किसी भी ऐप द्वारा एक्सेस किया जा सकता है, लेकिन एंड्रॉइड के भविष्य के संस्करणों में यह पहुंच योग्य नहीं हो सकता है। डार्क-ग्रेलिस्ट पर कुछ भी केवल पाई से पहले एपीआई स्तर को लक्षित करने वाले ऐप्स द्वारा ही एक्सेस किया जा सकता है (यानी, एपीआई स्तर 28 से पहले)। पाई और बाद के संस्करणों को लक्षित करने वाले ऐप्स को पहुंच से वंचित कर दिया जाएगा। अंत में, ब्लैकलिस्ट पर छिपे एपीआई को किसी भी गैर-सिस्टम (या गैर-श्वेतसूचीबद्ध) ऐप द्वारा एक्सेस नहीं किया जा सकता है, चाहे लक्ष्य एपीआई कोई भी हो।
एंड्रॉइड 10 ने सूचियों को व्यवस्थित करने के तरीके को बदल दिया और उन्हें थोड़ा सरल बना दिया, लेकिन विचार वही रहा। कुछ छुपे हुए एपीआई को ऐप्स द्वारा एक्सेस किया जा सकता था जबकि अन्य को ब्लॉक कर दिया गया था। एंड्रॉइड 11 पहुंच का पता लगाने को मजबूत किया को एक बाईपास अवरुद्ध करें पाई और 10 के लिए उपयोग किया जाता है।
सभी एंड्रॉइड संस्करणों में, जब भी कोई तृतीय-पक्ष ऐप ब्लैकलिस्टेड छिपे हुए एपीआई तक पहुंचने का प्रयास करता है, तो एंड्रॉइड उचित "नहीं मिला" त्रुटि फेंक देगा।
वास्तव में छिपी हुई एपीआई ब्लैकलिस्ट से छुटकारा पाने के कई तरीके हैं। अपनी आवश्यकताओं के आधार पर, आप वे चुन सकते हैं जो सभी Android संस्करणों के लिए काम करते हैं, वे जो केवल Android 9 और 10 के लिए काम करते हैं, वे जो मूल C++ कोड का उपयोग करते हैं, और वे जो पूरी तरह से जावा-आधारित हैं। यहां तक कि एडीबी का उपयोग करके केवल-विकास समाधान भी मौजूद है।
एडीबी वर्कअराउंड
यदि आपका डिवाइस एंड्रॉइड पाई चला रहा है, तो छिपे हुए एपीआई एक्सेस को सक्षम करने के लिए निम्नलिखित दो एडीबी कमांड चलाएं।
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
यदि आपका डिवाइस एंड्रॉइड 10 या उसके बाद का संस्करण चला रहा है, तो छुपे हुए एपीआई एक्सेस को सक्षम करने के लिए निम्नलिखित एडीबी कमांड चलाएं।
adb shell settings put global hidden_api_policy 1
डिफ़ॉल्ट व्यवहार पर वापस लौटने के लिए, बस बदलें put
साथ delete
और हटा दें 1
.
जाहिर है, ये कमांड किसी प्रोडक्शन ऐप के लिए बिल्कुल उपयोगी नहीं हैं। मैं आपको पहले से बता सकता हूं कि उपयोगकर्ताओं को एडीबी का उपयोग करने के बारे में उचित निर्देश देना अविश्वसनीय रूप से कठिन है। लेकिन यदि आपको नए प्रतिबंधों का अनुपालन करने के लिए किसी पुराने ऐप को अपडेट करने की आवश्यकता है तो वे उपयोगी हो सकते हैं।
मूल/जेएनआई समाधान
ऐसे दो तरीके हैं जिनसे आप अपने एंड्रॉइड ऐप में जेएनआई का उपयोग करके छिपी हुई एपीआई ब्लैकलिस्ट को बायपास कर सकते हैं। एक एंड्रॉइड 9 और 10 के लिए काम करता है, और दूसरा एंड्रॉइड 9 और बाद के संस्करण के लिए काम करता है।
एंड्रॉइड 9 और 10
यदि आपके पास पहले से ही अपने ऐप का मूल भाग है, तो इसे लागू करना आसान होगा। बस उपयोग करें JNI_OnLoad()
समारोह।
स्थिर कला:: रनटाइम* रनटाइम = nullptr;
extern "C"jint JNI_OnLoad(JavaVM *vm, void *reserved){
...
runtime = reinterpret_cast<: javavmext>(vm)->GetRuntime();
runtime->SetHiddenApiEnforcementPolicy(art:: hiddenapi:: EnforcementPolicy:: kNoChecks);
...
}
ध्यान रखें कि यह तरीका केवल एंड्रॉइड 9 और 10 पर काम करता है।
एंड्रॉइड 9 और बाद का संस्करण
एंड्रॉइड के किसी भी संस्करण के लिए, आपके पास छिपे हुए एपीआई प्रतिबंध को बायपास करने के लिए दो लाइब्रेरी का विकल्प है: फ्रीरिफ्लेक्शन और रेस्ट्रिक्शनबायपास।
दोनों को लागू करना और उपयोग करना आसान है।
फ्रीरिफ्लेक्शन को लागू करने के लिए, अपने मॉड्यूल-स्तरीय बिल्ड.ग्रेडल में निर्भरता जोड़ें।
implementation 'me.weishu: free_reflection: 3.0.1'
फिर ओवरराइड करें attachBaseContext()
आपके एप्लिकेशन क्लास में।
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}
यदि आपके पास एप्लिकेशन क्लास नहीं है, तो आप इसे बहुत आसानी से जोड़ सकते हैं। एक नया वर्ग बनाएं जो विस्तारित हो Application
और फिर इसे अपने AndroidManifest.xml में इंगित करें।
उदाहरण:
publicclassAppextendsApplication{
...
@Override
protectedvoidattachBaseContext(Context base){
super.attachBaseContext(base);
Reflection.unseal(base);
}
}
<manifest>
...
...
name=".App">
...
application>
manifest>
RestrictionBypass लागू करने के लिए, अपने प्रोजेक्ट-स्तरीय बिल्ड.ग्रेडल में जिटपैक रिपॉजिटरी जोड़ें।
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
फिर अपने मॉड्यूल-स्तरीय बिल्ड.ग्रेडल में निर्भरता जोड़ें।
implementation 'com.github.ChickenHook: RestrictionBypass: 2.2'
और बस। यह लाइब्रेरी स्वचालित रूप से ब्लैकलिस्ट प्रतिबंधों को हटा देती है।
जावा वर्कअराउंड
हालांकि जेएनआई समाधान प्रभावी हैं, लेकिन कई बार आप मूल कोड का उपयोग नहीं करना चाहेंगे। यदि आप पहले से ही C++ में काम नहीं कर रहे हैं, तो यह आपके ऐप में प्लेटफ़ॉर्म प्रतिबंधों के साथ-साथ अनावश्यक आकार जोड़ सकता है। सौभाग्य से, केवल जावा का उपयोग करके छिपी हुई एपीआई ब्लैकलिस्ट को बायपास करने के तरीके हैं।
एंड्रॉइड 9 और 10
एंड्रॉइड 9 और 10 में, आप छुपी हुई एपीआई ब्लैकलिस्ट को बायपास करने के लिए डबल-रिफ्लेक्शन या मेटा-रिफ्लेक्शन कह सकते हैं, जिसका उपयोग कर सकते हैं। क्योंकि सिस्टम केवल यह जांचता है कि तृतीय-पक्ष ऐप्स क्या कॉल कर रहे हैं, डबल-रिफ्लेक्शन से यह सोचने में मदद मिलती है कि सिस्टम छिपी हुई एपीआई कॉल कर रहा है।
इस ट्रिक का उपयोग आपके ऐप को छिपी हुई एपीआई छूट देने के लिए एक विधि को कॉल करने के लिए किया जा सकता है, जिसे उपयुक्त नाम दिया गया है setHiddenApiExemptions()
. बस निम्नलिखित कोड को अपने ऐप के जीवनचक्र (जैसे कि एप्लिकेशन) में कहीं आरंभ में जोड़ें onCreate()
विधि), और यह ब्लैकलिस्ट को बायपास करने का काम संभाल लेगा।
Method forName = Class.class.getDeclaredMethod("forName", String.class);
Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);Class vmRuntimeClass = (Class) forName.invoke(null, "dalvik.system.VMRuntime");
Method getRuntime = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "getRuntime", null);
Method setHiddenApiExemptions = (Method) getDeclaredMethod.invoke(vmRuntimeClass, "setHiddenApiExemptions", newClass[] { String[].class} );
Object vmRuntime = getRuntime.invoke(null);
setHiddenApiExemptions.invoke(vmRuntime, newString[][] { newString[] { "L" } });
यदि आपका ऐप एंड्रॉइड के 9 से कम संस्करणों के साथ संगत है, तो इसे संस्करण जांच में शामिल करना याद रखें।
एंड्रॉइड 9 और बाद का संस्करण
एंड्रॉइड 9 और किसी भी बाद के संस्करण पर छिपी एपीआई ब्लैकलिस्ट को बायपास करने के लिए, आप एलएसपीज़ेड की लाइब्रेरी का उपयोग कर सकते हैं। यह लाइब्रेरी जावा के अनसेफ एपीआई का उपयोग करती है, इसलिए इसके कभी भी टूटने की संभावना नहीं है।
इसे लागू करने के लिए, बस अपने मॉड्यूल-स्तरीय बिल्ड.ग्रेडल में निर्भरता जोड़ें।
implementation 'org.lsposed.hiddenapibypass: hiddenapibypass: 2.0'
फिर ब्लैकलिस्ट को बायपास करने के लिए इसका उपयोग करें।
HiddenApiBypass.addHiddenApiExemptions("L");
यदि आपका ऐप एंड्रॉइड के 9 से कम संस्करणों के साथ संगत है, तो इसे संस्करण जांच में शामिल करना याद रखें।
निष्कर्ष और अधिक जानकारी
एंड्रॉइड पर छिपी हुई एपीआई ब्लैकलिस्ट को बायपास करने के लिए बहुत सारे विकल्प हैं, इससे कोई फर्क नहीं पड़ता कि आप किस प्लेटफ़ॉर्म संस्करण को लक्षित या उपयोग करते हैं। यदि आप यह जानने के लिए उत्सुक हैं कि ये विधियाँ और लाइब्रेरीज़ कैसे काम करती हैं, तो निम्नलिखित लिंक अवश्य देखें।
- मेरा स्टैक ओवरफ्लो प्रश्नोत्तर.
- GitHub पर LSposed की हिडन एपीआई बायपास लाइब्रेरी.
- GitHub पर चिकनहुक की रेस्ट्रिक्शनबाईपास लाइब्रेरी.
- GitHub पर tiann की FreeReflection लाइब्रेरी.
- छिपी हुई एपीआई ब्लैकलिस्ट पर Google का दस्तावेज़.