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

জ্যাক হলো অ্যান্ড্রয়েড ৬.০ থেকে ৮.১ পর্যন্ত ডিফল্ট অ্যান্ড্রয়েড বিল্ড টুলচেইন।

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

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

জ্যাক চিত্র ১-এ দেখানো পদ্ধতি অনুযায়ী কাজ করে।

জ্যাকের সংক্ষিপ্ত বিবরণ।

চিত্র ১. জ্যাকের সংক্ষিপ্ত বিবরণ।

জ্যাক লাইব্রেরি ফরম্যাট

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

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

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

জিল

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

বিদ্যমান `jar` লাইব্রেরি ইম্পোর্ট করার কার্যপ্রণালী।

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

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

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

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

জ্যাক সার্ভারটি কোনো কম্পাইলেশন ছাড়া একটি নির্দিষ্ট সময় নিষ্ক্রিয় থাকার পর নিজে থেকেই বন্ধ হয়ে যায়। এটি লোকালহোস্ট ইন্টারফেসে দুটি TCP পোর্ট ব্যবহার করে এবং বাইরে থেকে এটি ব্যবহারযোগ্য নয়। $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 মান কমিয়ে দিন, এর মাধ্যমে একই সাথে চলমান জ্যাক কম্পাইলেশনের সংখ্যা হ্রাস করুন।
ব্যাকগ্রাউন্ড সার্ভার চালু করা যাচ্ছে না বলে কম্পাইলেশন ব্যর্থ হচ্ছে। এর সবচেয়ে সম্ভাব্য কারণ হলো আপনার কম্পিউটারে TCP পোর্টগুলো ইতিমধ্যেই ব্যবহৃত হচ্ছে। $HOME/.jack ফাইলটি এডিট করে ( SERVER_PORT_SERVICE এবং SERVER_PORT_ADMIN ভেরিয়েবলগুলোর মাধ্যমে) পোর্ট পরিবর্তন করুন। এই সমস্যার সমাধান করতে, $HOME/.jack ফাইলটি এডিট করে SERVER false এ পরিবর্তন করে Jack কম্পাইলেশন সার্ভারটি নিষ্ক্রিয় করুন। দুর্ভাগ্যবশত, এটি আপনার কম্পাইলেশনের গতি উল্লেখযোগ্যভাবে কমিয়ে দেবে এবং আপনাকে লোড কন্ট্রোল সহ make -j ( make এর -l অপশন) চালু করতে বাধ্য করতে পারে।
সংকলন কোনো অগ্রগতি ছাড়াই আটকে যায়। এই সমস্যার সমাধান করতে, jack-admin kill-server ব্যবহার করে জ্যাক ব্যাকগ্রাউন্ড সার্ভারটি বন্ধ করুন, তারপর আপনার টেম্পোরারি ডিরেক্টরি ( /tmp বা $TMPDIR )-এর jack-$USER ফোল্ডারে থাকা টেম্পোরারি ডিরেক্টরিগুলো মুছে ফেলুন।

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

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

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

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

unset ANDROID_JACK_EXTRA_ARGS

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

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

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

জ্যাক জাভা প্রোগ্রামিং ভাষা ১.৭ সমর্থন করে এবং নিচে বর্ণিত অতিরিক্ত বৈশিষ্ট্যগুলো সমন্বিত করে।

প্রি-ডেক্স

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

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

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

কম্পাইলেশনে সঙ্কুচিতকরণ, অবফাসকেশন বা পুনঃপ্যাকেজিং ব্যবহার করা হলে জ্যাক লাইব্রেরি প্রি-ডেক্স পুনরায় ব্যবহার করে না।

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

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

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

LOCAL_JACK_ENABLED := incremental

সংকোচন এবং অস্পষ্টতা

জ্যাক সঙ্কুচিতকরণ এবং দুর্বোধ্যকরণ সক্ষম করতে প্রোগার্ড কনফিগারেশন ফাইল ব্যবহার করে।

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

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (শুধুমাত্র ১টি আউটপুট জার সমর্থিত)
  • -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

পুনঃপ্যাকেজিং

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

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

জ্যাক বিল্ট-ইন এবং লিগ্যাসি মাল্টিডেক্স সাপোর্ট প্রদান করে। যেহেতু ডেক্স ফাইলগুলো ৬৫ হাজার মেথডের মধ্যে সীমাবদ্ধ, তাই ৬৫ হাজারের বেশি মেথডযুক্ত অ্যাপগুলোকে একাধিক ডেক্স ফাইলে ভাগ করতে হবে। আরও বিস্তারিত জানতে, “৬৪ হাজারের বেশি মেথডযুক্ত অ্যাপের জন্য মাল্টিডেক্স সক্ষম করুন” দেখুন।