Gradle transformClassesWithDexForDebug पर धीमी गति से निर्माण करें




android-build (5)

मुझे एक ही मुद्दे का सामना करना पड़ रहा था और अंत में इसे हल करने में लगभग 10 घंटे लग गए, इसलिए मुझे आपके अनुभव पता हैं।

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

लेकिन पर्याप्त बातचीत, इसे ठीक करने देता है। क्या ऐप: transformClassesWithDexForDebug 'यह है कि यह Dalvik (प्री-5.0, एपीआई 21) ओएस संस्करणों के लिए कुछ निर्भरताओं को हल करता है और क्या महत्वपूर्ण है - इसमें काफी समय लगता है। आपको विकास के लिए इसकी आवश्यकता नहीं होगी, क्योंकि आप अपने ऐप का परीक्षण> = 21 पर कर सकते हैं, इसलिए विकास और रिलीज के लिए अलग उत्पाद स्वाद बनाएं। यहां मेरा ग्रेडल बिल्ड है जो इसका उपयोग करता है:

apply plugin: 'com.android.application'

final VERSION_MAJOR = 0
final VERSION_MINOR = 0
final VERSION_PATCH = 0
final VERSION_BUILD = 1

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.app"
        minSdkVersion 15
        targetSdkVersion 23
        multiDexEnabled true
        versionName "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}"
        versionCode VERSION_MAJOR * 10000000 + VERSION_MINOR * 100000 + VERSION_PATCH * 1000 + VERSION_BUILD
    }

    dexOptions {
        incremental = true;
        preDexLibraries = false
        javaMaxHeapSize "2g"
    }


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        dev {
            minSdkVersion 21
            applicationId = "com.app.test"
        }
        prod {
            minSdkVersion 15
            applicationId = "com.app" // you don't need it, but can be useful

        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/ASL2.0'
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError true
    }

}

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = ['--multi-dex']
        } else {
            dx.additionalParameters += '--multi-dex'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
   ... 
}

अगली बात यह सुनिश्चित करना है कि आप वास्तव में इस ऐप के निर्माण के साथ अपना ऐप बना रहे हैं । व्यू -> टूल विंडोज़ पर क्लिक करें -> टूल बनाएं और सुनिश्चित करें कि आपके पास 'devDebug' पर सेट संस्करण बना है

कुछ लोगों के लिए यह पर्याप्त हो सकता है। मुझे एसओ में बहुत सारे थ्रेड मिले और रेडडिट पर भी जो इस उत्पाद स्वाद की चीज़ के साथ समाप्त हुआ, लेकिन इससे वास्तव में मेरी मदद नहीं हुई। मैन्युअल रूप से धीरे-धीरे उन्नयन करने में मुझे क्या मदद मिली। चूंकि आपने पहले ही ऐसा करने की कोशिश की है, मुझे लगता है कि आप सही रास्ते पर हैं, लेकिन मैं नए ग्रेडल संस्करण 2.9 का उपयोग करने का सुझाव दूंगा जिसमें 2.8 से अधिक '40% बेहतर प्रदर्शन ' है।

मेरे एंड्रॉइड ऐप को बनाने से मेरे कोड में प्रत्येक अपडेट के लिए लगभग 9 0 सेकंड ( "तेज़" ) लगते हैं। यह समय की पूरी बर्बादी है क्योंकि वास्तव में और मुझे लगता है कि एक समाधान पहुंच के भीतर होना चाहिए। मैंने इस मुद्दे की जांच करने की कोशिश की और सुझावों के साथ विभिन्न ब्लॉग-पोस्ट और एसओ जवाब पाए, जिनमें से अधिकांश मैंने कोशिश की है।

  • मेरे पास org.gradle.deamon = true के साथ gradle.properties फ़ाइल है
  • मैं ऑफलाइन काम करने के लिए ग्रैडल प्रीफेन्स के साथ एंड्रॉइड स्टूडियो पर चलाता हूं (बेहतर, लेकिन अभी भी धीमा)
  • मैं कमांड लाइन पर चलाता हूं (जो तेज़ है, लेकिन फिर भी धीमा है)
  • Build.gradle में, defaultConfig, मेरे पास multiDexEnabled को गलत पर सेट किया गया है
  • Build.gradle में, dexOptions, मेरे पास preDexLibraries गलत पर सेट है
  • Gradle-wrapper.properties में मैं एक हालिया ग्रेडल संस्करण (2.8) लाता हूं (2.4 में महत्वपूर्ण गति परिवर्तन हुआ)

ऐसी प्रक्रिया जो लंबे समय तक लगती है, कुल निर्माण समय का लगभग 85% है : ऐप: transformClassesWithDexForDebug

वास्तव में यह प्रक्रिया क्या कर रही है? मैं उन लोगों को ढूंढ सकता हूं जिन पर दुर्घटनाएं हैं, लेकिन यह मेरे लिए ठीक काम करता है, इस तथ्य को छोड़कर कि इसमें काफी समय लगता है। और क्या मुझे इसकी ज़रूरत है, क्योंकि मुझे इस बिंदु पर वास्तव में डेक्स की आवश्यकता नहीं है?

इसके अलावा, मेरे पास 13 निर्भरताएं और 3 टेस्ट कॉम्पिल निर्भरताएं हैं। मैं पहले से ही विशिष्ट प्ले पैकेज को इंगित करता हूं, इसलिए मैं उन चीजों को संकलित नहीं कर रहा हूं जिनकी मुझे आवश्यकता नहीं है। अगर मैं चीजों को सही ढंग से समझता हूं, तो धीरे-धीरे उन सभी पुस्तकालयों का निर्माण कर रहा है जो प्रत्येक परियोजना के निर्माण के साथ-साथ। यदि यह सही है, तो क्या इसे छोड़ने का कोई तरीका है? क्या मैं उन्हें खुद को लपेटा हुआ पुस्तकालयों के रूप में बना सकता हूं और उन्हें हर बार संसाधित करने की आवश्यकता के बिना शामिल कर सकता हूं? इससे मुझे निर्भरता में भावी परिवर्तनों के लिए कुछ लचीलापन मिल सकता है, लेकिन इस बिंदु पर मुझे लगता है कि मैं धीरे-धीरे धीरे-धीरे प्रतीक्षा करने के लिए एक घंटे में आसानी से खो रहा हूं। मुझे यकीन नहीं है कि लचीलापन मेरे लिए कितना लायक है।

मैं किसी भी पॉइंटर्स को प्राप्त करने की उम्मीद कर रहा हूं कि मैं अपनी बिल्ड प्रक्रिया को कैसे सुधार सकता हूं। पहले ही, आपका बहुत धन्यवाद।


यह एंड्रॉइड स्टूडियो 2.0 पूर्वावलोकन में पेश किए गए नए इंस्टेंट रन मैकेनिज्म के हिस्से की तरह लगता है, जो भविष्य में कोड पैच के लिए निष्पादन शाखा बनाने के लिए आपके ऐप में हर तरीके के उपकरण के लिए जिम्मेदार है। मुझे डर है इसलिए यही बेहद धीमी है।

यह अजीब बात है कि यह कार्य अभी भी हो रहा है भले ही तत्काल रन अक्षम हो। मुझे उस काम से बचने के लिए "com.android.tools.build:gradle" को 1.3.0 में डाउनग्रेड करना होगा।


क्या आपके एप्लिकेशन में डेटाबेस है? क्या डीबी का आकार बड़ा है?

अगर हाँ:

  • संपत्ति फ़ोल्डर से डीबी को हटाएं (या जहां भी आप इसे रखते हैं) और एक बिल्ड करें
  • निर्माण के समय में अंतर को मापें
  • मेरे मामले में: यह 45 सेकंड से 15 सेकंड तक नाटकीय अंतर था

यदि नही:

  • वृद्धिशील बिल्ड के दौरान ग्रैडल कंसोल की निगरानी करें और देखें कि कौन सा ऑपरेशन सबसे अधिक समय ले रहा है

केवल मेरे लिए काम किया गया समाधान तत्काल रन अक्षम करना था।

एंड्रॉइड स्टूडियो -> प्राथमिकताएं -> बिल्ड, निष्पादन, परिनियोजन -> त्वरित रन -> अनचेक करें 'तत्काल रन सक्षम करें [...]'

बिल्ड 2 मिनट से 40 सेकंड तक चला गया।


एंड्रॉइड स्टूडियो 2.1 और एंड्रॉइड ग्रैडल प्लगइन v2.1.0 में अपग्रेड करने से काफी हद तक मेरे लिए यह समस्या ठीक हो गई है। अद्यतन आईडीई स्थापित करने के बाद, आपको अपने ग्रैडल प्लगइन को भी अपडेट करने के लिए कहा जाना चाहिए। यदि आपकी रूट build.gradle फ़ाइल में निम्न पंक्ति है तो आपको पता चलेगा कि आपके पास सही संस्करण है:

classpath 'com.android.tools.build:gradle:2.1.0'

महत्वपूर्ण: अपग्रेड करने के अलावा, आपको 2048 एमबी तक ग्रैडल डिमन को आवंटित स्मृति की मात्रा में भी वृद्धि करने की आवश्यकता है, इसलिए यह प्रक्रिया में इस महंगे डेक्स-आईएनजी चरण को निष्पादित कर सकता है। ऐसा करने के लिए, अपनी रूट gradle.properties फ़ाइल में निम्न जोड़ें:

org.gradle.jvmargs = -Xmx2048m

मेरे ऊपर उपरोक्त प्रश्न में अनुभवी धीमी बिल्डिंग समय थी, लेकिन मेरी बिल्ड गति को अपग्रेड करने के बाद नाटकीय रूप से वृद्धि हुई। अधिक जानकारी के लिए एंड्रॉइड ग्रैडल प्लगइन v2.1.0 के लिए रिलीज नोट देखें:

http://developer.android.com/tools/revisions/gradle-plugin.html







android-build