2012-10-30 22 views
10

के साथ अलग एंड्रॉइड मॉड्यूल का निर्माण करना मेरे थीसिस के लिए, मैं एंड्रॉइड फ्रेमवर्क को संशोधित कर रहा हूं और स्रोत (4.1.1 जेली बीन) का निर्माण कर रहा हूं। मैं एक पूर्ण निर्माण कर सकता हूं, लेकिन क्योंकि यह बहुत समय ले रहा है (मैं उबंटू 12.04 64 बिट आभासी मशीन पर विकास कर रहा हूं) मैं अलग मॉड्यूल बनाना चाहता हूं।dexpreopt अक्षम

उदाहरण के लिए: जब स्थान मॉड्यूल में परिवर्तन कर रही है, यह सिर्फ बदली हुई मॉड्यूल का निर्माण, और एक नया सिस्टम छवि बनाने के लिए संभव हो जाना चाहिए:

mmm frameworks/base 
make snod 

लेकिन यह काम नहीं करता। हर बार जब मैं बूट करने के लिए प्रयास करते हैं, नई प्रणाली छवि की वजह से बूट नहीं करेगा:

I/dalvikvm(1696): DexOpt: mismatch dep signature for '/system/framework/framework.odex' 

कुछ शोध के बाद, मैं पर्यावरण चर

export $WITH_DEXPREOPT=false 

और

export $DISABLE_DEXPREOPT=true 
साथ dexpreopt को निष्क्रिय करने की कोशिश की

और 'इंस्टॉल इंस्टॉल करें' के साथ एक पूर्ण पुनर्निर्माण कर रहा है। पूर्ण पुनर्निर्माण कार्य करता है, और ढांचे में परिवर्तन निर्माण में मौजूद हैं। लेकिन एक नया बदलाव करने के बाद भी, 'mmm ढांचे/आधार' और 'स्नोड' परिणाम का परिणाम dexpreopt mismatch में होता है। 'चेतावनी:: dexpreopt के साथ सक्षम, आप एक पूर्ण पुनर्निर्माण पड़ सकता है।' है, जो makefile में इस लाइन से आता है:

ifeq (true,$(WITH_DEXPREOPT)) 
$(warning Warning: with dexpreopt enabled, you may need a full rebuild.) 
endif 

निर्माण/कोर/'snod बनाने' से makefile भी चेतावनी देता है

इससे मुझे विश्वास है कि $ WITH_DEXPREOPT चर सही ढंग से सेट या पढ़ा नहीं गया है? अभी तक मैं एक पूर्ण पूर्ण पुनर्निर्माण किए बिना बूट करने योग्य सिस्टम छवि प्राप्त करने में सक्षम नहीं हूं। क्या प्रक्रिया मैं dexpreopt को अक्षम करने के लिए सही का पालन करता हूं, या ढांचे में परिवर्तन करने और नई प्रणाली छवि प्राप्त करने के बाद अलग मॉड्यूल बनाने के अन्य तरीके हैं?

बिल्ड लक्ष्य 'पूर्ण-इंजन' है।

उत्तर

11

जाहिर WITH_DEXPREOPT वातावरण चर

build/target/board/generic/BoardConfig.mk 

में एक आंतरिक WITH_DEXPREOPT चर द्वारा ओवरराइट है झूठे को यह बदल रहा है, या गूगल समूहों में लोगों के अनुसार, के साथ एक कर शुरू कर:

make showcommands WITH_DEXPREOPT=false 

उसने चाल चली। एक विशिष्ट मॉड्यूल का निर्माण करना और एक नई सिस्टम छवि बनाना अब बूट करने योग्य निर्माण में परिणाम देता है।

(स्रोत: https://groups.google.com/d/topic/android-building/vJCkg8Yq9Ic/discussion)

+1

धन्यवाद! कुछ कारणों से एक स्वच्छ पुनर्निर्माण के बाद भी स्रोत कोड में परिवर्तन एमुलेटर में दिखाई नहीं दे रहा था। एक क्लीन साफ ​​करने के बाद चर सेट करना और इसे ठीक करना इंस्टॉल करें। हालांकि, जब मैंने कोड में एक और परिवर्तन किया, तो एमएमएम फ्रेमवर्क/बेस का इस्तेमाल किया, और फिर स्नोड बना दिया, एम्यूलेटर बूट नहीं होगा (जिसका अर्थ है कि यह "एंड्रॉइड" स्क्रीन पर फंस गया था ")। साफ करने के बाद आपके सटीक आदेश क्या थे शोकॉमैंड्स का उपयोग करके निर्माण करें I_DEXPREOPT = झूठी? क्या आपने हर बार स्नोड बनाया है या हर बार जब आप परिवर्तन करते हैं तो हमेशा के साथ इन_डीएक्सपीआरओपीटी = झूठी का उपयोग करते हैं? –

+1

मैंने मेक शोकैंड्स का उपयोग करके इसका परीक्षण नहीं किया है IDEXPREOPT = false कमांड, मैंने इसे बोर्ड कॉन्फिग में बदल दिया है। एमके और एक साफ साफ और एक पूर्ण पुनर्निर्माण किया था।इस बिंदु से परिवर्तन के लिए उदाहरण के लिए स्थान मॉड्यूल 'एमएमएम फ्रेमवर्क/बेस' और 'स्नोड' बनाने के बाद निर्माण में बने रहे। यदि आपका एमुलेटर बूट नहीं करता है, तो समस्या को इंगित करने के लिए 'adb logcat' का उपयोग करके जांचें। – b74ckb1rd