অ্যান্ড্রয়েড 7.0 রিলিজ করার আগে, অ্যান্ড্রয়েড ব্যবহার গনুহ মেক বর্ণনা ও তার বিল্ড নিয়ম চালানো একচেটিয়াভাবে। মেক বিল্ড সিস্টেম ব্যাপকভাবে সমর্থিত এবং ব্যবহার করা হয়, কিন্তু অ্যান্ড্রয়েডের স্কেলে ধীর, ত্রুটি প্রবণ, অপ্রতিরোধ্য এবং পরীক্ষা করা কঠিন হয়ে পড়ে। Soong থেকে বিল্ড সিস্টেম নমনীয়তা অ্যান্ড্রয়েড তৈরী করে জন্য প্রয়োজন বোধ করা প্রদান করে।
এই কারণে, প্ল্যাটফর্ম ডেভেলপাররা যত তাড়াতাড়ি সম্ভব মেক থেকে স্যুইচ এবং দত্তক নেবে বলে আশা করা হচ্ছে। প্রশ্ন পাঠান অ্যান্ড্রয়েড-বিল্ডিং Google গোষ্ঠী সমর্থন প্রাপ্ত সদস্যতা।
Soong কি?
Soong থেকে বিল্ড সিস্টেম অ্যান্ড্রয়েড 7.0 (বাদামের তক্তি) চালু হয় মেক প্রতিস্থাপন। এটা তোলে লিভারেজ কতি গনুহ মেক ক্লোন টুল এবং নিনজা গতি বাড়াতে বিল্ড সিস্টেম উপাদান Android এর তৈরী করে।
দেখুন অ্যানড্রইড মেক বিল্ড সিস্টেম সাধারণ Android এর জন্য ওপেন সোর্স প্রজেক্ট (AOSP) বর্ণনা নির্দেশাবলী এবং Android.mk লেখকদের সিস্টেম পরিবর্তন তৈরি করুন মেক থেকে Soong থেকে মানিয়ে প্রয়োজন পরিবর্তন বিষয়ে জানার জন্য।
দেখুন বিল্ড-সম্পর্কিত এন্ট্রি মূল শব্দ এবং সংজ্ঞা শব্দকোষে এর Soong থেকে রেফারেন্স ফাইল সম্পূর্ণ বিবরণের জন্য।
মেক এবং সোং এর তুলনা
এখানে Soong থেকে একটি Soong থেকে কনফিগারেশন (ব্লুপ্রিন্ট বা একই পৌঁছনোর সঙ্গে বন্ধুত্ব গড়ে তুলুন কনফিগারেশন একটি তুলনামূলক হয় .bp
) ফাইল।
উদাহরণ তৈরি করুন
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux
LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src
LOCAL_SRC_FILES := $(call \
all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)
সূং উদাহরণ
cc_library_shared {
name: “libxmlrpc++”,
rtti: true,
cppflags: [
“-Wall”,
“-Werror”,
“-fexceptions”,
],
export_include_dirs: [“src”],
srcs: [“src/**/*.cpp”],
target: {
darwin: {
enabled: false,
},
},
}
দেখুন সরল কনফিগারেশন বিল্ড পরীক্ষা-নির্দিষ্ট Soong থেকে কনফিগারেশন উদাহরণের জন্য।
Android.bp ফাইল ফরম্যাট
নকশা করে, Android.bp
ফাইল সহজ। তারা শর্তাধীন বা নিয়ন্ত্রণ প্রবাহ বিবৃতি ধারণ করে না; সমস্ত জটিলতা গো এ লেখা বিল্ড লজিক দ্বারা পরিচালিত হয়। যখন সম্ভব, সিনট্যাক্স এবং শব্দার্থবিদ্যা Android.bp
ফাইল একই রকম Bazel বিল্ড ফাইল ।
মডিউল
একটি ইন একটি মডিউল Android.bp
একটি ফাইল শুরু মডিউল টাইপ এ সম্পত্তি একটি সেট দ্বারা অনুসরণ name: "value",
বিন্যাস:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
প্রতিটি মডিউল একটি থাকতে হবে name
সম্পত্তি, এবং মান জুড়ে অনন্য হওয়া আবশ্যক Android.bp
, ফাইল ছাড়া name
নামব্যবধান এবং prebuilt মডিউল সম্পত্তি মূল্যবোধ, যা পুনরাবৃত্তি হতে পারে।
srcs
সম্পত্তি নির্দিষ্ট করে উৎস মডিউল নির্মাণ করতে ব্যবহৃত ফাইল, স্ট্রিং একটি তালিকা হিসাবে। আপনি অন্যান্য মডিউল যা, উৎস ফাইল উত্পাদন মত আউটপুট উল্লেখ করতে পারেন genrule
বা filegroup
, মডিউল রেফারেন্স সিনট্যাক্স ব্যবহার করে ":<module-name>"
।
বৈধ মডিউল ধরনের এবং তাদের ওয়েবসাইটের একটি তালিকার জন্য দেখুন Soong থেকে মডিউল রেফারেন্স ।
প্রকারভেদ
ভেরিয়েবল এবং প্রপার্টিগুলি দৃ strongly়ভাবে টাইপ করা হয়, ভেরিয়েবলগুলি গতিশীলভাবে প্রথম অ্যাসাইনমেন্টের উপর ভিত্তি করে এবং বৈশিষ্ট্যগুলি মডিউল টাইপ দ্বারা স্থিরভাবে সেট করা হয়। সমর্থিত প্রকারগুলি হল:
- Booleans (
true
বাfalse
) - পূর্ণসংখ্যার (
int
) - স্ট্রিংস (
"string"
) - স্ট্রিং তালিকা (
["string1", "string2"]
) - মানচিত্র (
{key1: "value1", key2: ["value2"]}
)
মানচিত্রে নেস্টেড মানচিত্র সহ যে কোন ধরণের মান থাকতে পারে। তালিকা এবং মানচিত্রে শেষ মানের পরে কমা থাকতে পারে।
গ্লব
বৈশিষ্ট্য যে ফাইলগুলির একটি তালিকা নেওয়া যেমন srcs
, এছাড়াও উল্লিখিত glob নিদর্শন গ্রহণ করতে পারেন। উল্লিখিত glob নিদর্শন স্বাভাবিক ইউনিক্স ওয়াইল্ডকার্ড ধারণ করতে পারে *
উদাহরণস্বরূপ, *.java
। উল্লিখিত glob নিদর্শন একটি একক ধারণ করতে পারে **
একটি পাথ উপাদান, যা শূন্য বা তার বেশি পথ উপাদানের সাথে মিলে যায় যেমন ওয়াইল্ডকার্ড। উদাহরণস্বরূপ, java/**/*.java
উভয় মিলে যায় java/Main.java
এবং java/com/android/Main.java
নিদর্শন।
পরিবর্তনশীল
একটি Android.bp
ফাইল টপ লেভেল পরিবর্তনশীল বরাদ্দকরণ থাকতে পারে:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
ভেরিয়েবলগুলি যে ফাইলটিতে তারা ঘোষিত হয় তার অবশিষ্টাংশ এবং সেইসাথে যেকোনো চাইল্ড ব্লুপ্রিন্ট ফাইলের মধ্যে রয়েছে। ভেরিয়েবল এক ব্যতিক্রম অপরিবর্তনীয় হয়: তারা একটি সঙ্গে যোগ করা যেতে পারে +=
নিয়োগ, কিন্তু শুধুমাত্র আগে তারা রেফারেন্সড করছি।
মন্তব্য
Android.bp
ফাইল সি-শৈলী একাধিক লাইন থাকতে পারে /* */
এবং সি ++ শৈলী একক লাইন //
মন্তব্য নেই।
অপারেটর
স্ট্রিং, স্ট্রিংয়ের তালিকা এবং মানচিত্র + অপারেটর ব্যবহার করে যুক্ত করা যেতে পারে। পূর্ণসংখ্যার ব্যবহার সংকলিত আপ করা যাবে +
অপারেটর। একটি মানচিত্র সংযোজন উভয় মানচিত্রে কীগুলির সংমিশ্রণ তৈরি করে, উভয় মানচিত্রে উপস্থিত যেকোন কীগুলির মান যুক্ত করে।
শর্তাবলী
Soong থেকে এ কন্ডিশন সমর্থন করে না Android.bp
ফাইল। পরিবর্তে, নির্মাণের নিয়মগুলির জটিলতা যা শর্তসাপেক্ষ প্রয়োজন হবে গো-তে পরিচালিত হয়, যেখানে উচ্চ-স্তরের ভাষা বৈশিষ্ট্যগুলি ব্যবহার করা যেতে পারে এবং শর্তাবলীর দ্বারা প্রবর্তিত অন্তর্নিহিত নির্ভরতাগুলি ট্র্যাক করা যায়। বেশিরভাগ শর্তাবলী মানচিত্রের সম্পত্তিতে রূপান্তরিত হয়, যেখানে মানচিত্রে মানগুলির মধ্যে একটি নির্বাচন করা হয় এবং শীর্ষ স্তরের বৈশিষ্ট্যগুলিতে যুক্ত করা হয়।
উদাহরণস্বরূপ, আর্কিটেকচার-নির্দিষ্ট ফাইলগুলি সমর্থন করতে:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
ফরম্যাটার
Soong থেকে ব্লুপ্রিন্ট ফাইল, অনুরূপ একটি ক্যানোনিকাল ফরম্যাটার অন্তর্ভুক্ত gofmt । করতে যাও recursively সব ফরম্যাট Android.bp
বর্তমান ডিরেক্টরি হবে, চালানো ফাইল:
bpfmt -w .
ক্যানোনিকাল ফরম্যাটে চার-স্পেস ইন্ডেন্টস, একটি মাল্টিলেমেন্ট তালিকার প্রতিটি উপাদানের পরে নতুন লাইন এবং তালিকা এবং মানচিত্রে একটি পিছনের কমা অন্তর্ভুক্ত।
বিশেষ মডিউল
কিছু বিশেষ মডিউল গ্রুপের অনন্য বৈশিষ্ট্য রয়েছে।
ডিফল্ট মডিউল
একটি ডিফল্ট মডিউল একাধিক মডিউলে একই বৈশিষ্ট্য পুনরাবৃত্তি করতে ব্যবহার করা যেতে পারে। উদাহরণ স্বরূপ:
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
পূর্বনির্মিত মডিউল
কিছু পূর্বনির্মিত মডিউল প্রকার একটি মডিউলকে তার উৎস-ভিত্তিক প্রতিপক্ষের মতো নাম রাখার অনুমতি দেয়। উদাহরণ হিসেবে বলা যায়, একটি হতে পারে cc_prebuilt_binary
নামে foo
আছে যখন ইতিমধ্যে একটি এর cc_binary
একই নামের। এটি ডেভেলপারদের চূড়ান্ত পণ্যের মধ্যে কোন সংস্করণ অন্তর্ভুক্ত করতে হবে তা বেছে নেওয়ার নমনীয়তা দেয়। একটি বিল্ড কনফিগারেশন উভয় সংস্করণই থাকে, prefer
prebuilt মডিউল সংজ্ঞা নির্দেশনা কোন সংস্করণটি অগ্রাধিকার আছে মধ্যে পতাকা মান। মনে রাখবেন, কিছু prebuilt মডিউল নাম দিয়ে শুরু করো না আছে prebuilt
যেমন android_app_import
।
নেমস্পেস মডিউল
যতক্ষণ না অ্যান্ড্রয়েড সম্পূর্ণরূপে Soong থেকে করা থেকে পরিবর্তন করে, মেক পণ্য কনফিগারেশন একটি নির্দিষ্ট করতে হবে PRODUCT_SOONG_NAMESPACES
মান। তার মান Soong থেকে রপ্তানির দ্বারা নির্মাণ করা করা নামব্যবধান একটি স্থান পৃথক করা তালিকা থাকা উচিত m
কমান্ড। অ্যান্ড্রয়েডের সুং -এ রূপান্তর সম্পূর্ণ হওয়ার পরে, নামস্থান সক্রিয় করার বিবরণ পরিবর্তন হতে পারে।
Soong বিভিন্ন ডিরেক্টরিতে মডিউলগুলিকে একই নাম নির্দিষ্ট করার ক্ষমতা প্রদান করে, যতক্ষণ পর্যন্ত প্রতিটি মডিউল আলাদা নামস্থানের মধ্যে ঘোষণা করা হয়। একটি নামস্থান এইভাবে ঘোষণা করা যেতে পারে:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
মনে রাখবেন যে একটি নামস্থান একটি নাম সম্পত্তি নেই; এর পথ স্বয়ংক্রিয়ভাবে তার নাম হিসাবে নির্ধারিত হয়।
প্রতিটি সং মডিউলকে গাছের অবস্থানের উপর ভিত্তি করে একটি নামস্থান দেওয়া হয়। প্রতিটি Soong থেকে মডিউল নামস্থান দ্বারা সংজ্ঞায়িত মধ্যে বলে মনে করা হয় soong_namespace
একটি পাওয়া Android.bp
বর্তমান ডিরেক্টরী অথবা নিকটতম পূর্বপুরুষ ডিরেক্টরির মধ্যে ফাইল। যদি এ ধরনের কোন soong_namespace
মডিউল পাওয়া যায়, মডিউল অন্তর্নিহিত মূল নামস্থান হতে বিবেচনা করা হয়।
এখানে একটি উদাহরণ দেওয়া হল: Soong নেমস্পেস N তে মডিউল M দ্বারা ঘোষিত নির্ভরশীলতা D সমাধান করার চেষ্টা করে যা নামস্থান I1, I2, I3 আমদানি করে…
- যদি ডি ফর্মের একটি সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নাম
//namespace:module
, শুধুমাত্র নির্দিষ্ট নামস্থান নিদিষ্ট মডিউল নামের জন্য অনুসন্ধান করা হয়। - অন্যথায়, Soong প্রথমে D নামক একটি মডিউল খুঁজছে যা নামস্থান N- এ ঘোষিত।
- যদি সেই মডিউলটির অস্তিত্ব না থাকে, তবে সং নামক স্থানে I1, I2, I3 নামক মডিউল খুঁজছে ...
- সবশেষে, Soong রুট নেমস্পেসে দেখে।