2009-06-16 10 views
15

मैं एंड्रॉइड के लिए एक लाइब्रेरी विकसित कर रहा हूं जिसके लिए केंद्रीय सर्वर से लगातार अपडेट की आवश्यकता होती है। मैं सोच रहा था कि अगर मेरी लाइब्रेरी खुद को अपडेट कर सकती है तो यह कितना अच्छा होगा - या अगर मैं बूटस्ट्रैप लाइब्रेरी को रिलीज़ कर सकता हूं जो ऐप इंस्टॉल होने पर लक्ष्य लाइब्रेरी डाउनलोड करता है।एंड्रॉइड रिमोट कोड लोडिंग

मैं इस कक्षा को "DexClassLoader" नामक 1.5 में देखता हूं लेकिन एपीआई दस्तावेज़ों के अलावा वेब पर बहुमूल्य लगता है। क्या किसी ने इस परिदृश्य के लिए सफलतापूर्वक इसका उपयोग किया है जिसे मैंने वर्णित किया है?

इसके अलावा, एंड्रॉइड मार्केट परमिट की शर्तों को ऐसी चीज करें?

उत्तर

13

मैंने सफलतापूर्वक DexClassLoader का उपयोग किया है। dexOutputDir प्रदान करना महत्वपूर्ण है जो वास्तव में आपके ऐप द्वारा लिखने योग्य है, इसलिए /data/dalvik-cache नहीं है। अन्यथा लॉग वहां लिखने में विफल होने के बारे में एक या दो पंक्तियां दिखाएंगे, इसके बाद ClassNotFoundException होगा।

cl = new DexClassLoader("/full/path/com.example.apk", 
         getFilesDir().getAbsolutePath(),// /data/data/foo/files 
         null, // native lib path, I haven't used this 
         MyClass.class.getClassLoader()); 
// This doesn't make Class.forName() work, instead I do this: 
Class<?> foo = cl.loadClass("com.example.foo"); 

Class.forName() काम करने के लिए, आपको Thread.setContextClassLoader() की कोशिश कर सकते (मैं नहीं है)।

+0

हैलो क्या आप कृपया पूरा स्रोत कोड जोड़ सकते हैं। यह एक बड़ी मदद होगी। अग्रिम धन्यवाद। –

+1

यह एआरटी की वजह से एंड्रॉइड 5 लॉलीपॉप और ऊपर के लिए काम नहीं है: http://stackoverflow.com/questions/27349097/load-dex-file- गतिशील-on-android-5-0 – gturedi

3

वास्तव में जो आप चाहते हैं वह समर्थित है और काम करता है। DexClassLoader मेरे लिए अपेक्षित काम नहीं कर रहा है, लेकिन निम्न कोड ठीक काम करता है।

DexFile df = new DexFile(new File("/data/app/my_downloaded_lib.apk")); 
ClassLoader cl = getClassLoader(); 
Class clazz = df.loadClass("com/my/lib/MyClass", cl); 

बाजार प्रश्न के बारे में, मैं इस से संबंधित कोई समस्या नहीं दिख रहा है, लेकिन आप यह सुनिश्चित करने EULA को पढ़ने के लिए।

+0

यह काम करता है, लेकिन फ़ाइल ऑब्जेक्ट बनाना प्रतिकूल है: DexFile पथ ले जाएगा और इसे स्वयं खोल देगा। आप उस कन्स्ट्रक्टर का उपयोग कर सकते हैं जो स्ट्रिंग पथ लेता है। –

+0

हैलो, शायद आप सही हैं, लेकिन जब मैंने उत्तर दिया, यह एकमात्र तरीका है जो यह काम करता है। –

2

DexClassLoader सही उत्तर है। अनुप्रयोगों को कभी भी DexFile का उपयोग नहीं करना चाहिए (इसका मतलब कक्षा लोडर द्वारा उपयोग किया जाना है)।

dexOutputDir पैरामीटर के लिए आप बाहरी संग्रहण (/sdcard), या ऐप का निजी डेटा क्षेत्र का उपयोग कर सकते हैं। बाहरी भंडारण आमतौर पर बड़ा होता है, लेकिन यदि कार्ड निकाला जाता है तो आपका ऐप मारे जायेगा, और फ़ाइल अनुमति प्रवर्तन की कमी के कारण किसी तीसरे पक्ष के लिए आपके कोड को प्रतिस्थापित करना आसान है। यह दुर्भावनापूर्ण ऐप्स को आपके ऐप को मनमाने ढंग से क्रियाएं करने की अनुमति दे सकता है। (क्या आप फिर भी यह करने के लिए चाहते हैं, Environment.getExternalStorageDirectory() के माध्यम से पथ मिलता है,। WRITE_EXTERNAL_STORAGE अनुमति की आवश्यकता है)

एप्लिकेशन-निजी डेटा क्षेत्र (Context.getFilesDir() से पथ प्राप्त) अधिक सुरक्षित है, और यह भी साफ किया जा रहा है का लाभ दिया है ऐप अनइंस्टॉल किया गया है तो स्वचालित रूप से ऊपर। यह अनुशंसित दृष्टिकोण है।

+4

मुझे यह भी लगता है कि लोडिंग कोड बंद है एसडी कार्ड कुछ हद तक असुरक्षित होगा। – CommonsWare

+0

कभी भी अपनी डीएक्स फ़ाइल को एसडी कार्ड पथ पर न लिखें। यह एक सुरक्षा भेद्यता पैदा करेगा। http://www.symantec.com/connect/blogs/android-class-loading-hijacking – ajma

+0

सुरक्षा चिंताओं को हल करने के लिए अपडेट किया गया। – fadden

संबंधित मुद्दे