Android Gradle প্লাগ-ইন 3.0.0 (অক্টোবর ২০১৭)

Android Gradle প্লাগ-ইন 3.0.0-এ বিভিন্ন ধরনের পরিবর্তন অন্তর্ভুক্ত আছে যার লক্ষ্য হল বড় প্রোজেক্টের পারফর্ম্যান্স সংক্রান্ত সমস্যার সমাধান করা।

যেমন, ~১৩০টি মডিউল এবং প্রচুর সংখ্যক বাহ্যিক ডিপেন্ডেন্সি (কিন্তু কোনও কোড বা রিসোর্স নেই) সহ একটি স্যাম্পেল স্কেলিটন প্রজেক্টে, আপনি নিম্নলিখিতগুলির মতো পারফর্ম্যান্সের উন্নতি অভিজ্ঞতা করতে পারেন:

Android প্লাগ-ইন ভার্সন + Gradle ভার্সন Android প্লাগ-ইন 2.2.0 + Gradle 2.14.1 Android প্লাগ-ইন 2.3.0 + Gradle 3.3 Android প্লাগ-ইন 3.0.0 + Gradle 4.1
কনফিগারেশন (যেমন, ./gradlew --help চলছে) ~২ মিনিট ~৯ সেকেন্ড ~২.৫ সেকেন্ড
১-লাইন জাভা পরিবর্তন (প্রয়োগ সংক্রান্ত পরিবর্তন) ~২ মিনিট ১৫ সেকেন্ড ~২৯ সেকেন্ড ~৬.৪ সেকেন্ড

এইসব পরিবর্তনের মধ্যে কিছু পরিবর্তন আগে থেকে থাকা বিল্ডকে ভেঙে দেয়। তাই, নতুন প্লাগ-ইন ব্যবহার করার আগে আপনার প্রোজেক্ট মাইগ্রেট করার
ব্যাপারে বিবেচনা করা উচিত।

উপরে বর্ণিত পারফর্ম্যান্সের উন্নতি আপনি দেখতে না পেলে, বাগ ফাইল করুন এবং Gradle Profiler ব্যবহার করে আপনার বিল্ডের ট্রেস অন্তর্ভুক্ত করুন।

Android প্লাগ-ইনের এই ভার্সনের জন্য নিম্নলিখিতগুলি প্রয়োজন:

সর্বনিম্ন ভার্সন ডিফল্ট ভার্সন নোট
Gradle ৪.১ ৪.১ আরও জানতে, Gradle আপডেট করা দেখুন।
SDK বিল্ড টুল ২৬.০.২ ২৬.০.২ SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন। এই আপডেটের ফলে, আপনাকে আর বিল্ড টুলের জন্য কোনও ভার্সন উল্লেখ করতে হবে না—প্লাগ-ইন ডিফল্ট হিসেবে ন্যূনতম প্রয়োজনীয় ভার্সন ব্যবহার করে। তাই, আপনি এখন android.buildToolsVersion প্রপার্টি সরিয়ে দিতে পারবেন।

৩.০.১ (নভেম্বর ২০১৭)

Android Studio 3.0.1-এর জন্য এই ছোট আপডেটটি করা হয়েছে এবং এতে সাধারণ সমস্যার সমাধান ও পারফর্ম্যান্স সংক্রান্ত উন্নতি অন্তর্ভুক্ত আছে।

অপ্টিমাইজেশন

  • একটি ফাইন গ্রেইনড টাস্ক গ্রাফের মাধ্যমে মাল্টি-মডিউল প্রোজেক্টের জন্য আরও ভালো প্যারালেলিজম।
  • ডিপেন্ডেন্সিতে পরিবর্তন করার সময়, Gradle দ্রুত বিল্ড করে। এটি করার জন্য, যেসব মডিউলের ডিপেন্ডেন্সির API-তে অ্যাক্সেস নেই, সেগুলি আবার কম্পাইল করা হয় না। কোন ডিপেন্ডেন্সি অন্য মডিউলে API লিক করে তা আপনাকে সীমাবদ্ধ করতে হবে। এর জন্য Gradle-এর নতুন ডিপেন্ডেন্সি কনফিগারেশন ব্যবহার করুন: implementation, api, compileOnly, এবং runtimeOnly।
  • প্রতি-ক্লাস ডেক্সিংয়ের কারণে আরও দ্রুত ইনক্রিমেন্টাল বিল্ড স্পিড। প্রতিটি ক্লাস এখন আলাদা DEX ফাইলে কম্পাইল করা হয় এবং শুধুমাত্র পরিবর্তিত ক্লাসগুলি আবার ডেক্স করা হয়। এছাড়াও, যেসব অ্যাপ minSdkVersion ২০ বা তার কম সেট করে এবং লিগেসি মাল্টি-ডেক্স ব্যবহার করে, সেগুলির ক্ষেত্রে বিল্ড স্পিড উন্নত হবে বলে আশা করতে পারেন।
  • ক্যাশে করা আউটপুট ব্যবহার করার জন্য নির্দিষ্ট কিছু টাস্ক অপ্টিমাইজ করে বিল্ড স্পিড উন্নত করা হয়েছে। এই অপ্টিমাইজেশন থেকে সুবিধা পেতে, আপনাকে প্রথমে Gradle বিল্ড ক্যাশে চালু করতে হবে।
  • AAPT2 ব্যবহার করে উন্নত ইনক্রিমেন্টাল রিসোর্স প্রসেসিং, যা এখন ডিফল্ট হিসেবে চালু করা হয়েছে। AAPT2 ব্যবহার করার সময় কোনও সমস্যা হলে, সমস্যা সম্পর্কে অভিযোগ জানান। এছাড়াও, আপনি gradle.properties ফাইলে android.enableAapt2=false সেট করে AAPT2 বন্ধ করতে পারেন এবং কমান্ড লাইন থেকে ./gradlew --stop রান করে Gradle ডেমন রিস্টার্ট করতে পারেন।

নতুন বৈশিষ্ট্য

  • ভেরিয়েন্ট-অ্যাওয়ার ডিপেন্ডেন্সি ম্যানেজমেন্ট। মডিউলের কোনও নির্দিষ্ট ভ্যারিয়েন্ট তৈরি করার সময়, প্লাগ-ইন এখন আপনি যে মডিউলের ভ্যারিয়েন্ট তৈরি করছেন তার সাথে লোকাল লাইব্রেরি মডিউল ডিপেন্ডেন্সির ভ্যারিয়েন্ট অটোমেটিক ম্যাচ করে।
  • এতে নতুন ফিচার মডিউল প্লাগ-ইন অন্তর্ভুক্ত আছে যা Android Instant Apps এবং Android Instant Apps SDK-কে (যা আপনি SDK ম্যানেজার ব্যবহার করে ডাউনলোড করতে পারবেন) সাপোর্ট করে। নতুন প্লাগ-ইন দিয়ে ফিচার মডিউল তৈরি করার ব্যাপারে আরও জানতে, একাধিক ফিচার সহ ইনস্ট্যান্ট অ্যাপের গঠন পড়ুন।
  • নির্দিষ্ট কিছু Java 8 ভাষা ফিচার ও Java 8 লাইব্রেরি ব্যবহার করার জন্য বিল্ট-ইন সহায়তা। Jack এখন বাতিল করা হয়েছে এবং আর প্রয়োজন নেই এবং ডিফল্ট টুলচেনে উন্নত Java 8 সাপোর্ট ব্যবহার করতে আপনাকে প্রথমে Jack বন্ধ করতে হবে। আরও তথ্যের জন্য, Java 8 ল্যাঙ্গুয়েজ ফিচার ব্যবহার করুন নিবন্ধটি পড়ুন।
  • Android Test Orchestrator-এর মাধ্যমে টেস্ট চালানোর জন্য সহায়তা যোগ করা হয়েছে, যা আপনাকে ইনস্ট্রুমেন্টেশনের নিজস্ব ইনভোকেশনের মধ্যে আপনার প্রতিটি অ্যাপের টেস্ট চালাতে দেয়। কারণ প্রতিটি টেস্ট তার নিজস্ব ইন্সট্রুমেন্টেশন ইনস্ট্যান্সে চলে, টেস্টের মধ্যে কোনও শেয়ার করা স্টেট আপনার ডিভাইসের CPU বা মেমরিতে জমা হয় না। এমনকি, একটি টেস্ট ক্র্যাশ করলেও, এটি শুধুমাত্র নিজের ইন্সট্রুমেন্টেশন ইনস্ট্যান্স বন্ধ করে দেয়, তাই আপনার অন্যান্য টেস্ট এখনও রান করে।

    • অন-ডিভাইস টেস্ট অর্কেস্ট্রেশন ব্যবহার করা হবে কিনা তা নির্ধারণ করতে testOptions.execution যোগ করা হয়েছে। আপনি যদি Android Test Orchestrator ব্যবহার করতে চান, তাহলে আপনাকে নিচে দেখানো ANDROID_TEST_ORCHESTRATOR উল্লেখ করতে হবে। ডিফল্ট হিসেবে, এই প্রপার্টি HOST-এ সেট করা থাকে, যা অন-ডিভাইস অর্কেস্ট্রেশন বন্ধ করে দেয় এবং টেস্ট চালানোর স্ট্যান্ডার্ড পদ্ধতি।

    গ্ৰুভি

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • নতুন androidTestUtil ডিপেন্ডেন্সি কনফিগারেশন আপনাকে আপনার ইন্সট্রুমেন্টেশন টেস্ট চালানোর আগে আরেকটি টেস্ট হেল্পার APK ইনস্টল করার অনুমতি দেয়, যেমন Android Test Orchestrator:

    গ্ৰুভি

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • Android রিসোর্স প্রয়োজন এমন ইউনিট টেস্টে সহায়তা করার জন্য testOptions.unitTests.includeAndroidResources যোগ করা হয়েছে, যেমন Roboelectric। আপনি এই প্রপার্টি true-এ সেট করলে, প্লাগ-ইন আপনার ইউনিট টেস্ট রান করার আগে রিসোর্স, অ্যাসেট ও ম্যানিফেস্ট মার্জ করে। আপনার টেস্ট তখন নিম্নলিখিত কীগুলির জন্য ক্লাসপাথে com/android/tools/test_config.properties পরীক্ষা করতে পারে:

    • android_merged_assets: মার্জ করা অ্যাসেট ডিরেক্টরির অ্যাবসোলিউট পাথ।

      মনে রাখবেন: লাইব্রেরি মডিউলের ক্ষেত্রে, মার্জ করা অ্যাসেটে ডিপেন্ডেন্সির অ্যাসেট থাকে না (সমস্যা #65550419 দেখুন)।

    • android_merged_manifest: মার্জ করা ম্যানিফেস্ট ফাইলের অ্যাবসোলিউট পাথ।

    • android_merged_resources: মার্জ করা রিসোর্স ডিরেক্টরির অ্যাবসোলিউট পাথ, যার মধ্যে মডিউল ও তার সব ডিপেন্ডেন্সির সব রিসোর্স থাকে।

    • android_custom_package: ফাইনাল R ক্লাসের প্যাকেজের নাম। আপনি যদি অ্যাপ্লিকেশন আইডি ডাইনামিকভাবে পরিবর্তন করেন, তাহলে এই প্যাকেজের নাম অ্যাপের ম্যানিফেস্টে package অ্যাট্রিবিউটের সাথে নাও মিলতে পারে।

  • রিসোর্স হিসেবে ফন্ট (যা Android 8.0 (API লেভেল ২৬)-এ নতুন ফিচার হিসেবে চালু করা হয়েছে) ব্যবহারের সুবিধা।
  • Android Instant Apps SDK 1.1 এবং তার পরবর্তী ভার্সনে ভাষা-নির্দিষ্ট APK-এর জন্য সহায়তা।
  • আপনি এখন আপনার এক্সটার্নাল নেটিভ বিল্ড প্রোজেক্টের জন্য আউটপুট ডিরেক্টরি পরিবর্তন করতে পারবেন, যেমন নিচে দেখানো হয়েছে:

    গ্ৰুভি

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external C/C++
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external C/C++
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • Android Studio থেকে নেটিভ প্রোজেক্ট তৈরি করার সময় আপনি এখন CMake 3.7 বা তার পরবর্তী ভার্সন ব্যবহার করতে পারবেন।
  • নতুন lintChecks ডিপেন্ডেন্সি কনফিগারেশন আপনাকে JAR তৈরি করতে দেয় যা কাস্টম লিন্ট নিয়ম নির্ধারণ করে এবং আপনার AAR ও APK প্রোজেক্টে এটি প্যাকেজ করে।

    আপনার কাস্টম লিন্ট নিয়ম অবশ্যই একটি পৃথক প্রোজেক্টের অন্তর্গত হতে হবে যা একটি একক JAR আউটপুট করে এবং শুধুমাত্র compileOnly নির্ভরতা অন্তর্ভুক্ত করে। অন্যান্য অ্যাপ এবং লাইব্রেরি মডিউলগুলি তখন আপনার লিন্ট প্রজেক্টের উপর নির্ভর করতে পারে lintChecks কনফিগারেশন ব্যবহার করে:

    গ্ৰুভি

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

আচরণগত পরিবর্তন

  • Android প্লাগ-ইন 3.0.0 নির্দিষ্ট কিছু API সরিয়ে দেয় এবং আপনি সেগুলি ব্যবহার করলে আপনার বিল্ড ভেঙে যাবে। যেমন, আপনি আর outputFile() অবজেক্ট অ্যাক্সেস করতে Variants API ব্যবহার করতে পারবেন না অথবা প্রতিটি ভ্যারিয়েন্টের জন্য ম্যানিফেস্ট ফাইল পেতে processManifest.manifestOutputFile() ব্যবহার করতে পারবেন না। আরও জানতে, API-তে হওয়া পরিবর্তন পড়ুন।
  • আপনাকে আর বিল্ড টুলের জন্য কোনও ভার্সন উল্লেখ করতে হবে না (তাই, আপনি এখন android.buildToolsVersion প্রপার্টি সরাতে পারবেন)। ডিফল্ট হিসেবে, প্লাগ-ইন অটোমেটিক আপনার ব্যবহার করা Android প্লাগ-ইনের ভার্সনের জন্য প্রয়োজনীয় ন্যূনতম বিল্ড টুল ভার্সন ব্যবহার করে।
  • আপনি এখন buildTypes ব্লকে PNG ক্রাঞ্চিং চালু/বন্ধ করতে পারবেন, যেমন নিচে দেখানো হয়েছে। ডিবাগ বিল্ড ছাড়া সব বিল্ডের জন্য ডিফল্ট হিসেবে PNG ক্রাঞ্চিং চালু করা থাকে কারণ এটি প্রোজেক্টের জন্য বিল্ড টাইম বাড়িয়ে দেয়, যার মধ্যে অনেক PNG ফাইল থাকে। তাই, অন্যান্য ধরনের বিল্ডের জন্য বিল্ড টাইম উন্নত করতে, আপনাকে PNG ক্রাঞ্চিং বন্ধ করতে হবে অথবা আপনার ছবি WebP-তে কনভার্ট করতে হবে।

    গ্ৰুভি

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • Android প্লাগ-ইন এখন অটোমেটিক এক্সিকিউটেবল টার্গেট তৈরি করে যা আপনি নিজের এক্সটার্নাল CMake প্রোজেক্টে কনফিগার করেন।
  • আপনাকে এখন annotationProcessor ডিপেন্ডেন্সি কনফিগারেশন ব্যবহার করে প্রসেসর ক্লাসপাথে অ্যানোটেশন প্রসেসর যোগ করতে হবে।
  • বন্ধ হয়ে যাওয়া ndkCompile ব্যবহার করার উপর এখন আরও বেশি বিধিনিষেধ আরোপ করা হয়েছে। পরিবর্তে, আপনার APK-তে প্যাকেজ করতে চান এমন নেটিভ কোড কম্পাইল করতে CMake বা ndk-build ব্যবহার করার জন্য মাইগ্রেট করা উচিত। আরও জানতে, ndkcompile থেকে মাইগ্রেট করুন নিবন্ধটি পড়ুন।