জাভা এসডিকে লাইব্রেরি বাস্তবায়ন করা হচ্ছে

অ্যান্ড্রয়েড প্ল্যাটফর্মে প্রচুর পরিমাণে ভাগ করা জাভা লাইব্রেরি রয়েছে যা ঐচ্ছিকভাবে অ্যাপ ম্যানিফেস্টে <uses-library> ট্যাগ সহ অ্যাপগুলির ক্লাসপাথে অন্তর্ভুক্ত করা যেতে পারে। অ্যাপগুলি এই লাইব্রেরিগুলির সাথে লিঙ্ক করে, তাই সামঞ্জস্য, API পর্যালোচনা এবং টুলিং সমর্থনের ক্ষেত্রে এগুলিকে বাকি Android API-এর মতোই ব্যবহার করুন৷ উল্লেখ্য, যাইহোক, বেশিরভাগ লাইব্রেরিতে এই বৈশিষ্ট্যগুলি নেই।

java_sdk_library মডিউল টাইপ এই ধরনের লাইব্রেরি পরিচালনা করতে সাহায্য করে। ডিভাইস নির্মাতারা তাদের নিজস্ব ভাগ করা জাভা লাইব্রেরির জন্য এই প্রক্রিয়াটি ব্যবহার করতে পারে, তাদের API-এর জন্য পশ্চাদপদ সামঞ্জস্য বজায় রাখতে। ডিভাইস নির্মাতারা যদি বুটক্লাস পাথের পরিবর্তে <uses-library> ট্যাগের মাধ্যমে তাদের নিজস্ব ভাগ করা জাভা লাইব্রেরি ব্যবহার করে, java_sdk_library যাচাই করতে পারে যে সেই জাভা লাইব্রেরিগুলি API- স্থিতিশীল।

java_sdk_library অ্যাপ দ্বারা ব্যবহারের জন্য ঐচ্ছিক SDK API প্রয়োগ করে। আপনার বিল্ড ফাইলে ( Android.bp ) java_sdk_library এর মাধ্যমে বাস্তবায়িত লাইব্রেরিগুলি নিম্নলিখিত ক্রিয়াকলাপগুলি সম্পাদন করে:

  • স্টাব লাইব্রেরিগুলি stubs , stubs.system এবং stubs.test অন্তর্ভুক্ত করার জন্য তৈরি করা হয়। এই স্টাব লাইব্রেরিগুলি @hide , @SystemApi , এবং @TestApi টীকা চিনতে পেরে তৈরি করা হয়েছে৷
  • java_sdk_library একটি API সাবডিরেক্টরিতে API স্পেসিফিকেশন ফাইল (যেমন current.txt ) পরিচালনা করে। এই ফাইলগুলি সাম্প্রতিকতম সংস্করণ কিনা তা নিশ্চিত করতে সর্বশেষ কোডের বিপরীতে পরীক্ষা করা হয়। যদি সেগুলি না থাকে, তাহলে আপনি একটি ত্রুটি বার্তা পাবেন যা ব্যাখ্যা করে কিভাবে সেগুলিকে আপডেট করতে হয়৷ সমস্ত আপডেট পরিবর্তনগুলি আপনার প্রত্যাশার সাথে মেলে তা নিশ্চিত করতে ম্যানুয়ালি পর্যালোচনা করুন।

    সমস্ত API আপডেট করতে, m update-api ব্যবহার করুন। একটি API আপ-টু-ডেট তা যাচাই করতে, m checkapi ব্যবহার করুন।
  • এপিআই স্পেসিফিকেশন ফাইলগুলি সাম্প্রতিক প্রকাশিত অ্যান্ড্রয়েড সংস্করণগুলির বিরুদ্ধে পরীক্ষা করা হয় যাতে API পূর্ববর্তী প্রকাশগুলির সাথে পিছিয়ে-সামঞ্জস্যপূর্ণ। AOSP-এর অংশ হিসাবে প্রদত্ত java_sdk_library মডিউলগুলি তাদের পূর্বে প্রকাশিত সংস্করণগুলিকে prebuilts/sdk/<latest number> এ রাখে।
  • API স্পেসিফিকেশন ফাইল চেক করার ক্ষেত্রে, আপনি নিম্নলিখিত তিনটি জিনিসের মধ্যে একটি করতে পারেন:
    • চেকগুলিকে এগিয়ে যাওয়ার অনুমতি দিন। (কিছুই করবেন না।)
    • java_sdk_library এ নিম্নলিখিত যোগ করে চেকগুলি অক্ষম করুন:
      unsafe_ignore_missing_latest_api: true,
    • version/scope/api ডিরেক্টরিতে module_name.txt নামে খালি টেক্সট ফাইল তৈরি করে নতুন java_sdk_library মডিউলের জন্য খালি API প্রদান করুন।
  • রানটাইমের জন্য বাস্তবায়ন লাইব্রেরি ইনস্টল করা থাকলে, একটি XML ফাইল তৈরি এবং ইনস্টল করা হয়।

কিভাবে java_sdk_library কাজ করে

X নামক একটি java_sdk_library নিম্নলিখিত তৈরি করে:

  1. বাস্তবায়ন লাইব্রেরির দুটি কপি: একটি লাইব্রেরি যাকে বলা হয় X এবং আরেকটিকে X.impl বলা হয়। লাইব্রেরি X ডিভাইসে ইনস্টল করা আছে। লাইব্রেরি X.impl শুধুমাত্র তখনই থাকে যখন ইমপ্লিমেন্টেশন লাইব্রেরিতে সুস্পষ্ট অ্যাক্সেসের প্রয়োজন হয় অন্যান্য মডিউল, যেমন পরীক্ষার ক্ষেত্রে ব্যবহারের জন্য। নোট করুন যে স্পষ্ট অ্যাক্সেস খুব কমই প্রয়োজন।
  2. অ্যাক্সেস কাস্টমাইজ করতে স্কোপগুলি সক্ষম এবং অক্ষম করা যেতে পারে। (জাভা কীওয়ার্ড-অ্যাক্সেস মডিফায়ারের মতো, একটি পাবলিক স্কোপ বিস্তৃত অ্যাক্সেস সরবরাহ করে; একটি পরীক্ষার সুযোগে শুধুমাত্র পরীক্ষায় ব্যবহৃত API থাকে।) প্রতিটি সক্রিয় সুযোগের জন্য লাইব্রেরি নিম্নলিখিতগুলি তৈরি করে:
    • একটি স্টাব সোর্স মডিউল ( droidstubs মডিউল টাইপের) - বাস্তবায়নের উত্স গ্রহণ করে এবং API স্পেসিফিকেশন ফাইলের সাথে স্টাব উত্সগুলির একটি সেট আউটপুট করে।
    • একটি স্টাব লাইব্রেরি ( java_library মডিউল টাইপের) - হল স্টাবগুলির সংকলিত সংস্করণ। এটি কম্পাইল করার জন্য ব্যবহৃত libs java_sdk_library এ সরবরাহ করা একই নয়, যা নিশ্চিত করে যে বাস্তবায়নের বিবরণ API স্টাবগুলিতে ফাঁস না হয়।
    • স্টাবগুলি কম্পাইল করার জন্য আপনার যদি অতিরিক্ত লাইব্রেরির প্রয়োজন হয়, সেগুলি সরবরাহ করতে stub_only_libs এবং stub_only_static_libs বৈশিষ্ট্যগুলি ব্যবহার করুন।

যদি একটি java_sdk_library বলা হয় “ X ”, এবং এর বিপরীতে কম্পাইল করা হচ্ছে “ X ”, সর্বদা এটিকে সেভাবে উল্লেখ করুন এবং এটি পরিবর্তন করবেন না। বিল্ড একটি উপযুক্ত লাইব্রেরি নির্বাচন করবে। আপনার কাছে সবচেয়ে উপযুক্ত লাইব্রেরি আছে তা নিশ্চিত করতে, বিল্ডে ত্রুটি দেখা দিয়েছে কিনা তা দেখতে আপনার স্টাবগুলি পরিদর্শন করুন। এই নির্দেশিকা ব্যবহার করে যেকোনো প্রয়োজনীয় সংশোধন করুন:

  • কমান্ড লাইনটি দেখে এবং আপনার সুযোগ নির্ধারণের জন্য সেখানে কোন স্টাবগুলি তালিকাভুক্ত করা হয়েছে তা পরিদর্শন করে আপনার একটি উপযুক্ত লাইব্রেরি রয়েছে তা যাচাই করুন:
    • স্কোপ খুবই প্রশস্ত: নির্ভরশীল লাইব্রেরির জন্য API-এর একটি নির্দিষ্ট সুযোগ প্রয়োজন। কিন্তু আপনি লাইব্রেরিতে অন্তর্ভুক্ত APIগুলি দেখতে পাচ্ছেন যা সেই সুযোগের বাইরে পড়ে, যেমন সিস্টেম APIগুলি সর্বজনীন APIগুলির সাথে অন্তর্ভুক্ত।
    • সুযোগ খুব সংকীর্ণ: নির্ভরশীল লাইব্রেরির সমস্ত প্রয়োজনীয় লাইব্রেরিতে অ্যাক্সেস নেই। উদাহরণস্বরূপ, নির্ভরশীল লাইব্রেরি সিস্টেম API ব্যবহার করতে হবে কিন্তু পরিবর্তে পাবলিক API পায়। এটি সাধারণত একটি সংকলন ত্রুটির কারণ হয় কারণ প্রয়োজনীয় API অনুপস্থিত।
  • লাইব্রেরি ঠিক করতে, নিম্নলিখিতগুলির মধ্যে একটি করুন:
    • আপনার প্রয়োজনীয় সংস্করণ নির্বাচন করতে sdk_version পরিবর্তন করুন। বা
    • স্পষ্টভাবে উপযুক্ত লাইব্রেরি নির্দিষ্ট করুন, যেমন <X>.stubs বা <X>.stubs.system

java_sdk_library এক্স ব্যবহার

ইমপ্লিমেন্টেশন লাইব্রেরি X ব্যবহার করা হয় যখন এটি apex.java_libs থেকে উল্লেখ করা হয়। যাইহোক, একটি Soong সীমাবদ্ধতার কারণে, যখন একই APEX লাইব্রেরির মধ্যে অন্য java_sdk_library মডিউল থেকে লাইব্রেরি X উল্লেখ করা হয়, তখন X.impl স্পষ্টভাবে ব্যবহার করতে হবে, লাইব্রেরি X নয়।

যখন java_sdk_library অন্য কোথাও থেকে উল্লেখ করা হয়, তখন একটি stubs লাইব্রেরি ব্যবহার করা হয়। স্টাবস লাইব্রেরিটি নির্ভরশীল মডিউলের sdk_version প্রপার্টি সেটিং অনুসারে নির্বাচিত হয়। উদাহরণস্বরূপ, একটি মডিউল যা sdk_version: "current" সর্বজনীন স্টাব ব্যবহার করে, যেখানে একটি মডিউল যা sdk_version: "system_current" সিস্টেম স্টাব ব্যবহার করে। যদি একটি সঠিক মিল খুঁজে পাওয়া যায় না, নিকটতম স্টাব লাইব্রেরি ব্যবহার করা হয়। একটি java_sdk_library যা শুধুমাত্র একটি পাবলিক API প্রদান করে তা সবার জন্য পাবলিক স্টাব সরবরাহ করবে।

Java SDK লাইব্রেরি দিয়ে প্রবাহ তৈরি করুন
চিত্র 1. জাভা SDK লাইব্রেরি দিয়ে প্রবাহ তৈরি করুন

উদাহরণ এবং উত্স

srcs এবং api_packages বৈশিষ্ট্য অবশ্যই java_sdk_library এ উপস্থিত থাকতে হবে।

java_sdk_library {
        name: "com.android.future.usb.accessory",
        srcs: ["src/**/*.java"],
        api_packages: ["com.android.future.usb"],
    }

AOSP সুপারিশ করে (কিন্তু এর প্রয়োজন নেই) যে নতুন java_sdk_library দৃষ্টান্তগুলি তারা যে API স্কোপগুলি ব্যবহার করতে চায় তা স্পষ্টভাবে সক্ষম করে৷ এছাড়াও আপনি (ঐচ্ছিকভাবে) বিদ্যমান java_sdk_library দৃষ্টান্ত স্থানান্তর করতে পারেন যাতে তারা যে API স্কোপগুলি ব্যবহার করবে তা স্পষ্টভাবে সক্ষম করতে:

java_sdk_library {
         name: "lib",
         public: {
           enabled: true,
         },
         system: {
           enabled: true,
         },
         …
    }

রানটাইমের জন্য ব্যবহৃত impl লাইব্রেরি কনফিগার করতে, সমস্ত সাধারণ java_library বৈশিষ্ট্যগুলি ব্যবহার করুন, যেমন hostdex , compile_dex , এবং errorprone

java_sdk_library {
        name: "android.test.base",

        srcs: ["src/**/*.java"],

        errorprone: {
          javacflags: ["-Xep:DepAnn:ERROR"],
        },

        hostdex: true,

        api_packages: [
            "android.test",
            "android.test.suitebuilder.annotation",
            "com.android.internal.util",
            "junit.framework",
        ],

        compile_dex: true,
    }

স্টাব লাইব্রেরি কনফিগার করতে, নিম্নলিখিত বৈশিষ্ট্যগুলি ব্যবহার করুন:

  • merge_annotations_dirs এবং merge_inclusion_annotations_dirs
  • api_srcs : ঐচ্ছিক সোর্স ফাইলের তালিকা যা API এর অংশ কিন্তু রানটাইম লাইব্রেরির অংশ নয়।
  • stubs_only_libs : জাভা লাইব্রেরির তালিকা যা স্টাব তৈরি করার সময় ক্লাসপথে থাকে।
  • hidden_api_packages : প্যাকেজ নামের তালিকা যা API থেকে লুকানো আবশ্যক।
  • droiddoc_options : মেটালভা এর জন্য অতিরিক্ত আর্গুমেন্ট।
  • droiddoc_option_files : $(location <label>) ব্যবহার করে যে ফাইলগুলিকে droiddoc_options থেকে উল্লেখ করা যেতে পারে তার তালিকা করে, যেখানে <file> তালিকার একটি এন্ট্রি।
  • annotations_enabled

java_sdk_library একটি java_library , কিন্তু এটি একটি droidstubs মডিউল নয় এবং তাই সমস্ত droidstubs বৈশিষ্ট্য সমর্থন করে না। নিম্নলিখিত উদাহরণটি android.test.mock লাইব্রেরি বিল্ড ফাইল থেকে নেওয়া হয়েছে।

java_sdk_library {
        name: "android.test.mock",

        srcs: [":android-test-mock-sources"],
        api_srcs: [
            // Note: The following aren’t APIs of this library. Only APIs under the
            // android.test.mock package are taken. These do provide private APIs
            // to which android.test.mock APIs reference. These classes are present
            // in source code form to access necessary comments that disappear when
            // the classes are compiled into a Jar library.
            ":framework-core-sources-for-test-mock",
            ":framework_native_aidl",
        ],

        libs: [
            "framework",
            "framework-annotations-lib",
            "app-compat-annotations",
            "Unsupportedappusage",
        ],

        api_packages: [
            "android.test.mock",
        ],
        permitted_packages: [
            "android.test.mock",
        ],
        compile_dex: true,
        default_to_stubs: true,
    }

পশ্চাদপদ সামঞ্জস্য বজায় রাখা

বিল্ড সিস্টেম বিল্ড টাইমে জেনারেট করা এপিআই ফাইলের সাথে লেটেস্ট এপিআই ফাইলের তুলনা করে এপিআইগুলি পশ্চাদগামী সামঞ্জস্য বজায় রেখেছে কিনা তা পরীক্ষা করে। java_sdk_library prebuilt_apis দ্বারা প্রদত্ত তথ্য ব্যবহার করে সামঞ্জস্য পরীক্ষা করে। java_sdk_library এর সাথে নির্মিত সমস্ত লাইব্রেরিতে prebuilt_apisapi_dirs এর সর্বশেষ সংস্করণে API ফাইল থাকতে হবে। আপনি যখন সংস্করণটি প্রকাশ করেন, তখন API তালিকাভুক্ত ফাইল এবং স্টাব লাইব্রেরিগুলি PRODUCT=sdk_phone_armv7-sdk এর সাথে dist বিল্ডের সাথে পাওয়া যেতে পারে।

api_dirs বৈশিষ্ট্য হল prebuilt_apis এ API সংস্করণ ডিরেক্টরিগুলির তালিকা। API-সংস্করণ ডিরেক্টরিগুলি অবশ্যই Android.bp ডিরেক্টরি স্তরে অবস্থিত হতে হবে৷

prebuilt_apis {
       name: "foo",
       api_dirs: [
           "1",
           "2",
             ....
           "30",
           "current",
       ],
    }

প্রি-বিল্ট ডিরেক্টরির অধীনে version / scope /api/ কাঠামো সহ ডিরেক্টরিগুলি কনফিগার করুন। version API scope সাথে মিলে যায় এবং ডিরেক্টরিটি সর্বজনীন, সিস্টেম বা পরীক্ষা কিনা তা নির্ধারণ করে।

  • version / scope জাভা লাইব্রেরি রয়েছে।
  • version / scope /api API .txt ফাইল রয়েছে। এখানে module_name .txt এবং module_name -removed.txt নামে খালি টেক্সট ফাইল তৈরি করুন।
     ├── 30
          │   ├── public
          │   │   ├── api
          │   │   │   ├── android.test.mock-removed.txt
          │   │   │   └── android.test.mock.txt
          │   │   └── android.test.mock.jar
          │   ├── system
          │   │   ├── api
          │   │   │   ├── android.test.mock-removed.txt
          │   │   │   └── android.test.mock.txt
          │   │   └── android.test.mock.jar
          │   └── test
          │       ├── api
          │       │   ├── android.test.mock-removed.txt
          │       │   └── android.test.mock.txt
          │       └── android.test.mock.jar
          └── Android.bp