জ্যাকের সাথে কম্পাইল করুন (AOSP 6.0 - 8.1)

জ্যাক হল Android 6.0 - 8.1 এর জন্য ডিফল্ট Android বিল্ড টুলচেন

জ্যাক হল একটি অ্যান্ড্রয়েড টুলচেন যা জাভা সোর্সকে অ্যান্ড্রয়েড ডেক্স বাইটকোডে কম্পাইল করেছে। জ্যাক ব্যবহার করার জন্য আপনাকে আলাদাভাবে কিছু করতে হবে না - গাছ বা আপনার প্রকল্পটি কম্পাইল করতে আপনার স্ট্যান্ডার্ড মেকফাইল কমান্ডগুলি ব্যবহার করুন। Android 8.1 হল সর্বশেষ রিলিজ যা জ্যাক ব্যবহার করে।

জ্যাক সম্পর্কে

জ্যাক চিত্র 1 এ দেখানো হিসাবে কাজ করে।

জ্যাক ওভারভিউ।

চিত্র 1. জ্যাক ওভারভিউ।

জ্যাক লাইব্রেরি বিন্যাস

জ্যাকের নিজস্ব .jack ফাইল ফরম্যাট রয়েছে যাতে লাইব্রেরির জন্য প্রাক-সংকলিত ডেক্স কোড রয়েছে, যা দ্রুত সংকলনের (প্রি-ডেক্স) অনুমতি দেয়।

জ্যাক লাইব্রেরি ফাইল বিষয়বস্তু.

চিত্র 2. জ্যাক লাইব্রেরি ফাইল বিষয়বস্তু।

জিল

নিচের চিত্রে দেখানো হয়েছে, জিল টুল বিদ্যমান .jar লাইব্রেরিগুলোকে নতুন লাইব্রেরি ফরম্যাটে অনুবাদ করে।

একটি বিদ্যমান `জার` লাইব্রেরি আমদানি করতে কর্মপ্রবাহ।

চিত্র 3. একটি বিদ্যমান .jar লাইব্রেরি আমদানি করতে কর্মপ্রবাহ।

জ্যাক সংকলন সার্ভার

প্রথমবার জ্যাক ব্যবহার করা হলে, এটি আপনার কম্পিউটারে একটি স্থানীয় জ্যাক সংকলন সার্ভার চালু করে। এই সার্ভার:

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

জ্যাক সার্ভার কোনো সংকলন ছাড়াই একটি নিষ্ক্রিয় সময়ের পরে নিজেকে বন্ধ করে দেয়। এটি লোকালহোস্ট ইন্টারফেসে দুটি টিসিপি পোর্ট ব্যবহার করে এবং বাহ্যিকভাবে উপলব্ধ নয়। সমস্ত পরামিতি (সমান্তরাল সংকলনের সংখ্যা, টাইমআউট, পোর্ট নম্বর ইত্যাদি) $HOME/.jack ফাইলটি সম্পাদনা করে পরিবর্তন করা যেতে পারে।

$HOME/.jack ফাইল

$HOME/.jack ফাইলে সম্পূর্ণ ব্যাশ সিনট্যাক্সে জ্যাক সার্ভার ভেরিয়েবলের জন্য নিম্নলিখিত সেটিংস রয়েছে:

  • SERVER=true জ্যাকের সার্ভার বৈশিষ্ট্য সক্রিয় করে।
  • SERVER_PORT_SERVICE=8072 সংকলনের উদ্দেশ্যে সার্ভারের TCP পোর্ট নম্বর সেট করে।
  • SERVER_PORT_ADMIN=8073 অ্যাডমিন উদ্দেশ্যে সার্ভারের TCP পোর্ট নম্বর সেট করে।
  • SERVER_COUNT=1 অব্যবহৃত।
  • SERVER_NB_COMPILE=4 অনুমোদিত সমান্তরাল সংকলনের সর্বাধিক সংখ্যা সেট করে। SERVER_TIMEOUT=60 নিষ্ক্রিয় সেকেন্ডের সংখ্যা সেট করে যে সার্ভারটি নিজেকে বন্ধ করার আগে কোনো সংকলন ছাড়াই অপেক্ষা করতে হবে। SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} ফাইল সেট করে যেখানে সার্ভার লগ লেখা হয়। ডিফল্টরূপে, এই ভেরিয়েবলটি একটি এনভায়রনমেন্ট ভেরিয়েবল দ্বারা ওভারলোড হতে পারে।
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} হোস্টে একটি JVM চালু করতে ব্যবহৃত ডিফল্ট কমান্ড সেট করে। ডিফল্টরূপে, এই ভেরিয়েবলটি এনভায়রনমেন্ট ভেরিয়েবল দ্বারা ওভারলোড হতে পারে।

জ্যাক সংকলনের সমস্যা সমাধান করুন

সমস্যা অ্যাকশন
আপনার কম্পিউটার সংকলনের সময় প্রতিক্রিয়াহীন হয়ে যায় বা আপনি মেমরির ত্রুটির বাইরে জ্যাক সংকলন ব্যর্থ হওয়ার অভিজ্ঞতা পান $HOME/.jack সম্পাদনা করে এবং SERVER_NB_COMPILE কম মান পরিবর্তন করে যুগপত জ্যাক সংকলনের সংখ্যা হ্রাস করুন।
ব্যাকগ্রাউন্ড সার্ভার চালু করতে পারে না এ সংকলন ব্যর্থ হচ্ছে৷ সবচেয়ে সম্ভাব্য কারণ হল টিসিপি পোর্টগুলি ইতিমধ্যে আপনার কম্পিউটারে ব্যবহার করা হয়েছে। $HOME/.jack ( SERVER_PORT_SERVICE এবং SERVER_PORT_ADMIN ভেরিয়েবল) সম্পাদনা করে পোর্ট পরিবর্তন করুন। পরিস্থিতি আনব্লক করতে, $HOME/.jack সম্পাদনা করে এবং SERVER false পরিবর্তন করে জ্যাক কম্পাইলেশন সার্ভার নিষ্ক্রিয় করুন। দুর্ভাগ্যবশত এটি উল্লেখযোগ্যভাবে আপনার সংকলনকে ধীর করে দেয় এবং আপনাকে লোড নিয়ন্ত্রণের সাথে make -j চালু করতে বাধ্য করতে পারে ( make এর বিকল্প -l )।
সংকলন কোনো অগ্রগতি ছাড়াই আটকে যায় পরিস্থিতি আনব্লক করতে, jack-admin kill-server ব্যবহার করে জ্যাক ব্যাকগ্রাউন্ড সার্ভারটি হত্যা করুন ) তারপর আপনার অস্থায়ী ডিরেক্টরি ( /tmp বা $TMPDIR ) এর jack-$USER এ থাকা অস্থায়ী ডিরেক্টরিগুলি সরিয়ে দিন।

জ্যাক লগ খুঁজুন

আপনি যদি ডিস্ট টার্গেট সহ একটি make কমান্ড চালান, জ্যাক লগ $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log এ অবস্থিত। অন্যথায়, আপনি jack-admin server-log চালিয়ে লগ খুঁজে পেতে পারেন। পুনরুত্পাদনযোগ্য জ্যাক ব্যর্থতার ক্ষেত্রে, আপনি নিম্নলিখিত পরিবর্তনশীল সেট করে আরও বিস্তারিত লগ পেতে পারেন:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

ট্রি (বা আপনার প্রজেক্ট) কম্পাইল করতে স্ট্যান্ডার্ড মেকফাইল কমান্ড ব্যবহার করুন এবং স্ট্যান্ডার্ড আউটপুট এবং ত্রুটি সংযুক্ত করুন। বিশদ বিল্ড লগগুলি সরাতে, চালান:

unset ANDROID_JACK_EXTRA_ARGS

জ্যাক সীমাবদ্ধতা

ডিফল্টরূপে, জ্যাক সার্ভার একটি কম্পিউটারে শুধুমাত্র একজন ব্যবহারকারী ব্যবহার করতে পারেন। অতিরিক্ত ব্যবহারকারীদের সমর্থন করতে, প্রতিটি ব্যবহারকারীর জন্য বিভিন্ন পোর্ট নম্বর নির্বাচন করুন এবং সেই অনুযায়ী SERVER_NB_COMPILE সামঞ্জস্য করুন। আপনি $HOME/.jackSERVER=false সেট করে জ্যাক সার্ভার নিষ্ক্রিয় করতে পারেন। বর্তমান vm-tests-tf ইন্টিগ্রেশনের কারণে CTS সংকলন ধীর। বাইটকোড ম্যানিপুলেশন টুল (যেমন JaCoCo) সমর্থিত নয়।

জ্যাক ব্যবহার করুন

জ্যাক জাভা প্রোগ্রামিং ভাষা 1.7 সমর্থন করে এবং নীচে বর্ণিত অতিরিক্ত বৈশিষ্ট্যগুলিকে সংহত করে৷

প্রি-ডেক্স

একটি জ্যাক লাইব্রেরি ফাইল তৈরি করার সময়, লাইব্রেরির .dex তৈরি করা হয় এবং .jack লাইব্রেরি ফাইলের মধ্যে একটি প্রি-ডেক্স হিসাবে সংরক্ষণ করা হয়। কম্পাইল করার সময়, জ্যাক প্রতিটি লাইব্রেরি থেকে প্রি-ডেক্স পুনরায় ব্যবহার করে। সমস্ত লাইব্রেরি প্রি-ডেক্সড।

প্রি-ডেক্স সহ জ্যাক লাইব্রেরি।

চিত্র 4. প্রি-ডেক্স সহ জ্যাক লাইব্রেরি।

সংকলনে সংকোচন, অস্পষ্টতা বা রিপ্যাকেজিং ব্যবহার করা হলে জ্যাক লাইব্রেরি প্রি-ডেক্স পুনরায় ব্যবহার করে না।

ক্রমবর্ধমান সংকলন

ক্রমবর্ধমান সংকলনের অর্থ হল শেষ সংকলন (এবং তাদের নির্ভরতা) থেকে শুধুমাত্র স্পর্শ করা উপাদানগুলি পুনরায় সংকলন করা হয়েছে। ক্রমবর্ধমান সংকলন একটি সম্পূর্ণ সংকলনের তুলনায় উল্লেখযোগ্যভাবে দ্রুত হতে পারে যখন পরিবর্তনগুলি উপাদানগুলির একটি সেটের মধ্যে সীমাবদ্ধ থাকে।

ক্রমবর্ধমান সংকলন ডিফল্টরূপে অক্ষম করা হয় (এবং সঙ্কুচিত, অস্পষ্টতা, রিপ্যাকেজিং বা মাল্টি-ডেক্স উত্তরাধিকার সক্ষম হলে স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় হয়ে যায়)। ক্রমবর্ধমান বিল্ডগুলি সক্ষম করতে, আপনি যে প্রকল্পটি ক্রমবর্ধমানভাবে তৈরি করতে চান তার Android.mk ফাইলে নিম্নলিখিত লাইনটি যুক্ত করুন:

LOCAL_JACK_ENABLED := incremental

সঙ্কুচিত এবং অস্পষ্টতা

জ্যাক সঙ্কুচিত এবং অস্পষ্টতা সক্ষম করতে ProGuard কনফিগারেশন ফাইল ব্যবহার করে।

সাধারণ বিকল্পগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (শুধুমাত্র 1 আউটপুট জার সমর্থিত)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

সঙ্কুচিত বিকল্পগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • -dontshrink

অস্পষ্টকরণ বিকল্পগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

উপেক্ষা করা বিকল্পগুলির মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • -dontoptimize (জ্যাক অপ্টিমাইজ করে না)
  • -dontpreverify (জ্যাক আগে থেকে যাচাই করে না)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

রিপ্যাকেজিং

জ্যাক পুনরায় প্যাকেজিং করার জন্য জারজার কনফিগারেশন ফাইল ব্যবহার করে। যদিও জ্যাক "নিয়ম" নিয়ম প্রকারের সাথে সামঞ্জস্যপূর্ণ, এটি "জ্যাপ" বা "কিপ" নিয়ম প্রকারের সাথে সামঞ্জস্যপূর্ণ নয়।

মাল্টিডেক্স সমর্থন

জ্যাক অন্তর্নির্মিত এবং উত্তরাধিকার মাল্টিডেক্স সমর্থন অফার করে। যেহেতু dex ফাইলগুলি 65K পদ্ধতিতে সীমাবদ্ধ, তাই 65K এর বেশি পদ্ধতির অ্যাপগুলিকে একাধিক dex ফাইলে বিভক্ত করতে হবে। আরও বিশদ বিবরণের জন্য, 64K এর বেশি পদ্ধতি সহ অ্যাপ্লিকেশনগুলির জন্য মাল্টিডেক্স সক্ষম করুন দেখুন৷