টীকা সহ কোড পরিদর্শন উন্নত করুন

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

টীকাগুলি আপনাকে এই আরও সূক্ষ্ম কোড সমস্যাগুলি সনাক্ত করতে সাহায্য করার জন্য লিন্টের মতো কোড পরিদর্শন সরঞ্জামগুলিতে ইঙ্গিত প্রদান করতে দেয়। টীকাগুলি মেটাডেটা ট্যাগ হিসাবে যোগ করা হয় যা আপনি ভেরিয়েবল, প্যারামিটার এবং রিটার্ন মানগুলির সাথে সংযুক্ত করেন পদ্ধতি রিটার্ন মান, পাস করা প্যারামিটার, স্থানীয় ভেরিয়েবল এবং ক্ষেত্রগুলি পরিদর্শন করতে। কোড পরিদর্শন সরঞ্জামগুলির সাথে ব্যবহার করা হলে, টীকাগুলি আপনাকে নাল পয়েন্টার ব্যতিক্রম এবং রিসোর্স টাইপ দ্বন্দ্বের মতো সমস্যা সনাক্ত করতে সাহায্য করতে পারে।

অ্যান্ড্রয়েড জেটপ্যাক অ্যানোটেশন লাইব্রেরির মাধ্যমে বিভিন্ন ধরনের টীকা সমর্থন করে। আপনি androidx.annotation প্যাকেজের মাধ্যমে লাইব্রেরি অ্যাক্সেস করতে পারেন।

দ্রষ্টব্য: যদি একটি মডিউলের একটি টীকা প্রসেসরের উপর নির্ভরশীলতা থাকে, তাহলে সেই নির্ভরতা যোগ করার জন্য আপনাকে অবশ্যই Kotlin-এর জন্য kapt বা ksp নির্ভরতা কনফিগারেশন বা জাভার annotationProcessor নির্ভরতা কনফিগারেশন ব্যবহার করতে হবে।

আপনার প্রকল্পে টীকা যোগ করুন

আপনার প্রোজেক্টে টীকা সক্রিয় করতে, আপনার লাইব্রেরি বা অ্যাপে androidx.annotation:annotation নির্ভরতা যোগ করুন। আপনি যখন কোড পরিদর্শন বা lint টাস্ক চালান তখন আপনার যোগ করা যেকোনো টীকা চেক করা হয়।

জেটপ্যাক টীকা লাইব্রেরি নির্ভরতা যোগ করুন

জেটপ্যাক অ্যানোটেশন লাইব্রেরি Google-এর Maven সংগ্রহস্থলে প্রকাশিত হয়েছে। আপনার প্রকল্পে জেটপ্যাক অ্যানোটেশন লাইব্রেরি যোগ করতে, আপনার build.gradle বা build.gradle.kts ফাইলের dependencies ব্লকে নিম্নলিখিত লাইনটি অন্তর্ভুক্ত করুন:

কোটলিন

dependencies {
    implementation("androidx.annotation:annotation:1.9.0")
}

গ্রোভি

dependencies {
    implementation 'androidx.annotation:annotation:1.9.0'
}
তারপরে, টুলবারে বা সিঙ্ক বিজ্ঞপ্তি প্রদর্শিত হয়, এখন সিঙ্ক করুন ক্লিক করুন।

আপনি যদি নিজের লাইব্রেরি মডিউলে টীকা ব্যবহার করেন, তাহলে annotations.zip ফাইলে XML ফর্ম্যাটে Android আর্কাইভ (AAR) আর্টিফ্যাক্টের অংশ হিসেবে টীকাগুলি অন্তর্ভুক্ত করা হয়। androidx.annotation নির্ভরতা যোগ করা আপনার লাইব্রেরির কোনো ডাউনস্ট্রিম ব্যবহারকারীদের জন্য নির্ভরতা প্রবর্তন করে না।

দ্রষ্টব্য: আপনি যদি অন্য Jetpack লাইব্রেরি ব্যবহার করেন, তাহলে আপনাকে androidx.annotation নির্ভরতা যোগ করার প্রয়োজন নাও হতে পারে। যেহেতু অন্যান্য অনেক জেটপ্যাক লাইব্রেরি টীকা লাইব্রেরির উপর নির্ভর করে, আপনার কাছে ইতিমধ্যেই টীকাগুলিতে অ্যাক্সেস থাকতে পারে।

Jetpack সংগ্রহস্থলে অন্তর্ভুক্ত টীকাগুলির একটি সম্পূর্ণ তালিকার জন্য, হয় Jetpack টীকা লাইব্রেরি রেফারেন্স দেখুন বা import androidx.annotation. বিবৃতি

কোড পরিদর্শন চালান

অ্যান্ড্রয়েড স্টুডিও থেকে একটি কোড পরিদর্শন শুরু করতে, যার মধ্যে রয়েছে যাচাইকরণ টীকা এবং স্বয়ংক্রিয় লিন্ট চেকিং, মেনু থেকে বিশ্লেষণ > পরিদর্শন কোড নির্বাচন করুন। অ্যান্ড্রয়েড স্টুডিও সম্ভাব্য সমস্যাগুলিকে পতাকাঙ্কিত করতে দ্বন্দ্বের বার্তাগুলি প্রদর্শন করে যেখানে আপনার কোড টীকাগুলির সাথে বিরোধিতা করে এবং সম্ভাব্য সমাধানের পরামর্শ দেয়৷

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

যদিও টীকা দ্বন্দ্ব সতর্কতা তৈরি করে, এই সতর্কতাগুলি আপনার অ্যাপকে কম্পাইল করা থেকে বাধা দেয় না।

শূন্যতা টীকা

মান শূন্য হতে পারে কিনা তা প্রয়োগ করতে জাভা কোডে নালনেস টীকা কার্যকর হতে পারে। এগুলি কোটলিন কোডে কম কার্যকর, কারণ কোটলিন শূন্যতার নিয়ম তৈরি করেছে যা কম্পাইলের সময় প্রয়োগ করা হয়।

প্রদত্ত ভেরিয়েবল, প্যারামিটার বা রিটার্ন মানের শূন্যতা পরীক্ষা করতে @Nullable এবং @NonNull টীকা যোগ করুন। @Nullable টীকা একটি পরিবর্তনশীল, পরামিতি, বা রিটার্ন মান নির্দেশ করে যা নাল হতে পারে। @NonNull একটি পরিবর্তনশীল, পরামিতি, বা রিটার্ন মান নির্দেশ করে যা শূন্য হতে পারে না।

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

নিম্নলিখিত উদাহরণ কর্মে শূন্যতা প্রদর্শন করে। কোটলিনের উদাহরণ কোডটি @NonNull টীকাটিকে লিভারেজ করে না কারণ এটি স্বয়ংক্রিয়ভাবে জেনারেট করা বাইটকোডে যোগ করা হয় যখন একটি অ-নূলযোগ্য টাইপ নির্দিষ্ট করা হয়। জাভা উদাহরণটি context এবং attrs প্যারামিটারের উপর @NonNull টীকা ব্যবহার করে পরীক্ষা করে যে পাস করা প্যারামিটার মানগুলি শূন্য নয়। এটিও পরীক্ষা করে যে onCreateView() পদ্ধতি নিজেই নাল ফেরত দেয় না:

কোটলিন

...
    /** Annotation not used because of the safe-call operator(?)**/
    override fun onCreateView(
            name: String?,
            context: Context,
            attrs: AttributeSet
    ): View? {
        ...
    }
...

জাভা

import androidx.annotation.NonNull;
...
    /** Add support for inflating the <fragment> tag. **/
    @NonNull
    @Override
    public View onCreateView(String name, @NonNull Context context,
      @NonNull AttributeSet attrs) {
      ...
      }
...

শূন্যতা বিশ্লেষণ

অ্যান্ড্রয়েড স্টুডিও আপনার কোডে স্বয়ংক্রিয়ভাবে অনুমান করতে এবং শূন্যতা টীকা সন্নিবেশ করতে একটি শূন্যতা বিশ্লেষণ চালানো সমর্থন করে। একটি শূন্যতা বিশ্লেষণ সনাক্ত করতে আপনার কোডের সমস্ত পদ্ধতির শ্রেণিবিন্যাস জুড়ে চুক্তিগুলি স্ক্যান করে:

  • কলিং পদ্ধতি যা নাল ফেরত দিতে পারে।
  • পদ্ধতি যা নাল ফেরত দেওয়া উচিত নয়।
  • ভেরিয়েবল, যেমন ক্ষেত্র, স্থানীয় ভেরিয়েবল এবং পরামিতি, যা নাল হতে পারে।
  • ভেরিয়েবল, যেমন ক্ষেত্র, স্থানীয় ভেরিয়েবল এবং পরামিতি, যা একটি শূন্য মান ধরে রাখতে পারে না।

তারপর বিশ্লেষণ স্বয়ংক্রিয়ভাবে সনাক্ত করা অবস্থানে উপযুক্ত নাল টীকা সন্নিবেশ করায়।

অ্যান্ড্রয়েড স্টুডিওতে শূন্যতা বিশ্লেষণ চালানোর জন্য, বিশ্লেষণ > ইনফার নুলিটি নির্বাচন করুন। অ্যান্ড্রয়েড স্টুডিও আপনার কোডে সনাক্ত করা অবস্থানগুলিতে Android @Nullable এবং @NonNull টীকা সন্নিবেশ করায়। একটি নাল বিশ্লেষণ চালানোর পরে, ইনজেকশনের টীকা যাচাই করা একটি ভাল অভ্যাস।

দ্রষ্টব্য: শূন্যতা টীকা যোগ করার সময়, স্বয়ংসম্পূর্ণ Android নাল টীকাগুলির পরিবর্তে IntelliJ @Nullable এবং @NotNull টীকাগুলির পরামর্শ দিতে পারে এবং সংশ্লিষ্ট লাইব্রেরি স্বয়ংক্রিয়ভাবে আমদানি করতে পারে৷ যাইহোক, অ্যান্ড্রয়েড স্টুডিও লিন্ট পরীক্ষক শুধুমাত্র অ্যান্ড্রয়েড নাল টীকাগুলি সন্ধান করে। আপনার টীকা যাচাই করার সময়, নিশ্চিত করুন যে আপনার প্রোজেক্ট অ্যান্ড্রয়েড নাল অ্যানোটেশন ব্যবহার করে যাতে লিন্ট চেকার আপনাকে কোড পরিদর্শনের সময় সঠিকভাবে অবহিত করতে পারে।

সম্পদ টীকা

রিসোর্সের ধরন যাচাই করা উপকারী হতে পারে কারণ রিসোর্সের Android রেফারেন্স, যেমন অঙ্কনযোগ্য এবং স্ট্রিং রিসোর্স, পূর্ণসংখ্যা হিসাবে পাস করা হয়।

যে কোডটি একটি প্যারামিটারকে একটি নির্দিষ্ট ধরনের রিসোর্সের উল্লেখ করার আশা করে, যেমন একটি String , প্রত্যাশিত রেফারেন্স টাইপের int এ পাস করা যেতে পারে, কিন্তু প্রকৃতপক্ষে একটি ভিন্ন ধরনের রিসোর্স উল্লেখ করে, যেমন একটি R.string রিসোর্স।

উদাহরণস্বরূপ, একটি রিসোর্স প্যারামিটারে একটি R.string রেফারেন্স রয়েছে কিনা তা পরীক্ষা করতে @StringRes টীকা যোগ করুন, যেমনটি এখানে দেখানো হয়েছে:

কোটলিন

abstract fun setTitle(@StringRes resId: Int)

জাভা

public abstract void setTitle(@StringRes int resId)

কোড পরিদর্শনের সময়, প্যারামিটারে একটি R.string রেফারেন্স পাস না হলে টীকা একটি সতর্কতা তৈরি করে।

@DrawableRes , @DimenRes , @ColorRes , এবং @InterpolatorRes মতো অন্যান্য রিসোর্সের জন্য টীকাগুলি একই টীকা বিন্যাস ব্যবহার করে যোগ করা যেতে পারে এবং কোড পরিদর্শনের সময় চালানো যেতে পারে।

যদি আপনার প্যারামিটার একাধিক রিসোর্স প্রকারকে সমর্থন করে, তাহলে আপনি একটি প্রদত্ত প্যারামিটারে একাধিক রিসোর্স টাইপ টীকা রাখতে পারেন। @AnyRes ব্যবহার করুন ইঙ্গিত করার জন্য যে টীকা করা পরামিতি যেকোনো ধরনের R সম্পদ হতে পারে।

যদিও আপনি @ColorRes ব্যবহার করতে পারেন যে একটি প্যারামিটার একটি রঙের সম্পদ হওয়া উচিত, একটি রঙের পূর্ণসংখ্যা ( RRGGBB বা AARRGGBB ফর্ম্যাটে) একটি রঙের সম্পদ হিসাবে স্বীকৃত নয়। পরিবর্তে, @ColorInt টীকাটি ব্যবহার করে নির্দেশ করুন যে একটি প্যারামিটার একটি রঙের পূর্ণসংখ্যা হতে হবে। বিল্ড টুলগুলি ভুল কোডকে ফ্ল্যাগ করবে যা একটি রঙের পূর্ণসংখ্যার পরিবর্তে android.R.color.black এর মতো একটি কালার রিসোর্স আইডিকে টীকা পদ্ধতিতে পাস করে।

থ্রেড টীকা

থ্রেড টীকাগুলি একটি নির্দিষ্ট ধরণের থ্রেড থেকে একটি পদ্ধতি কল করা হয়েছে কিনা তা পরীক্ষা করে। নিম্নলিখিত থ্রেড টীকা সমর্থিত:

বিল্ড টুলগুলি @MainThread এবং @UiThread টীকাগুলিকে বিনিময়যোগ্য হিসাবে বিবেচনা করে, তাই আপনি @MainThread পদ্ধতিগুলি থেকে @UiThread পদ্ধতিগুলিকে কল করতে পারেন এবং এর বিপরীতে। যাইহোক, বিভিন্ন থ্রেডে একাধিক ভিউ সহ সিস্টেম অ্যাপের ক্ষেত্রে একটি UI থ্রেড মূল থ্রেড থেকে আলাদা হওয়া সম্ভব। অতএব, আপনার @UiThread এর সাথে একটি অ্যাপের ভিউ হায়ারার্কির সাথে যুক্ত পদ্ধতিগুলি টীকা করা উচিত এবং @MainThread এর সাথে শুধুমাত্র একটি অ্যাপের জীবনচক্রের সাথে যুক্ত পদ্ধতিগুলিকে টীকা করা উচিত।

যদি একটি ক্লাসের সমস্ত পদ্ধতি একই থ্রেডিং প্রয়োজনীয়তা ভাগ করে তবে আপনি ক্লাসে একটি একক থ্রেড টীকা যোগ করতে পারেন যাতে ক্লাসের সমস্ত পদ্ধতি একই ধরণের থ্রেড থেকে কল করা হয়।

থ্রেড টীকাগুলির একটি সাধারণ ব্যবহার হল যাচাই করা যে @WorkerThread এর সাথে টীকা করা পদ্ধতি বা ক্লাসগুলি শুধুমাত্র একটি উপযুক্ত ব্যাকগ্রাউন্ড থ্রেড থেকে কল করা হয়।

মান সীমাবদ্ধতা টীকা

পাস করা প্যারামিটারের মান যাচাই করতে @IntRange , @FloatRange এবং @Size টীকা ব্যবহার করুন। @IntRange এবং @FloatRange উভয়ই সবচেয়ে উপযোগী যখন প্যারামিটারে প্রয়োগ করা হয় যেখানে ব্যবহারকারীদের পরিসীমা ভুল হওয়ার সম্ভাবনা থাকে।

@IntRange টীকাটি যাচাই করে যে একটি পূর্ণসংখ্যা বা দীর্ঘ পরামিতি মান একটি নির্দিষ্ট সীমার মধ্যে রয়েছে। নিম্নলিখিত উদাহরণটি নির্দেশ করে যে alpha প্যারামিটারে 0 থেকে 255 পর্যন্ত একটি পূর্ণসংখ্যা মান থাকতে হবে:

কোটলিন

fun setAlpha(@IntRange(from = 0, to = 255) alpha: Int) { ... }

জাভা

public void setAlpha(@IntRange(from=0,to=255) int alpha) { ... }

@FloatRange টীকা একটি ফ্লোট বা ডবল প্যারামিটার মান ফ্লোটিং পয়েন্ট মানগুলির একটি নির্দিষ্ট পরিসরের মধ্যে কিনা তা পরীক্ষা করে। নিম্নলিখিত উদাহরণটি নির্দেশ করে যে alpha প্যারামিটারে 0.0 থেকে 1.0 পর্যন্ত একটি ফ্লোট মান থাকতে হবে:

কোটলিন

fun setAlpha(@FloatRange(from = 0.0, to = 1.0) alpha: Float) {...}

জাভা

public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {...}

@Size টীকা একটি সংগ্রহ বা অ্যারের আকার বা একটি স্ট্রিংয়ের দৈর্ঘ্য পরীক্ষা করে। @Size টীকাটি নিম্নলিখিত গুণাবলী যাচাই করতে ব্যবহার করা যেতে পারে:

  • ন্যূনতম আকার, যেমন @Size(min=2)
  • সর্বাধিক আকার, যেমন @Size(max=2)
  • সঠিক আকার, যেমন @Size(2)
  • একটি সংখ্যা যেটির আকার অবশ্যই একটি গুণিতক হতে হবে, যেমন @Size(multiple=2)

উদাহরণস্বরূপ, @Size(min=1) একটি সংগ্রহ খালি নেই কিনা তা পরীক্ষা করে এবং @Size(3) যাচাই করে যে একটি অ্যারেতে ঠিক তিনটি মান রয়েছে।

নিম্নলিখিত উদাহরণটি নির্দেশ করে যে location অ্যারেতে কমপক্ষে একটি উপাদান থাকতে হবে:

কোটলিন

fun getLocation(button: View, @Size(min=1) location: IntArray) {
    button.getLocationOnScreen(location)
}

জাভা

void getLocation(View button, @Size(min=1) int[] location) {
    button.getLocationOnScreen(location);
}

অনুমতি টীকা

একটি পদ্ধতির কলকারীর অনুমতি যাচাই করতে @RequiresPermission টীকা ব্যবহার করুন। বৈধ অনুমতির তালিকা থেকে একটি একক অনুমতি পরীক্ষা করতে, anyOf বৈশিষ্ট্য ব্যবহার করুন। অনুমতিগুলির একটি সেট পরীক্ষা করতে, allOf বৈশিষ্ট্যটি ব্যবহার করুন। নিম্নলিখিত উদাহরণটি setWallpaper() পদ্ধতিটিকে টীকা করে নির্দেশ করে যে পদ্ধতিটির কলারের অবশ্যই permission.SET_WALLPAPERS থাকতে হবে৷SET_WALLPAPERS অনুমতি:

কোটলিন

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
@Throws(IOException::class)
abstract fun setWallpaper(bitmap: Bitmap)

জাভা

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public abstract void setWallpaper(Bitmap bitmap) throws IOException;

নিম্নলিখিত উদাহরণের জন্য copyImageFile() পদ্ধতির কলারকে বহিরাগত সঞ্চয়স্থানে পড়ার অ্যাক্সেস এবং অনুলিপি করা ছবিতে অবস্থানের মেটাডেটা পড়ার অ্যাক্সেস উভয়ই থাকতে হবে:

কোটলিন

@RequiresPermission(allOf = [
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.ACCESS_MEDIA_LOCATION
])
fun copyImageFile(dest: String, source: String) {
    ...
}

জাভা

@RequiresPermission(allOf = {
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.ACCESS_MEDIA_LOCATION})
public static final void copyImageFile(String dest, String source) {
    //...
}

ইন্টেন্টের অনুমতির জন্য, স্ট্রিং ফিল্ডে অনুমতির প্রয়োজনীয়তা রাখুন যা উদ্দেশ্য অ্যাকশন নামটি সংজ্ঞায়িত করে:

কোটলিন

@RequiresPermission(android.Manifest.permission.BLUETOOTH)
const val ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE"

জাভা

@RequiresPermission(android.Manifest.permission.BLUETOOTH)
public static final String ACTION_REQUEST_DISCOVERABLE =
            "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";

কন্টেন্ট প্রদানকারীর অনুমতির জন্য যাদের পড়ার এবং লেখার অ্যাক্সেসের জন্য আলাদা অনুমতির প্রয়োজন, প্রতিটি অনুমতির প্রয়োজনীয়তাকে একটি @RequiresPermission.Read বা @RequiresPermission.Write টীকা লিখুন:

কোটলিন

@RequiresPermission.Read(RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(RequiresPermission(WRITE_HISTORY_BOOKMARKS))
val BOOKMARKS_URI = Uri.parse("content://browser/bookmarks")

জাভা

@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");

পরোক্ষ অনুমতি

যখন একটি অনুমতি একটি পদ্ধতির প্যারামিটারে সরবরাহ করা নির্দিষ্ট মানের উপর নির্ভর করে, নির্দিষ্ট অনুমতিগুলি তালিকাভুক্ত না করেই পরামিতিটিতে @RequiresPermission ব্যবহার করুন। উদাহরণস্বরূপ, startActivity(Intent) পদ্ধতিটি পদ্ধতিতে পাস করা অভিপ্রায়ের উপর একটি পরোক্ষ অনুমতি ব্যবহার করে:

কোটলিন

abstract fun startActivity(@RequiresPermission intent: Intent, bundle: Bundle?)

জাভা

public abstract void startActivity(@RequiresPermission Intent intent, @Nullable Bundle)

আপনি যখন পরোক্ষ অনুমতিগুলি ব্যবহার করেন, তখন বিল্ড টুলগুলি পদ্ধতিতে পাস করা আর্গুমেন্টে @RequiresPermission টীকা আছে কিনা তা পরীক্ষা করতে ডেটা ফ্লো বিশ্লেষণ করে। তারপরে তারা পদ্ধতিতে প্যারামিটার থেকে বিদ্যমান কোনো টীকা প্রয়োগ করে। startActivity(Intent) উদাহরণে, Intent ক্লাসের টীকাগুলি startActivity(Intent) এর অবৈধ ব্যবহার সম্পর্কে সতর্কতা সৃষ্টি করে যখন উপযুক্ত অনুমতি ছাড়া একটি উদ্দেশ্য পদ্ধতিতে পাস করা হয়, যেমন চিত্র 1 এ দেখানো হয়েছে।

চিত্র 1. startActivity(Intent) পদ্ধতিতে একটি পরোক্ষ অনুমতি টীকা থেকে তৈরি করা সতর্কতা।

বিল্ড টুলগুলি Intent ক্লাসে সংশ্লিষ্ট উদ্দেশ্য অ্যাকশন নামের টীকা থেকে startActivity(Intent) সম্পর্কে সতর্কতা তৈরি করে:

কোটলিন

@RequiresPermission(Manifest.permission.CALL_PHONE)
const val ACTION_CALL = "android.intent.action.CALL"

জাভা

@RequiresPermission(Manifest.permission.CALL_PHONE)
public static final String ACTION_CALL = "android.intent.action.CALL";

প্রয়োজনে, আপনি @RequiresPermission.Read এর জন্য @RequiresPermission প্রতিস্থাপন করতে পারেন।পঠন বা @RequiresPermission.Write একটি পদ্ধতির প্যারামিটার টীকা করার সময়। যাইহোক, পরোক্ষ অনুমতির জন্য @RequiresPermission পঠিত বা লেখার অনুমতি টীকাগুলির সাথে ব্যবহার করা উচিত নয়।

মান টীকা ফেরত

একটি পদ্ধতির ফলাফল বা রিটার্ন মান আসলে ব্যবহার করা হয়েছে তা যাচাই করতে @CheckResult টীকাটি ব্যবহার করুন। @CheckResult সাথে প্রতিটি অ-অকার্যকর পদ্ধতি টীকা করার পরিবর্তে, সম্ভাব্য বিভ্রান্তিকর পদ্ধতির ফলাফলগুলি স্পষ্ট করতে টীকা যোগ করুন।

উদাহরণস্বরূপ, নতুন জাভা ডেভেলপাররা প্রায়ই ভুল করে মনে করে যে < String >.trim() মূল স্ট্রিং থেকে হোয়াইটস্পেস সরিয়ে দেয়। @CheckResult পতাকাগুলির সাথে পদ্ধতিটি টীকা করা < String >.trim() ব্যবহার করে যেখানে কলকারী পদ্ধতির রিটার্ন মানের সাথে কিছু করে না।

নিম্নলিখিত উদাহরণটি checkPermissions() পদ্ধতিটিকে টীকা করে যে পদ্ধতিটির রিটার্ন মানটি আসলে উল্লেখ করা হয়েছে কিনা। এটি একটি প্রতিস্থাপন হিসাবে বিকাশকারীকে প্রস্তাবিত পদ্ধতি হিসাবে enforcePermission() পদ্ধতির নাম দেয়:

কোটলিন

@CheckResult(suggest = "#enforcePermission(String,int,int,String)")
abstract fun checkPermission(permission: String, pid: Int, uid: Int): Int

জাভা

@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public abstract int checkPermission(@NonNull String permission, int pid, int uid);

কলসুপার টীকা

একটি ওভাররাইডিং পদ্ধতি যে পদ্ধতিটির সুপার বাস্তবায়নকে কল করে তা যাচাই করতে @CallSuper টীকাটি ব্যবহার করুন।

যে কোনো ওভাররাইডিং পদ্ধতি বাস্তবায়ন super.onCreate() কল করে তা নিশ্চিত করতে নিম্নলিখিত উদাহরণটি onCreate() পদ্ধতিটিকে টীকা করে:

কোটলিন

@CallSuper
override fun onCreate(savedInstanceState: Bundle?) {
}

জাভা

@CallSuper
protected void onCreate(Bundle savedInstanceState) {
}

টাইপডেফ টীকা

Typedef টীকা একটি নির্দিষ্ট প্যারামিটার, রিটার্ন মান, বা ক্ষেত্র নির্দিষ্ট ধ্রুবকের একটি সেট উল্লেখ করে কিনা তা পরীক্ষা করে। তারা স্বয়ংক্রিয়ভাবে অনুমোদিত ধ্রুবক অফার করতে কোড সমাপ্তি সক্ষম করে।

অন্যান্য ধরনের কোড রেফারেন্স যাচাই করতে পূর্ণসংখ্যা এবং স্ট্রিং সেটের গণনাকৃত টীকা তৈরি করতে @IntDef এবং @StringDef টীকা ব্যবহার করুন।

Typedef টীকা নতুন গণনাকৃত টীকা প্রকার ঘোষণা করতে @interface ব্যবহার করে। @IntDef এবং @StringDef টীকা, @Retention এর সাথে, নতুন টীকা টীকা করে এবং গণনাকৃত প্রকার সংজ্ঞায়িত করার জন্য প্রয়োজনীয়। @Retention(RetentionPolicy.SOURCE) টীকা কম্পাইলারকে .class ফাইলে গণনাকৃত টীকা ডেটা সংরক্ষণ না করতে বলে।

নিম্নলিখিত উদাহরণটি একটি টীকা তৈরি করার পদক্ষেপগুলি দেখায় যা পরীক্ষা করে যে একটি পদ্ধতি পরামিতি হিসাবে পাস করা মানটি সংজ্ঞায়িত ধ্রুবকগুলির মধ্যে একটিকে উল্লেখ করে কিনা:

কোটলিন

import androidx.annotation.IntDef
//...
// Define the list of accepted constants and declare the NavigationMode annotation.
@Retention(AnnotationRetention.SOURCE)
@IntDef(NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS)
annotation class NavigationMode

// Declare the constants.
const val NAVIGATION_MODE_STANDARD = 0
const val NAVIGATION_MODE_LIST = 1
const val NAVIGATION_MODE_TABS = 2

abstract class ActionBar {

    // Decorate the target methods with the annotation.
    // Attach the annotation.
    @get:NavigationMode
    @setparam:NavigationMode
    abstract var navigationMode: Int

}

জাভা

import androidx.annotation.IntDef;
//...
public abstract class ActionBar {
    //...
    // Define the list of accepted constants and declare the NavigationMode annotation.
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
    public @interface NavigationMode {}

    // Declare the constants.
    public static final int NAVIGATION_MODE_STANDARD = 0;
    public static final int NAVIGATION_MODE_LIST = 1;
    public static final int NAVIGATION_MODE_TABS = 2;

    // Decorate the target methods with the annotation.
    @NavigationMode
    public abstract int getNavigationMode();

    // Attach the annotation.
    public abstract void setNavigationMode(@NavigationMode int mode);
}

যখন আপনি এই কোডটি তৈরি করেন, mode প্যারামিটারটি সংজ্ঞায়িত ধ্রুবকগুলির একটিকে উল্লেখ না করলে একটি সতর্কতা তৈরি হয় ( NAVIGATION_MODE_STANDARD , NAVIGATION_MODE_LIST , বা NAVIGATION_MODE_TABS )।

@IntDef এবং @IntRange একত্রিত করে নির্দেশ করে যে একটি পূর্ণসংখ্যা হয় প্রদত্ত ধ্রুবকের সেট বা একটি পরিসরের মধ্যে একটি মান হতে পারে।

পতাকাগুলির সাথে ধ্রুবকগুলিকে একত্রিত করা সক্ষম করুন৷

যদি ব্যবহারকারীরা একটি পতাকার সাথে অনুমোদিত ধ্রুবকগুলিকে একত্রিত করতে পারে (যেমন | , & , ^ , এবং তাই), আপনি একটি প্যারামিটার বা রিটার্ন মান একটি বৈধ প্যাটার্ন উল্লেখ করে কিনা তা পরীক্ষা করতে একটি flag বৈশিষ্ট্য সহ একটি টীকা সংজ্ঞায়িত করতে পারেন৷

নিম্নলিখিত উদাহরণটি বৈধ DISPLAY_ ধ্রুবকগুলির একটি তালিকা সহ DisplayOptions টীকা তৈরি করে:

কোটলিন

import androidx.annotation.IntDef
...

@IntDef(flag = true, value = [
    DISPLAY_USE_LOGO,
    DISPLAY_SHOW_HOME,
    DISPLAY_HOME_AS_UP,
    DISPLAY_SHOW_TITLE,
    DISPLAY_SHOW_CUSTOM
])
@Retention(AnnotationRetention.SOURCE)
annotation class DisplayOptions
...

জাভা

import androidx.annotation.IntDef;
...

@IntDef(flag=true, value={
        DISPLAY_USE_LOGO,
        DISPLAY_SHOW_HOME,
        DISPLAY_HOME_AS_UP,
        DISPLAY_SHOW_TITLE,
        DISPLAY_SHOW_CUSTOM
})
@Retention(RetentionPolicy.SOURCE)
public @interface DisplayOptions {}

...

আপনি যখন একটি টীকা পতাকা দিয়ে কোড তৈরি করেন, সজ্জিত প্যারামিটার বা রিটার্ন মানটি একটি বৈধ প্যাটার্ন উল্লেখ না করলে একটি সতর্কতা তৈরি হয়।

টীকা রাখুন

@Keep টীকাটি নিশ্চিত করে যে বিল্ড টাইমে কোডটি ছোট করা হলে একটি টীকাযুক্ত ক্লাস বা পদ্ধতি সরানো হবে না। এই টীকাটি সাধারণত পদ্ধতি এবং ক্লাসগুলিতে যোগ করা হয় যা প্রতিফলনের মাধ্যমে অ্যাক্সেস করা হয় যাতে কম্পাইলারকে কোডটিকে অব্যবহৃত হিসাবে বিবেচনা করা থেকে বিরত রাখা হয়।

সতর্কতা: আপনি @Keep ব্যবহার করে যে ক্লাস এবং পদ্ধতিগুলি টীকা করেন তা সর্বদা আপনার অ্যাপের APK-এ প্রদর্শিত হয়, এমনকি যদি আপনি এই ক্লাস এবং পদ্ধতিগুলিকে আপনার অ্যাপের যুক্তির মধ্যে উল্লেখ না করেন।

আপনার অ্যাপের আকার ছোট রাখতে, আপনার অ্যাপে প্রতিটি @Keep টীকা সংরক্ষণ করা প্রয়োজন কিনা তা বিবেচনা করুন। আপনি যদি একটি টীকাযুক্ত ক্লাস বা পদ্ধতি অ্যাক্সেস করতে প্রতিফলন ব্যবহার করেন, তাহলে আপনার ProGuard নিয়মে একটি -if শর্তসাপেক্ষ ব্যবহার করুন, যে শ্রেণীটি প্রতিফলন কল করে তা উল্লেখ করে।

কীভাবে আপনার কোডটি ছোট করবেন এবং কোন কোডটি সরানো হবে না তা উল্লেখ করার বিষয়ে আরও তথ্যের জন্য, দেখুন সঙ্কুচিত করুন, অস্পষ্ট করুন এবং আপনার অ্যাপটি অপ্টিমাইজ করুন

কোড দৃশ্যমানতা টীকা

কোডের নির্দিষ্ট অংশের দৃশ্যমানতা বোঝাতে নিম্নলিখিত টীকাগুলি ব্যবহার করুন, যেমন পদ্ধতি, ক্লাস, ক্ষেত্র বা প্যাকেজ।

পরীক্ষার জন্য কোড দৃশ্যমান করুন

@VisibleForTesting টীকাটি নির্দেশ করে যে একটি টীকাযুক্ত পদ্ধতি সাধারণত পদ্ধতিটিকে পরীক্ষাযোগ্য করার জন্য প্রয়োজনীয়তার চেয়ে বেশি দৃশ্যমান। এই টীকাটিতে একটি ঐচ্ছিক otherwise যুক্তি রয়েছে যা আপনাকে পরীক্ষার জন্য দৃশ্যমান করার প্রয়োজন না হলে পদ্ধতিটির দৃশ্যমানতা কী হবে তা নির্ধারণ করতে দেয়। লিন্ট উদ্দেশ্যমূলক দৃশ্যমানতা প্রয়োগ করতে otherwise যুক্তি ব্যবহার করে।

নিম্নলিখিত উদাহরণে, myMethod() সাধারণত private , তবে এটি পরীক্ষার জন্য package-privateVisibleForTesting.PRIVATE উপাধি সহ, লিন্ট একটি বার্তা প্রদর্শন করে যদি এই পদ্ধতিটি private অ্যাক্সেস দ্বারা অনুমোদিত প্রসঙ্গের বাইরে থেকে বলা হয়, যেমন একটি ভিন্ন সংকলন ইউনিট থেকে।

কোটলিন

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun myMethod() {
    ...
}

জাভা

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
void myMethod() { ... }

আপনি @VisibleForTesting(otherwise = VisibleForTesting.NONE) উল্লেখ করতে পারেন যে একটি পদ্ধতি শুধুমাত্র পরীক্ষার জন্য বিদ্যমান। এই ফর্মটি @RestrictTo(TESTS) ব্যবহার করার মতই। তারা উভয় একই লিন্ট চেক সঞ্চালন.

একটি API সীমাবদ্ধ করুন

@RestrictTo টীকা নির্দেশ করে যে টীকা করা API (প্যাকেজ, শ্রেণী বা পদ্ধতি) অ্যাক্সেস সীমিত, নিম্নরূপ:

উপশ্রেণী

শুধুমাত্র সাবক্লাসে API অ্যাক্সেস সীমাবদ্ধ করতে টীকা ফর্ম @RestrictTo(RestrictTo.Scope.SUBCLASSES) ব্যবহার করুন।

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

লাইব্রেরি

শুধুমাত্র আপনার লাইব্রেরিতে API অ্যাক্সেস সীমাবদ্ধ করতে টীকা ফর্ম @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) ব্যবহার করুন।

শুধুমাত্র আপনার লাইব্রেরি কোড টীকাযুক্ত API অ্যাক্সেস করতে পারে৷ এটি আপনাকে যে কোনো প্যাকেজ শ্রেণিবিন্যাসে আপনার কোডটি শুধুমাত্র সংগঠিত করতে দেয় না বরং সংশ্লিষ্ট লাইব্রেরির একটি গ্রুপের মধ্যে কোডটি ভাগ করে নিতে দেয়। এই বিকল্পটি ইতিমধ্যেই জেটপ্যাক লাইব্রেরিতে উপলব্ধ রয়েছে যেগুলির অনেকগুলি বাস্তবায়ন কোড রয়েছে যা বাহ্যিক ব্যবহারের জন্য নয়, তবে বিভিন্ন পরিপূরক জেটপ্যাক লাইব্রেরিগুলিতে ভাগ করার জন্য এটি public হতে হবে।

টেস্টিং

অন্য ডেভেলপারদের আপনার টেস্টিং এপিআই অ্যাক্সেস করতে বাধা দিতে টীকা ফর্ম @RestrictTo(RestrictTo.Scope.TESTS) ব্যবহার করুন।

শুধুমাত্র টেস্টিং কোড টীকাযুক্ত API অ্যাক্সেস করতে পারে। এটি অন্য ডেভেলপারদেরকে এপিআই ব্যবহার করতে বাধা দেয় যেটি আপনি শুধুমাত্র পরীক্ষার উদ্দেশ্যে চান।