নিনজা (পরীক্ষামূলক) ব্যবহার করে কাস্টম C/C++ বিল্ড সিস্টেম একীভূত করুন

আপনি যদি CMake বা ndk-build ব্যবহার না করেন তবে Android Gradle প্লাগইন (AGP) C/C++ বিল্ড এবং অ্যান্ড্রয়েড স্টুডিওর সম্পূর্ণ ইন্টিগ্রেশন চান, তাহলে আপনি একটি শেল স্ক্রিপ্ট তৈরি করে একটি কাস্টম C/C++ বিল্ড সিস্টেম তৈরি করতে পারেন যা বিল্ড তথ্য লিখতে পারে নিনজা বিল্ড ফাইল ফরম্যাট।

অ্যান্ড্রয়েড স্টুডিও এবং এজিপি-তে কাস্টম C/C++ বিল্ড সিস্টেমের জন্য পরীক্ষামূলক সমর্থন যোগ করা হয়েছে। এই বৈশিষ্ট্যটি অ্যান্ড্রয়েড স্টুডিও ডলফিন থেকে শুরু করে উপলব্ধ 2021.3.1 ক্যানারি 4.

ওভারভিউ

C/C++ প্রকল্পগুলির জন্য একটি সাধারণ প্যাটার্ন, বিশেষ করে যেগুলি একাধিক প্ল্যাটফর্মকে লক্ষ্য করে, সেই সমস্ত প্ল্যাটফর্মগুলির জন্য কিছু অন্তর্নিহিত উপস্থাপনা থেকে প্রকল্প তৈরি করা। এই প্যাটার্নের একটি বিশিষ্ট উদাহরণ হল CMake । CMake একটি একক অন্তর্নিহিত উপস্থাপনা থেকে Android, iOS এবং অন্যান্য প্ল্যাটফর্মের জন্য প্রকল্প তৈরি করতে পারে, CMakeLists.txt ফাইলে সংরক্ষিত।

যদিও CMake সরাসরি AGP দ্বারা সমর্থিত, সেখানে অন্যান্য প্রজেক্ট জেনারেটর উপলব্ধ রয়েছে যা সরাসরি সমর্থিত নয়:

এই ধরনের প্রজেক্ট জেনারেটরগুলি হয় নিনজাকে C/C++ বিল্ডের ব্যাকএন্ড উপস্থাপনা হিসাবে সমর্থন করে বা ব্যাকএন্ড উপস্থাপনা হিসাবে নিনজা তৈরি করতে অভিযোজিত হতে পারে।

সঠিকভাবে কনফিগার করা হলে, একটি সমন্বিত C/C++ প্রজেক্ট সিস্টেম জেনারেটর সহ একটি AGP প্রকল্প ব্যবহারকারীদের সক্ষম করে:

  • কমান্ড-লাইন এবং অ্যান্ড্রয়েড স্টুডিও থেকে তৈরি করুন।

  • অ্যান্ড্রয়েড স্টুডিওতে সম্পূর্ণ ভাষা পরিষেবা সমর্থন সহ উত্সগুলি সম্পাদনা করুন (উদাহরণস্বরূপ, সংজ্ঞায় যান)।

  • নেটিভ এবং মিশ্র প্রসেস ডিবাগ করতে অ্যান্ড্রয়েড স্টুডিও ডিবাগার ব্যবহার করুন।

একটি কাস্টম C/C++ বিল্ড কনফিগারেশন স্ক্রিপ্ট ব্যবহার করতে কীভাবে আপনার বিল্ড পরিবর্তন করবেন

এই বিভাগটি এজিপি থেকে একটি কাস্টম C/C++ বিল্ড কনফিগারেশন স্ক্রিপ্ট ব্যবহার করার ধাপগুলি দিয়ে চলে।

ধাপ 1: একটি কনফিগারেশন স্ক্রিপ্ট উল্লেখ করতে মডিউল-স্তরের build.gradle ফাইলটি পরিবর্তন করুন

AGP-তে নিনজা সমর্থন সক্ষম করতে, মডিউল-স্তরের build.gradle ফাইলে experimentalProperties কনফিগার করুন:

android {
  defaultConfig {
    externalNativeBuild {
      experimentalProperties["ninja.abiFilters"] = [ "x86", "arm64-v8a" ]
      experimentalProperties["ninja.path"] = "source-file-list.txt"
      experimentalProperties["ninja.configure"] = "configure-ninja"
      experimentalProperties["ninja.arguments"] = [
            "\${ndk.moduleMakeFile}",
            "--variant=\${ndk.variantName}",
            "--abi=Android-\${ndk.abi}",
            "--configuration-dir=\${ndk.configurationDir}",
            "--ndk-version=\${ndk.moduleNdkVersion}",
            "--min-sdk-version=\${ndk.minSdkVersion}"
       ]
     }
   }

বৈশিষ্ট্যগুলি এজিপি দ্বারা নিম্নরূপ ব্যাখ্যা করা হয়:

  • ninja.abiFilters হল ABI-এর একটি তালিকা যা তৈরি করতে হবে। বৈধ মানগুলি হল: x86 , x86-64 , armeabi-v7a , এবং arm64-v8a

  • ninja.path হল একটি C/C++ প্রজেক্ট ফাইলের পাথ। এই ফাইলের বিন্যাস আপনি চান কিছু হতে পারে. এই ফাইলের পরিবর্তনগুলি অ্যান্ড্রয়েড স্টুডিওতে গ্রেডল সিঙ্কের জন্য একটি প্রম্পট ট্রিগার করবে।

  • ninja.configure হল একটি স্ক্রিপ্ট ফাইলের পাথ যা C/C++ প্রজেক্ট কনফিগার করার প্রয়োজন হলে Gradle দ্বারা নির্বাহ করা হবে। অ্যান্ড্রয়েড স্টুডিওতে গ্র্যাডল সিঙ্কের সময় বা কনফিগার স্ক্রিপ্ট ইনপুটগুলির মধ্যে একটি পরিবর্তন হলে একটি প্রকল্প প্রথম বিল্ডে কনফিগার করা হয়।

  • ninja.arguments হল আর্গুমেন্টের একটি তালিকা যা ninja.configure দ্বারা সংজ্ঞায়িত স্ক্রিপ্টে পাঠানো হবে। এই তালিকার উপাদানগুলি ম্যাক্রোগুলির একটি সেট উল্লেখ করতে পারে যার মানগুলি AGP-এর বর্তমান কনফিগারেশন প্রসঙ্গে নির্ভর করে:

    • ${ndk.moduleMakeFile} হল ninja.configure ফাইলের সম্পূর্ণ পথ। সুতরাং উদাহরণে, এটি হবে C:\path\to\configure-ninja.bat

    • ${ndk.variantName} হল বর্তমান AGP ভেরিয়েন্টের নাম যা তৈরি করা হচ্ছে। উদাহরণস্বরূপ, ডিবাগ বা মুক্তি।

    • ${ndk.abi} হল বর্তমান AGP ABI এর নাম যা নির্মিত হচ্ছে। উদাহরণস্বরূপ, x86 বা arm64-v8a

    • ${ndk.buildRoot} হল একটি ফোল্ডারের নাম, AGP দ্বারা উত্পন্ন, যেখানে স্ক্রিপ্ট তার আউটপুট লেখে। এর বিশদ বিবরণ ধাপ 2 এ ব্যাখ্যা করা হবে: কনফিগার স্ক্রিপ্ট তৈরি করুন

    • ${ndk.ndkVersion} হল NDK-এর যে সংস্করণ ব্যবহার করা হবে। এটি সাধারণত build.gradle ফাইলে android.ndkVersion-এ পাস করা মান অথবা কোনোটি উপস্থিত না থাকলে একটি ডিফল্ট মান।

    • ${ndk.minPlatform} হল ন্যূনতম টার্গেট Android প্ল্যাটফর্ম যা AGP দ্বারা অনুরোধ করা হয়েছে৷

  • ninja.targets হল নির্দিষ্ট নিনজা লক্ষ্যগুলির একটি তালিকা যা তৈরি করা উচিত।

ধাপ 2: কনফিগার স্ক্রিপ্ট তৈরি করুন

কনফিগার স্ক্রিপ্টের ন্যূনতম দায়িত্ব (আগের উদাহরণে configure-ninja.bat ) হল একটি build.ninja ফাইল তৈরি করা যা, Ninja দিয়ে তৈরি করা হলে, প্রকল্পের সমস্ত নেটিভ আউটপুট কম্পাইল এবং লিঙ্ক করবে। সাধারণত এগুলি হল .o (অবজেক্ট), .a (আর্কাইভ), এবং .so (শেয়ারড অবজেক্ট) ফাইল।

কনফিগার স্ক্রিপ্ট আপনার প্রয়োজনের উপর নির্ভর করে build.ninja ফাইলটিকে দুটি ভিন্ন জায়গায় লিখতে পারে।

  • যদি AGP-এর জন্য একটি অবস্থান বেছে নেওয়া ঠিক হয়, তাহলে কনফিগার স্ক্রিপ্ট ${ndk.buildRoot} ম্যাক্রোতে সেট করা অবস্থানে build.ninja লিখে।

  • যদি কনফিগার স্ক্রিপ্টটিকে build.ninja ফাইলের অবস্থান নির্বাচন করতে হয় তবে এটি ${ndk.buildRoot} ম্যাক্রোতে সেট করা অবস্থানে build.ninja.txt নামে একটি ফাইলও লিখে। এই ফাইলটিতে build.ninja ফাইলের সম্পূর্ণ পাথ রয়েছে যা কনফিগার স্ক্রিপ্ট লিখেছে।

build.ninja ফাইলের স্ট্রাকচার

সাধারণত, বেশিরভাগ কাঠামো যা সঠিকভাবে একটি Android C/C++ বিল্ডকে উপস্থাপন করে তা কাজ করবে। এজিপি এবং অ্যান্ড্রয়েড স্টুডিওর জন্য প্রয়োজনীয় মূল উপাদানগুলি হল:

  • C/C++ সোর্স ফাইলের তালিকা সহ ফ্ল্যাগগুলিকে কম্পাইল করার জন্য ক্ল্যাং-এর প্রয়োজন।

  • আউটপুট লাইব্রেরির তালিকা। এগুলি সাধারণত .so (শেয়ারড অবজেক্ট) ফাইল তবে .a (আর্কাইভ) বা এক্সিকিউটেবল (কোন এক্সটেনশন) হতে পারে।

আপনার যদি একটি build.ninja ফাইল তৈরি করার উদাহরণের প্রয়োজন হয়, আপনি যখন build.ninja জেনারেটর ব্যবহার করা হয় তখন আপনি CMake এর আউটপুট দেখতে পারেন।

এখানে একটি ন্যূনতম build.ninja টেমপ্লেটের উদাহরণ।

rule COMPILE
   command = /path/to/ndk/clang -c $in -o $out {other flags}
rule LINK
   command = /path/to/ndk/clang $in -o $out {other flags}

build source.o : COMPILE source.cpp
build lib.so : LINK source.o

সর্বোত্তম অনুশীলন

প্রয়োজনীয়তাগুলি ছাড়াও (উৎস ফাইল এবং আউটপুট লাইব্রেরির তালিকা), এখানে কিছু প্রস্তাবিত সেরা অনুশীলন রয়েছে।

phony নিয়ম সহ নামযুক্ত আউটপুট ঘোষণা করুন

সম্ভব হলে, বিল্ড আউটপুটকে মানব-পাঠযোগ্য নাম দেওয়ার জন্য build.ninja কাঠামোটি phony নিয়ম ব্যবহার করার পরামর্শ দেওয়া হয়। সুতরাং উদাহরণস্বরূপ, আপনার যদি c:/path/to/lib.so নামে একটি আউটপুট থাকে তবে আপনি এটিকে নিম্নরূপ একটি মানব-পাঠযোগ্য নাম দিতে পারেন।

build curl: phony /path/to/lib.so

এটি করার সুবিধা হল যে আপনি তারপর build.gradle ফাইলে একটি বিল্ড টার্গেট হিসাবে এই নামটি নির্দিষ্ট করতে পারেন। যেমন,

android {
  defaultConfig {
    externalNativeBuild {
      ...
      experimentalProperties["ninja.targets"] = [ "curl" ]

একটি 'সমস্ত' লক্ষ্য নির্দিষ্ট করুন

আপনি যখন একটি all লক্ষ্য নির্দিষ্ট করেন তখন এটি হবে AGP দ্বারা নির্মিত লাইব্রেরির ডিফল্ট সেট যখন build.gradle ফাইলে কোনো লক্ষ্য স্পষ্টভাবে উল্লেখ করা হয় না।

rule COMPILE
   command = /path/to/ndk/clang $in -o $out {other flags}
rule LINK
   command = /path/to/ndk/clang $in -o $out {other flags}

build foo.o : COMPILE foo.cpp
build bar.o : COMPILE bar.cpp
build libfoo.so : LINK foo.o
build libbar.so : LINK bar.o
build all: phony libfoo.so libbar.so

একটি বিকল্প নির্মাণ পদ্ধতি নির্দিষ্ট করুন (ঐচ্ছিক)

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

এটি সম্পন্ন করার জন্য, আপনি একটি নির্দিষ্ট এক্সটেনশন .passthrough সহ একটি নিনজা বিল্ড আউটপুট ব্যবহার করতে পারেন।

একটি আরও সুনির্দিষ্ট উদাহরণ হিসাবে, ধরা যাক আপনি একটি MSBuild মোড়ানো করতে চান। আপনার কনফিগার স্ক্রিপ্ট স্বাভাবিক হিসাবে build.ninja তৈরি করবে, কিন্তু এটি একটি পাসথ্রু লক্ষ্যও যোগ করবে যা নির্ধারণ করে যে AGP কীভাবে MSBuild চালু করবে।

rule COMPILE
   command = /path/to/ndk/clang $in -o $out {other flags}
rule LINK
   command = /path/to/ndk/clang $in -o $out {other flags}

rule MBSUILD_CURL
  command = /path/to/msbuild {flags to build curl with MSBuild}

build source.o : COMPILE source.cpp
build lib.so : LINK source.o
build curl : phony lib.so
build curl.passthrough : MBSUILD_CURL

মতামত দিন

এই বৈশিষ্ট্যটি পরীক্ষামূলক, তাই প্রতিক্রিয়া ব্যাপকভাবে প্রশংসা করা হয়। আপনি নিম্নলিখিত চ্যানেলগুলির মাধ্যমে প্রতিক্রিয়া জানাতে পারেন:

  • সাধারণ প্রতিক্রিয়ার জন্য, এই বাগটিতে একটি মন্তব্য যোগ করুন।

  • একটি বাগ রিপোর্ট করতে, অ্যান্ড্রয়েড স্টুডিও খুলুন এবং সহায়তা > প্রতিক্রিয়া জমা দিন ক্লিক করুন। বাগ নির্দেশ করতে সাহায্য করার জন্য "কাস্টম C/C++ বিল্ড সিস্টেম" উল্লেখ করতে ভুলবেন না।

  • আপনার Android স্টুডিও ইনস্টল না থাকলে একটি বাগ রিপোর্ট করতে, এই টেমপ্লেটটি ব্যবহার করে একটি বাগ ফাইল করুন৷