অ্যান্ড্রয়েড গ্রেডল প্লাগইন এপিআই আপডেট

এই পৃষ্ঠাটি অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) এপিআই অবচয় এবং অপসারণ ট্র্যাক করে এবং সেই অনুযায়ী আপনার কোড কীভাবে আপডেট করতে হয় সে সম্পর্কে তথ্য প্রদান করে।

API অপসারণ এবং অপসারণ ট্র্যাকার

AGP সংস্করণের পরিপ্রেক্ষিতে যখন AGP API গুলিকে অবমূল্যায়ন করা হয় এবং সরানো হয় তখন নিম্নলিখিত সারণীটি সংক্ষিপ্ত করে।

API AGP সংস্করণে অবচয় এজিপি সংস্করণ থেকে সরানো হয়েছে
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
রেন্ডারস্ক্রিপ্ট 7.2
রূপান্তর 7.2 ৮.০

এজিপি 8.0

নিম্নলিখিত AGP 8.0 এর জন্য গুরুত্বপূর্ণ API আপডেট রয়েছে।

Transform API সরানো হয়েছে

AGP 8.0 দিয়ে শুরু করে, Transform API সরানো হয়েছে। এর মানে হল com.android.build.api.transform প্যাকেজের সমস্ত ক্লাস মুছে ফেলা হয়েছে।

বিল্ড কর্মক্ষমতা উন্নত করতে Transform API সরানো হচ্ছে। ট্রান্সফর্ম এপিআই ব্যবহার করে এমন প্রকল্পগুলি এজিপিকে বিল্ডের জন্য কম অপ্টিমাইজ করা প্রবাহ ব্যবহার করতে বাধ্য করে যার ফলে বিল্ড টাইমে বড় রিগ্রেশন হতে পারে। ট্রান্সফর্ম এপিআই ব্যবহার করা এবং অন্যান্য গ্রেডল বৈশিষ্ট্যের সাথে এটি একত্রিত করাও কঠিন; প্রতিস্থাপন API-এর লক্ষ্য হল কর্মক্ষমতা প্রবর্তন না করে বা সঠিকতার সমস্যা তৈরি না করে AGP প্রসারিত করা সহজতর করা।

প্রতিস্থাপন API

ট্রান্সফর্ম API-এর জন্য কোনো একক প্রতিস্থাপন নেই—প্রতিটি ব্যবহারের ক্ষেত্রে নতুন, লক্ষ্যযুক্ত API রয়েছে। সমস্ত প্রতিস্থাপন API গুলি androidComponents {} ব্লকে রয়েছে৷ এই API গুলি AGP 7.2 দ্বারা উপলব্ধ।

বাইটকোড রূপান্তর করার জন্য সমর্থন

বাইটকোড রূপান্তর করতে, ইন্সট্রুমেন্টেশন API ব্যবহার করুন। লাইব্রেরির জন্য, আপনি শুধুমাত্র স্থানীয় প্রজেক্ট ক্লাসের জন্য একটি ইন্সট্রুমেন্টেশন নিবন্ধন করতে পারেন; অ্যাপস এবং পরীক্ষার জন্য, আপনি স্থানীয় এবং দূরবর্তী নির্ভরতা সহ শুধুমাত্র স্থানীয় ক্লাস বা সমস্ত ক্লাসের জন্য একটি ইন্সট্রুমেন্টেশন নিবন্ধন করতে বেছে নিতে পারেন। এই API ব্যবহার করার জন্য, ক্লাসপথের অন্যান্য ক্লাসে সীমিত অ্যাক্সেস সহ প্রতিটি ক্লাসে ইনস্ট্রুমেন্টেশন স্বাধীনভাবে চলে (আরো তথ্যের জন্য createClassVisitor() দেখুন)। এই সীমাবদ্ধতা সম্পূর্ণ এবং ক্রমবর্ধমান উভয় বিল্ডের কর্মক্ষমতা উন্নত করে এবং API পৃষ্ঠকে সহজ রাখে। প্রতিটি লাইব্রেরি প্রস্তুত হওয়ার সাথে সাথে সমান্তরালভাবে উপকরণ তৈরি করা হয়, বরং সমস্ত সংকলন সম্পূর্ণ হওয়ার পরে। উপরন্তু, একটি একক শ্রেণীতে পরিবর্তনের অর্থ হল শুধুমাত্র প্রভাবিত শ্রেণীগুলিকে ক্রমবর্ধমান বিল্ডে পুনর্নিয়ন্ত্রিত করতে হবে। কিভাবে Instrumentation API ব্যবহার করবেন তার উদাহরণের জন্য, ASM AGP রেসিপি সহ ট্রান্সফর্মিং ক্লাস দেখুন।

আপনার অ্যাপে জেনারেট করা ক্লাস যোগ করার জন্য সমর্থন

অ্যাপে অতিরিক্ত জেনারেট করা ক্লাস যোগ করতে, MultipleArtifact.ALL_CLASSES_DIRS এর সাথে Artifacts API ব্যবহার করুন। বিশেষ করে, ব্যবহার করুন

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

MultipleArtifact.ALL_CLASSES_DIRS সহ প্রজেক্ট ক্লাসে অতিরিক্ত জেনারেটেড ডিরেক্টরি যুক্ত করতে। Artifacts API স্বয়ংক্রিয়ভাবে আউটপুট করার জন্য আপনার কাস্টম টাস্কের জন্য একটি অনন্য অবস্থান নির্বাচন করবে। কিভাবে এই API ব্যবহার করবেন তার উদাহরণের জন্য addToAllClasses রেসিপি দেখুন।

পুরো প্রোগ্রাম বিশ্লেষণের উপর ভিত্তি করে রূপান্তরের জন্য সমর্থন

পুরো প্রোগ্রাম বিশ্লেষণের উপর ভিত্তি করে রূপান্তর বাস্তবায়ন করতে, সমস্ত শ্রেণী একসাথে একটি একক কাজে রূপান্তরিত হতে পারে। এই পদ্ধতিটি সাবধানতার সাথে ব্যবহার করা উচিত কারণ এটির ইন্সট্রুমেন্টেশন API ব্যবহার করার চেয়ে অনেক বেশি বিল্ড পারফরম্যান্স খরচ রয়েছে। যদি আপনার প্লাগইন এই API ব্যবহার করে, তাহলে বিল্ড টাইপের প্রতি রূপান্তর অপ্ট-ইন করার পরামর্শ দেওয়া হয়, যাতে অ্যাপ ডেভেলপার এটিকে ডেভেলপমেন্ট বিল্ডের জন্য অক্ষম করতে পারে।

একটি কাজ নিবন্ধন করতে যা সমস্ত ক্লাসকে একসাথে রূপান্তরিত করে, Android Gradle প্লাগইন 7.4 Artifacts.forScope API প্রবর্তন করে। বর্তমান প্রজেক্টের সমস্ত ক্লাস রুপান্তর করতে, Artifacts.forScope.PROJECT ব্যবহার করুন। বর্তমান প্রকল্প, আমদানি করা প্রকল্প এবং সমস্ত বাহ্যিক নির্ভরতাগুলির সমস্ত শ্রেণিকে রূপান্তর করতে, Artifacts.forScope.ALL ব্যবহার করুন। নিম্নলিখিত কোডটি দেখায় কিভাবে Artifacts.forScope.ALL ব্যবহার করতে হয় এমন একটি টাস্ক নিবন্ধন করতে যা সমস্ত ক্লাসকে একসাথে রূপান্তরিত করে:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

এই APIটি কীভাবে ব্যবহার করবেন তার উদাহরণের জন্য modifyProjectClasses রেসিপিটি দেখুন এবং Android বিল্ড প্রকারে কাস্টম এক্সটেনশনগুলি কীভাবে নিবন্ধন করবেন তার উদাহরণের জন্য কাস্টমাইজএজিপিডিএসএল রেসিপি দেখুন৷

যদি আপনার ব্যবহারের ক্ষেত্রে Android কম্পোনেন্ট এপিআইগুলির কোনোটি দ্বারা আচ্ছাদিত না হয়, দয়া করে একটি বাগ ফাইল করুন

ফায়ারবেস পারফরম্যান্স মনিটরিং প্লাগইন (1.4.1 এজিপি 8.0 এর সাথে সামঞ্জস্যপূর্ণ) এবং হিল্ট গ্রেডল প্লাগইন (2.40.1 এজিপি 8.0 এর সাথে সামঞ্জস্যপূর্ণ) সহ বেশ কিছু সাধারণভাবে ব্যবহৃত প্লাগইন ইতিমধ্যেই এই নতুন APIগুলি ব্যবহার করতে স্থানান্তরিত হয়েছে। এজিপি আপগ্রেড সহকারী প্রজেক্ট ডেভেলপারদের প্রয়োজন অনুযায়ী সাধারণত ব্যবহৃত প্লাগইন আপগ্রেড করতে সাহায্য করবে।

আপনি যদি থার্ড-পার্টি প্লাগইনের মাধ্যমে ট্রান্সফর্ম API ব্যবহার করেন, তাহলে অনুগ্রহ করে লেখককে জানান যে তাদের প্লাগইনটি AGP 8.0-এর জন্য নতুন API-এর সাথে কাজ করার জন্য আপডেট করা প্রয়োজন।

AGP 7.2

নিম্নলিখিতগুলি AGP 7.2-এর জন্য গুরুত্বপূর্ণ API আপডেট।

রেন্ডারস্ক্রিপ্ট বন্ধ করা হয়েছে

AGP 7.2 দিয়ে শুরু করে, RenderScript API গুলিকে অবমূল্যায়ন করা হয়েছে। তারা কাজ করতে থাকবে, কিন্তু সতর্কতা জারি করবে এবং AGP-এর ভবিষ্যত সংস্করণে সম্পূর্ণরূপে সরানো হবে। রেন্ডারস্ক্রিপ্ট থেকে কীভাবে স্থানান্তর করা যায় তার নির্দেশনার জন্য, রেন্ডারস্ক্রিপ্ট থেকে মাইগ্রেট দেখুন।

Component.transformClassesWith এবং Component.setAsmFramesComputationMode বাতিল করা হয়েছে

AGP 7.2 দিয়ে শুরু করে, ক্লাস বাইটকোড ইন্সট্রুমেন্টেশন APIs Component.transformClassesWith এবং Component.setAsmFramesComputationMode বাতিল করা হয়েছে। তারা একটি নতুন ব্লকে চলে গেছে, Component.instrumentation , যেটিতে ইনস্ট্রুমেন্টেশন প্রক্রিয়া কনফিগার করার সাথে সম্পর্কিত সমস্ত API রয়েছে। এই ইন্সট্রুমেন্টেশন বৈশিষ্ট্যগুলি ব্যবহার চালিয়ে যেতে, এর পরিবর্তে নতুন ব্লকে সংশ্লিষ্ট API ব্যবহার করুন, নিম্নলিখিত কোড স্নিপেট দ্বারা দেখানো হয়েছে:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }