2010-04-09 10 views
25

यह सवाल गतिशील रूप से एक चल Dalvik वी एम में कार्यावधि में पैदा करने और लोड हो रहा है जावा bytecodes के बारे में पूछा गया है (और जवाब) कई बार, लेकिन वहाँ डेक्स फ़ाइलें लोड करने के लिए किसी भी तरह से है/रनटाइम पर एक ऐप में बाइटकोड?एक चल Dalvik/एंड्रॉयड आवेदन में गतिशील रूप से उत्पन्न Dalvik Bytecode

धन्यवाद

उत्तर

23

Dalvik टीम अव्वल दर्जे का क्रम कोड पीढ़ी पुस्तकालय का निर्माण करना चाहते हैं। हम फीचर अनुरोध को Android bug 6322 के रूप में ट्रैक कर रहे हैं। दुर्भाग्य से, हम प्रदर्शन तथा शुद्धता मुद्दों की एक बहुत लंबी सूची है, तो मैं आप जब हम इस मामले में समय बिताने के लिए एक समय नहीं दे सकता।

कुछ विकल्प हैं, लेकिन वे सभी कुछ काम ले जाएगा:

  • एक मानक JVM पर अपने आवेदन चलाने के लिए और वहाँ सभी क्रम कोड पीढ़ी के लिए व्यायाम। स्मृति से फ़ाइलों तक .class फ़ाइलों को डंप करें, और फिर उन फ़ाइलों पर dx चलाएं। यदि आप काफी परिष्कृत हैं, तो आप इस काम को अपने निर्माण में एकीकृत कर सकते हैं।

  • प्रोजेक्ट लाइब्रेरी के रूप में ओपन सोर्स डीएक्स उपकरण शामिल करें, और संभवतः अपने एप्लिकेशन के क्लासलोडर में अपने एप्लिकेशन के भीतर प्रोग्रामेटिक रूप से निष्पादित करें। यह आपके आवेदन की बाइनरी को फहराएगा।

+1

आपके उत्तर के लिए धन्यवाद। क्या मुझे अभी अपना कोड जनरेटर लिखने से रोक रहा है? मैंने .Net-> Flash और .Net -> नेट, और डेक्स के लिए एक लिखा है जावा के बीच एक क्रॉस की तरह है। क्लास और फ्लैश .एबीसी फाइलें। इसके अलावा, लिंक के लिए धन्यवाद। मैंने इसे तारांकित किया और एक टिप्पणी जोड़ा (इसका एपीआई अनुरोध करना नेट के डीएलआर के समान है)। –

+3

आप निश्चित रूप से अभी अपना कोड जनरेटर लिख सकते हैं। यदि आप इसे अपाचे-लाइसेंस देते हैं, तो भी बेहतर! –

+3

अद्यतन: डेक्समेकर पर एक नज़र डालें जो इसे आसान बनाता है: http://code.google.com/p/dexmaker/ –

5

वहाँ रनटाइम पर एक ऐप्लिकेशन में डेक्स फ़ाइलों/bytecodes लोड करने के लिए किसी भी तरह से नहीं है?

DexFile और DexClassLoader पर देखें।

+1

पहले इस विषय पर: http://stackoverflow.com/questions/1001944/android-remote-code-loading/2450049#2450049 – fadden

1

किसी भी सी या सी ++ प्रोग्राम के अंदर, आप लोड और DEX वर्गों में कॉल करना चाहते हैं, तो आप देख सकते हैं कि Dalvik वी एम शुरू कर दिया है, AndroidRuntime अंदर - उदाहरण के चौखटे के लिए/बेस/cmds/app_process/app_main.cpp:

status_t app_init(const char* className, int argc, const char* const argv[]) 
{ 
    LOGV("Entered app_init()!\n"); 

    AndroidRuntime* jr = AndroidRuntime::getRuntime(); 
    jr->callMain(className, argc, argv); 

    LOGV("Exiting app_init()!\n"); 
    return NO_ERROR; 
} 

के रूप में "जे आर" AndroidRuntime पहले से ही शुरू कर रहा है, callMain() कहा जाएगा:

status_t AndroidRuntime::callMain(
    const char* className, int argc, const char* const argv[]) 
{ 
    JNIEnv* env; 
    jclass clazz; 
    jmethodID methodId; 

    LOGD("Calling main entry %s", className); 

    env = getJNIEnv(); 
    if (env == NULL) 
     return UNKNOWN_ERROR; 

    clazz = findClass(env, className); 
    if (clazz == NULL) { 
     LOGE("ERROR: could not find class '%s'\n", className); 
     return UNKNOWN_ERROR; 
    } 

    methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); 
    if (methodId == NULL) { 
     LOGE("ERROR: could not find method %s.main(String[])\n", className); 
     return UNKNOWN_ERROR; 
    } 
<...> 
    env->CallStaticVoidMethod(clazz, methodId, strArray); 
    return NO_ERROR; 
} 

ऊपर से, हम देख सकते हैं कि DEX वर्गों 'कोड और लोड किए गए हैं CallStaticVoidMe thod() DEX कोडों की व्याख्या करना शुरू कर देगा।

2

मैंने जावा कक्षाएं उत्पन्न करने के लिए एएसएम और बीसीईएल का उपयोग किया है और फिर मैंने उन्हें डेक्स फ़ाइलों में परिवर्तित कर दिया है। डिवाइस पर गतिशील रूप से लोड करने के लिए अंत में मैं पैदा की है जार फ़ाइलों।

तुम मेरे कोड :)

https://github.com/sciruela/android

3

A related answer गतिशील Dalvik बाईटकोड पीढ़ी के लिए पता चलता है Dexmaker की जाँच कर सकते हैं।

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