অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.0.0 (অক্টোবর 2017)

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.0.0-এ বিভিন্ন ধরনের পরিবর্তন রয়েছে যার লক্ষ্য বড় প্রকল্পের পারফরম্যান্স সমস্যা সমাধান করা।

উদাহরণস্বরূপ, ~130 মডিউল এবং বিপুল সংখ্যক বাহ্যিক নির্ভরতা সহ একটি নমুনা কঙ্কাল প্রকল্পে (কিন্তু কোনও কোড বা সংস্থান নেই), আপনি নিম্নলিখিতগুলির মতো কর্মক্ষমতা উন্নতি অনুভব করতে পারেন:

অ্যান্ড্রয়েড প্লাগইন সংস্করণ + গ্রেডল সংস্করণ অ্যান্ড্রয়েড প্লাগইন 2.2.0 + গ্রেডল 2.14.1 অ্যান্ড্রয়েড প্লাগইন 2.3.0 + গ্রেডল 3.3 অ্যান্ড্রয়েড প্লাগইন 3.0.0 + গ্রেডল 4.1
কনফিগারেশন (যেমন চলমান ./gradlew --help ) ~2 মিনিট ~9 সেকেন্ড ~2.5 সেকেন্ড
1-লাইন জাভা পরিবর্তন (বাস্তবায়ন পরিবর্তন) ~2 মিনিট 15 সেকেন্ড ~২৯ সেকেন্ড ~6.4 সেকেন্ড

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

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

অ্যান্ড্রয়েড প্লাগইনের এই সংস্করণটির জন্য নিম্নলিখিতগুলি প্রয়োজন:

  • গ্রেডেল 4.1 বা উচ্চতর। আরও জানতে, Gradle আপডেট করার বিষয়ে বিভাগটি পড়ুন।
  • বিল্ড টুল 26.0.2 বা উচ্চতর। এই আপডেটের সাথে, আপনাকে আর বিল্ড সরঞ্জামগুলির জন্য একটি সংস্করণ নির্দিষ্ট করতে হবে না — প্লাগইনটি ডিফল্টরূপে ন্যূনতম প্রয়োজনীয় সংস্করণ ব্যবহার করে। সুতরাং, আপনি এখন android.buildToolsVersion প্রপার্টি মুছে ফেলতে পারেন।

3.0.1 (নভেম্বর 2017)

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

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

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

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

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

    • ডিভাইসে টেস্ট অর্কেস্ট্রেশন ব্যবহার করবেন কিনা তা নির্ধারণ করতে testOptions.execution যোগ করা হয়েছে। আপনি যদি অ্যান্ড্রয়েড টেস্ট অর্কেস্ট্রেটর ব্যবহার করতে চান, তাহলে আপনাকে ANDROID_TEST_ORCHESTRATOR উল্লেখ করতে হবে, যেমনটি নীচে দেখানো হয়েছে৷ ডিফল্টরূপে, এই বৈশিষ্ট্যটি HOST এ সেট করা আছে, যা ডিভাইসে অর্কেস্ট্রেশন অক্ষম করে এবং পরীক্ষা চালানোর আদর্শ পদ্ধতি।

    গ্রোভি

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    কোটলিন

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

    গ্রোভি

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

    কোটলিন

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • Roboelectric এর মতো অ্যান্ড্রয়েড রিসোর্স প্রয়োজন এমন ইউনিট পরীক্ষাগুলিকে সমর্থন করার জন্য testOptions.unitTests.includeAndroidResources যোগ করা হয়েছে। আপনি যখন এই বৈশিষ্ট্যটিকে 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 স্তর 26) এ চালু করা হয়েছে)।
  • 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 native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    কোটলিন

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • অ্যান্ড্রয়েড স্টুডিও থেকে নেটিভ প্রোজেক্ট তৈরি করার সময় আপনি এখন 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')
            }
            

    কোটলিন

            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"))
            }
            

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

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

    গ্রোভি

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

    কোটলিন

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