একটি কনফিগার পতাকা ঘোষণা করুন

আপনি জাভা, সি, সি++ এবং রাস্ট কোডে aconfig ফ্ল্যাগ ব্যবহার করতে পারেন। AOSP বিল্ড সিস্টেম aconfig নামক একটি টুল চালু করে, যা প্রতিটি ফ্ল্যাগের মান অ্যাক্সেস করার জন্য ভাষা-নির্দিষ্ট মেথডের একটি লাইব্রেরি তৈরি করতে ব্যবহৃত হয়। লাইব্রেরিটি তৈরি করার আগে, আপনাকে অবশ্যই ফ্ল্যাগগুলো ডিক্লেয়ার করতে হবে এবং সেগুলোকে বিল্ডে যুক্ত করতে হবে।

জাভার জন্য একটি aconfig ফ্ল্যাগ ঘোষণা করুন

জাভার জন্য একটি aconfig ফ্ল্যাগ ঘোষণা করতে:

  1. যে ডিরেক্টরিতে নতুন কোডটি রয়েছে, সেখানে .aconfig এক্সটেনশনসহ একটি ফাইল তৈরি করুন, যেমন, my_new_aconfig_flag_declarations.aconfig । একটি aconfig ফাইল হলো একটি টেক্সট প্রোটো ফাইল যা একটি স্ট্যান্ডার্ড স্কিমা অনুসরণ করে।

  2. নিম্নলিখিতের অনুরূপ একটি ফ্ল্যাগ ঘোষণা যোগ করুন:

    package: "com.example.android.aconfig.demo.flags"
    container: "system"
    
    flag {
        name: "my_new_flag"
        namespace: "aconfig_demo_namespace"
        description: "This flag controls untested code"
        bug: "<none>"
    }
    

    কোথায়:

    • package , ফ্ল্যাগের নামের সাথে মিলিত হয়ে একটি অনন্য কী প্রদান করে। জাভাতে, package foo.bar হিসেবে সেট করলে foo.bar.Flags নামের একটি স্বয়ংক্রিয়ভাবে তৈরি ক্লাস তৈরি হয়। C++-এ, ফ্ল্যাগ অ্যাক্সেসর মেথডগুলোর নাম হবে foo::bar::" flagname " । একই ডিক্লারেশন ফাইলের ফ্ল্যাগগুলো একই প্যাকেজের অন্তর্ভুক্ত, কিন্তু একাধিক ডিক্লারেশন ফাইল একই প্যাকেজে ফ্ল্যাগ যোগ করতে পারে।
    • container হলো কোডের এমন একটি সংগ্রহ যা একটি বাইনারি হিসেবে একসাথে বিল্ড ও শিপ করা হয়। বৈধ কন্টেইনারগুলো হলো system , vendor , system_ext , product , name.of.apex , এবং name.of.apk

    • name এ পতাকার নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।

    • namespace মধ্যে অবদানের জন্য নেমস্পেস থাকে। আপনার নেমস্পেস নির্ধারণ করতে আপনাকে অবশ্যই নির্ধারিত গুগল রিভিউয়ারের সাথে কাজ করতে হবে। আপনি যদি আপনার নিজস্ব AOSP মিররের স্থিতিশীলতা বজায় রাখতে ফিচার লঞ্চ ফ্ল্যাগ ব্যবহার করেন, তবে আপনি আপনার পছন্দমতো নেমস্পেস ব্যবহার করতে পারেন।

    • description চিহ্নিত করা বৈশিষ্ট্য বা পরিবর্তনটির একটি সংক্ষিপ্ত বিবরণ থাকে।

    • bug হলো নতুন কোড অবদানের সাথে যুক্ত বাগ নম্বর। আপনার bug নির্ধারণ করতে আপনাকে অবশ্যই নির্ধারিত গুগল রিভিউয়ারের সাথে কাজ করতে হবে। আপনি যদি আপনার নিজের AOSP মিররের স্থিতিশীলতা বজায় রাখতে ফিচার লঞ্চ ফ্ল্যাগ ব্যবহার করেন, তাহলে আপনি আপনার বাগ ট্র্যাকিং নম্বর ব্যবহার করতে পারেন অথবা <none> ব্যবহার করতে পারেন।

  3. ফাইলটি সংরক্ষণ করুন এবং এডিটর থেকে বেরিয়ে যান।

বিল্ডটি সেট আপ করুন

আপনার ফ্ল্যাগটি ঘোষণা করার পরে, বিল্ডটি এমনভাবে সেট আপ করুন যাতে এটি ফ্ল্যাগের মান অ্যাক্সেস করার জন্য ব্যবহৃত লাইব্রেরি কোড তৈরি করতে পারে।

  1. আপনার Android.bp বিল্ড ফাইলে, নিম্নলিখিতের অনুরূপ একটি aconfig_declarations সেকশন যোগ করুন:

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    কোথায়:

    • name এ ডিক্লারেশনের নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।
    • package ডিক্লারেশনে ব্যবহৃত একই প্যাকেজ নামটি রয়েছে।
    • srcs সেই .aconfig ফাইলের নাম থাকে যেখানে ফ্ল্যাগটি ডিক্লেয়ার করা হয়েছে।
  2. ফাইলটি সংরক্ষণ করুন এবং এডিটর থেকে বেরিয়ে যান।

C এবং C++ এর জন্য একটি aconfig ফ্ল্যাগ ঘোষণা করুন

C এবং C++ এর জন্য একটি aconfig ফ্ল্যাগ ঘোষণা করতে:

  1. যে ডিরেক্টরিতে নতুন কোডটি রয়েছে, সেখানে .aconfig এক্সটেনশনসহ একটি ফাইল তৈরি করুন, যেমন, my_new_aconfig_flag_declarations.aconfig । একটি aconfig ফাইল হলো একটি টেক্সট প্রোটো ফাইল যা একটি স্ট্যান্ডার্ড স্কিমা অনুসরণ করে।

  2. নিম্নলিখিতের অনুরূপ একটি ফ্ল্যাগ ঘোষণা যোগ করুন:

    package: "com.example.android.aconfig.demo.flags"
    container: "system"
    
    flag {
        name: "my_new_flag"
        namespace: "aconfig_demo_namespace"
        description: "This flag controls untested code"
        bug: "<none>"
    }
    

    কোথায়:

    • package , ফ্ল্যাগের নামের সাথে মিলিত হয়ে একটি অনন্য কী প্রদান করে। জাভাতে, package foo.bar হিসেবে সেট করলে foo.bar.Flags নামের একটি স্বয়ংক্রিয়ভাবে তৈরি ক্লাস তৈরি হয়। C++-এ, ফ্ল্যাগ অ্যাক্সেসর মেথডগুলোর নাম হবে foo::bar::" flagname " । একই ডিক্লারেশন ফাইলের ফ্ল্যাগগুলো একই প্যাকেজের অন্তর্ভুক্ত, কিন্তু একাধিক ডিক্লারেশন ফাইল একই প্যাকেজে ফ্ল্যাগ যোগ করতে পারে।
    • container হলো কোডের এমন একটি সংগ্রহ যা একটি বাইনারি হিসেবে একসাথে বিল্ড ও শিপ করা হয়। বৈধ কন্টেইনারগুলো হলো system , vendor , system_ext , product , name.of.apex , এবং name.of.apk

    • name এ পতাকার নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।

    • namespace মধ্যে অবদানের জন্য নেমস্পেস থাকে। আপনার নেমস্পেস নির্ধারণ করতে আপনাকে অবশ্যই নির্ধারিত গুগল রিভিউয়ারের সাথে কাজ করতে হবে। আপনি যদি আপনার নিজস্ব AOSP মিররের স্থিতিশীলতা বজায় রাখতে ফিচার লঞ্চ ফ্ল্যাগ ব্যবহার করেন, তবে আপনি আপনার পছন্দমতো নেমস্পেস ব্যবহার করতে পারেন।

    • description চিহ্নিত করা বৈশিষ্ট্য বা পরিবর্তনটির একটি সংক্ষিপ্ত বিবরণ থাকে।

    • bug হলো নতুন কোড অবদানের সাথে যুক্ত বাগ নম্বর। আপনার bug নির্ধারণ করতে আপনাকে অবশ্যই নির্ধারিত গুগল রিভিউয়ারের সাথে কাজ করতে হবে। আপনি যদি আপনার নিজের AOSP মিররের স্থিতিশীলতা বজায় রাখতে ফিচার লঞ্চ ফ্ল্যাগ ব্যবহার করেন, তাহলে আপনি আপনার বাগ ট্র্যাকিং নম্বর ব্যবহার করতে পারেন অথবা <none> ব্যবহার করতে পারেন।

  3. ফাইলটি সংরক্ষণ করুন এবং এডিটর থেকে বেরিয়ে যান।

বিল্ডটি সেট আপ করুন

আপনার ফ্ল্যাগটি ঘোষণা করার পরে, বিল্ডটি এমনভাবে সেট আপ করুন যাতে এটি ফ্ল্যাগের মান অ্যাক্সেস করার জন্য ব্যবহৃত লাইব্রেরি কোড তৈরি করতে পারে।

  1. আপনার Android.bp বিল্ড ফাইলে, নিম্নলিখিতের অনুরূপ একটি aconfig_declarations সেকশন যোগ করুন:

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    কোথায়:

    • name এ ডিক্লারেশনের নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।
    • package ডিক্লারেশনে ব্যবহৃত একই প্যাকেজ নামটি রয়েছে।
    • srcs সেই aconfig ফাইলের নাম থাকে যেখানে ফ্ল্যাগটি ঘোষণা করা হয়েছে।
  2. একই ফাইলে, নিম্নলিখিতের অনুরূপ একটি cc_aconfig_library টার্গেট তৈরি করুন:

    cc_aconfig_library {
        name: "aconfig_demo_flags_c_lib",
        aconfig_declarations: "aconfig_demo_flags",
    }
    

    কোথায়:

    • name এ লাইব্রেরির নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।
    • aconfig_declarations এ ডিক্লারেশনে ব্যবহৃত একই name থাকে।

    cc_aconfig_library বিল্ড টার্গেটটি C বা C++ Codegen-কে আহ্বান করে, যা বিল্ডের সময় জেনারেট করা কোড দিয়ে একটি লাইব্রেরি তৈরি করে।

    সিসি এক্যানফিগ লাইব্রেরিটি একটি সিসি লাইব্রেরি টার্গেটের মতোই, তবে এতে vendor_available , product_available , host_supported , এবং vndk মতো অপশন রয়েছে। যদি এই cc_aconfig_library উপর নির্ভরশীল বিল্ড টার্গেটের নির্দিষ্ট ধরনের ভ্যারিয়েন্টের প্রয়োজন হয়, তাহলে আপনাকে সিসি এক্যানফিগ লাইব্রেরি টার্গেটেও সংশ্লিষ্ট সেটিংটি যোগ করতে হতে পারে। উদাহরণস্বরূপ, যদি প্যারেন্ট বিল্ড টার্গেটে vendor_available true সেট করা থাকে, তাহলে আপনি এই cc_aconfig_library টার্গেটেও vendor_available true সেট করতে চাইতে পারেন।

    এই বিল্ড টার্গেটটি যোগ করার পর, আপনার কোড এই লাইব্রেরিটি অ্যাক্সেস করতে পারবে। আপনি static_lib অথবা shared_lib সিনট্যাক্স ব্যবহার করে এই লাইব্রেরিটি অন্তর্ভুক্ত করতে পারেন। মনে রাখবেন, যদি আপনি এই লাইব্রেরিটিকে একটি static_lib হিসেবে যোগ করতে চান, তাহলে server_configurable_flags এর উপর একটি shared_lib ডিপেন্ডেন্সি যোগ করুন। ধাপ ৩-এ দেখানো হয়েছে কীভাবে কোড দ্বারা জেনারেট করা ফ্ল্যাগ লাইব্রেরিটি libexample_cpp_lib এ অন্তর্ভুক্ত করতে হয়।

  3. এমন একটি টার্গেট তৈরি করুন যা aconfig ফ্ল্যাগ ব্যবহার করে, যেমন নিচের উদাহরণ cc_library :

    cc_library {
        name: "libexample_cpp_lib",
        srcs: ["src/example_cpp_lib.cc"],
        double_loadable: true,
        cflags: [
            "-Wall",
            "-Werror",
            "-Wno-unused-function",
            "-Wno-unused-parameter",
        ],
        header_libs: [
            "jni_headers",
        ],
        shared_libs: [
            "server_configurable_flags",
        ],
        static_libs: [
            "aconfig_demo_flags_c_lib",
        ],
        export_include_dirs: ["src/include"],
    }
    

    কোথায়:

    • shared_libs aconfig ফ্ল্যাগগুলির জন্য প্রয়োজনীয় অতিরিক্ত নির্ভরতা অন্তর্ভুক্ত রয়েছে।
    • static_libs হলো সেই লাইব্রেরির নাম যা ধাপ ২-এর cc_aconfig_library name ফিল্ড অনুযায়ী বিল্ড দ্বারা তৈরি হয়। স্ট্যাটিক লাইব্রেরির নামটি দিয়ে একটি cc_library এন্ট্রি তৈরি করার মাধ্যমে, আপনি এখন আপনার কোডে aconfig ফ্ল্যাগগুলো ব্যবহার করতে পারবেন।

রাস্টের জন্য একটি aconfig ফ্ল্যাগ ঘোষণা করুন

রাস্টের জন্য একটি aconfig ফ্ল্যাগ ঘোষণা করতে:

  1. যে ডিরেক্টরিতে নতুন কোডটি রয়েছে, সেখানে .aconfig এক্সটেনশনসহ একটি ফাইল তৈরি করুন, যেমন, my_new_aconfig_flag_declarations.aconfig । একটি aconfig ফাইল হলো একটি টেক্সট প্রোটো ফাইল যা একটি স্ট্যান্ডার্ড স্কিমা অনুসরণ করে।

  2. নিম্নলিখিতের অনুরূপ একটি ফ্ল্যাগ ঘোষণা যোগ করুন:

    package: "com.example.android.aconfig.demo.flags"
    container: "system"
    
    flag {
        name: "my_new_flag"
        namespace: "aconfig_demo_namespace"
        description: "This flag controls untested code"
        bug: "<none>"
    }
    

    কোথায়:

    • package , ফ্ল্যাগের নামের সাথে মিলিত হয়ে একটি অনন্য কী প্রদান করে। জাভাতে, package foo.bar হিসেবে সেট করলে foo.bar.Flags নামের একটি স্বয়ংক্রিয়ভাবে তৈরি ক্লাস তৈরি হয়। C++-এ, ফ্ল্যাগ অ্যাক্সেসর মেথডগুলোর নাম হবে foo::bar::" flagname " । একই ডিক্লারেশন ফাইলের ফ্ল্যাগগুলো একই প্যাকেজের অন্তর্ভুক্ত, কিন্তু একাধিক ডিক্লারেশন ফাইল একই প্যাকেজে ফ্ল্যাগ যোগ করতে পারে।
    • container হলো কোডের এমন একটি সংগ্রহ যা একটি বাইনারি হিসেবে একসাথে বিল্ড ও শিপ করা হয়। বৈধ কন্টেইনারগুলো হলো system , vendor , system_ext , product , name.of.apex , এবং name.of.apk

    • name এ পতাকার নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।

    • namespace মধ্যে অবদানের জন্য নেমস্পেস থাকে। আপনার নেমস্পেস নির্ধারণ করতে আপনাকে অবশ্যই নির্ধারিত গুগল রিভিউয়ারের সাথে কাজ করতে হবে। আপনি যদি আপনার নিজস্ব AOSP মিররের স্থিতিশীলতা বজায় রাখতে ফিচার লঞ্চ ফ্ল্যাগ ব্যবহার করেন, তবে আপনি আপনার পছন্দমতো নেমস্পেস ব্যবহার করতে পারেন।

    • description চিহ্নিত করা বৈশিষ্ট্য বা পরিবর্তনটির একটি সংক্ষিপ্ত বিবরণ থাকে।

    • bug হলো নতুন কোড অবদানের সাথে যুক্ত বাগ নম্বর। আপনার bug নির্ধারণ করতে আপনাকে অবশ্যই নির্ধারিত গুগল রিভিউয়ারের সাথে কাজ করতে হবে। আপনি যদি আপনার নিজের AOSP মিররের স্থিতিশীলতা বজায় রাখতে ফিচার লঞ্চ ফ্ল্যাগ ব্যবহার করেন, তাহলে আপনি আপনার বাগ ট্র্যাকিং নম্বর ব্যবহার করতে পারেন অথবা <none> ব্যবহার করতে পারেন।

  3. ফাইলটি সংরক্ষণ করুন এবং এডিটর থেকে বেরিয়ে যান।

বিল্ডটি সেট আপ করুন

আপনার ফ্ল্যাগটি ঘোষণা করার পরে, বিল্ডটি এমনভাবে সেট আপ করুন যাতে এটি ফ্ল্যাগের মান অ্যাক্সেস করার জন্য ব্যবহৃত লাইব্রেরি কোড তৈরি করতে পারে।

  1. আপনার Android.bp বিল্ড ফাইলে, নিম্নলিখিতের অনুরূপ একটি aconfig_declarations সেকশন যোগ করুন:

    aconfig_declarations {
      name: "aconfig_demo_flags",
      package: "com.example.android.aconfig.demo.flags",
      srcs: [
        "my_new_aconfig_flag_declarations.aconfig"
      ],
    }
    

    কোথায়:

    • name এ ডিক্লারেশনের নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।
    • package ডিক্লারেশনে ব্যবহৃত একই প্যাকেজ নামটি রয়েছে।
    • srcs সেই aconfig ফাইলের নাম থাকে যেখানে ফ্ল্যাগটি ডিক্লেয়ার করা হয়েছে।
  2. পরবর্তী উদাহরণের অনুরূপ একটি rust_aconfig_library টার্গেট তৈরি করুন। এই টার্গেটটি Rust Codegen-কে আহ্বান করে এবং বিল্ড টাইমে জেনারেট করা কোড দিয়ে একটি Rust লাইব্রেরি তৈরি করে।

    rust_aconfig_library {
      name: "libaconfig_demo_flags_rust",
      crate_name: "aconfig_demo_flags_rust",
      aconfig_declarations: "aconfig_demo_flags",
    }
    

    কোথায়:

    • name এ ডিক্লারেশনের নামটি থাকে, যেখানে শুধুমাত্র ছোট হাতের অক্ষর, আন্ডারস্কোর এবং সংখ্যা ব্যবহৃত হয়।
    • crate_name এ ডিক্লারেশনে ব্যবহৃত প্যাকেজের নামটিই থাকে।
    • aconfig_declarations এ ডিক্লারেশনে ব্যবহৃত একই name থাকে।

    এই পরিবর্তনের ফলে, আপনার কোড এই রাস্ট লাইব্রেরির উপর নির্ভর করতে পারবে।

  3. একই ফাইলে, নিম্নলিখিতের অনুরূপ একটি rust_library এন্ট্রি তৈরি করুন:

    rust_library {
      name: "libexample_lib",
      rustlibs: [
          "libaconfig_demo_flags_rust",
      ]
    }
    

    এই স্যাম্পলটি আপনার সোর্স কোড বিল্ড টার্গেট libexample_demo_flags_rust কোড জেনারেটেড ফ্ল্যাগ লাইব্রেরি অন্তর্ভুক্ত করার অনুমতি দেয়।

  4. ফাইলটি সংরক্ষণ করুন এবং এডিটর থেকে বেরিয়ে যান।