ART TI

Android 8.0 ও তার পরবর্তী যেকোনও ভার্সনে, ART টুলিং ইন্টারফেস (ART TI) নির্দিষ্ট রানটাইম ইন্টার্নালকে এক্সপোজ করে এবং প্রোফাইলার ও ডিবাগারকে অ্যাপের রানটাইম বিহেভিয়ারকে প্রভাবিত করার জন্য চালু করে। অন্যান্য প্ল্যাটফর্মে নেটিভ এজেন্ট ইমপ্লিমেন্ট করার জন্য প্রদান করা সর্বাধুনিক পারফর্ম্যান্স টুল ইমপ্লিমেন্ট করতে এটি ব্যবহার করা যেতে পারে।

রানটাইম ইন্টার্নালগুলি সেইসব এজেন্টদের কাছে এক্সপোজ করা হয় যেগুলি রানটাইম প্রসেসে লোড করা হয়েছে। এগুলি সরাসরি কল ও কলব্যাকের মাধ্যমে ART-এর সাথে যোগাযোগ করে। রানটাইম একাধিক এজেন্টকে সাপোর্ট করে যাতে বিভিন্ন অর্থোগোনাল-প্রোফাইলিং সংক্রান্ত সমস্যা আলাদা করা যায়। রানটাইম শুরু হওয়ার সময় (যখন dalvikvm বা app_process চালু করা হয়) এজেন্ট সাপ্লাই করা হতে পারে অথবা আগে থেকেই চলছে এমন প্রসেসের সাথে অ্যাটাচ করা হতে পারে।

অ্যাপ ও রানটাইম আচরণকে ইন্সট্রুমেন্ট ও পরিবর্তন করার ক্ষমতা অত্যন্ত শক্তিশালী হওয়ার কারণে, ART TI-তে দুটি নিরাপত্তা ব্যবস্থা ইন্টিগ্রেট করা হয়েছে:

  • প্রথমত, এজেন্ট ইন্টারফেস, JVMTI-কে এক্সপোজ করা কোডটি রানটাইম প্লাগ-ইন হিসেবে প্রয়োগ করা হয়, রানটাইমের মূল কম্পোনেন্ট হিসেবে নয়। প্লাগ-ইন লোডিং সীমাবদ্ধ করা হতে পারে, যাতে এজেন্টরা কোনও ইন্টারফেস পয়েন্ট খুঁজে পেতে না পারে।
  • দ্বিতীয়ত, ActivityManager ক্লাস ও রানটাইম প্রসেস, দু'টিই শুধুমাত্র এজেন্টদেরকে ডিবাগ করা যায় এমন অ্যাপের সাথে অ্যাটাচ করার অনুমতি দেয়। ডিবাগ করা যায় এমন অ্যাপের ডেভেলপাররা সেগুলি বিশ্লেষণ ও ইন্সট্রুমেন্ট করার জন্য সাইন-অফ করে দিয়েছেন এবং সেগুলি সাধারণ ব্যবহারকারীদের মধ্যে ডিস্ট্রিবিউট করা হয় না। Google Play Store, ডিবাগ করা যায় এমন অ্যাপের ডিস্ট্রিবিউশন করার অনুমতি দেয় না। এটি নিশ্চিত করে যে সাধারণ অ্যাপ (কোর কম্পোনেন্ট সহ) ইন্সট্রুমেন্ট বা ম্যানিপুলেট করা যাবে না।

ডিজাইন

ইনস্ট্রুমেন্টেড অ্যাপের সাধারণ ফ্লো ও ইন্টারকানেকশন ছবি ১-এ দেখানো হয়েছে।

ইনস্ট্রুমেন্টেড অ্যাপে ফ্লো ও ইন্টারকানেকশন
ছবি ১. ইনস্ট্রুমেন্টেড অ্যাপের ফ্লো ও ইন্টারকানেকশন

ART প্লাগ-ইন libopenjdkjvmti ART TI-কে এক্সপোজ করে, যা প্ল্যাটফর্মের প্রয়োজন ও সীমাবদ্ধতা পূরণের জন্য ডিজাইন করা হয়েছে:

  • ক্লাসের পুনঃসংজ্ঞা Dex ফাইলের উপর ভিত্তি করে তৈরি, যেখানে ক্লাস ফাইলের পরিবর্তে শুধুমাত্র একটি ক্লাসের সংজ্ঞা রয়েছে।
  • ইনস্ট্রুমেন্টেশন ও রিডেফিনেশনের জন্য জাভা-ল্যাঙ্গুয়েজ API প্রকাশ করা হয় না।

এছাড়াও, ART TI Android Studio প্রোফাইলারের সাথে কাজ করে।

এজেন্ট লোড বা অ্যাটাচ করা

রানটাইম স্টার্টআপে কোনও এজেন্ট অ্যাটাচ করতে, JVMTI প্লাগ-ইন এবং প্রদত্ত এজেন্ট, উভয়কেই লোড করার জন্য এই কমান্ড ব্যবহার করুন:

dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …

রানটাইম স্টার্ট-আপে কোনও এজেন্ট লোড করা হলে, সেখানে কোনও নিরাপত্তা ব্যবস্থা থাকে না, তাই মনে রাখবেন যে ম্যানুয়ালি শুরু করা রানটাইম সম্পূর্ণ পরিবর্তনের অনুমতি দেয়, তবে কোনও নিরাপত্তা ব্যবস্থা থাকে না। (এটি ART টেস্টিংয়ের অনুমতি দেয়।)

মনে রাখবেন: এটি ডিভাইসে সাধারণ অ্যাপের (সিস্টেম সার্ভার সহ) ক্ষেত্রে প্রযোজ্য নয়। আগে থেকেই চলছে এমন জাইগোট থেকে অ্যাপ ফর্ক করা হয়, এবং জাইগোট প্রসেসকে এজেন্ট লোড করার অনুমতি দেওয়া হয় না।

আগে থেকেই চলছে এমন কোনও অ্যাপের সাথে এজেন্ট অ্যাটাচ করতে, এই কমান্ড ব্যবহার করুন:

adb shell cmd activity attach-agent [process]
/path/to/agent/libagent.so[=agent-options]

JVMTI প্লাগ-ইন এখনও লোড না হয়ে থাকলে, কোনও এজেন্ট অ্যাটাচ করলে প্লাগ-ইন ও এজেন্ট লাইব্রেরি, দুটিই লোড হয়।

কোনও এজেন্টকে শুধুমাত্র এমন রানিং অ্যাপের সাথে অ্যাটাচ করা যেতে পারে যা ডিবাগ করা যায় (অ্যাপের ম্যানিফেস্টের অংশ, অ্যাট্রিবিউট android:debuggable অ্যাপ নোডে true হিসেবে সেট করা আছে) হিসেবে চিহ্নিত করা হয়েছে। কোনও এজেন্টকে অ্যাটাচ করার অনুমতি দেওয়ার আগে ActivityManager ক্লাস ও ART, দু'টিই চেক করে। ActivityManager ক্লাস, ডিবাগ করা যায় কিনা তা চেক করার জন্য বর্তমান অ্যাপের তথ্য (PackageManager ক্লাসের ডেটা থেকে পাওয়া) চেক করে এবং রানটাইম এর বর্তমান স্ট্যাটাস চেক করে, যা অ্যাপ চালু করার সময় সেট করা হয়েছিল।

এজেন্টের লোকেশন

রানটাইমকে বর্তমান প্রসেসে এজেন্ট লোড করতে হবে, যাতে এজেন্ট সরাসরি সেটির সাথে বাইন্ড করতে ও যোগাযোগ করতে পারে। এজেন্ট যে নির্দিষ্ট লোকেশন থেকে আসছে, সেই ব্যাপারে ART নিষ্পক্ষ। dlopen কলের জন্য স্ট্রিং ব্যবহার করা হয়। ফাইল সিস্টেমের অনুমতি ও SELinux নীতি প্রকৃত লোডিং সীমাবদ্ধ করে।

ডিবাগ করা যায় এমন অ্যাপের মাধ্যমে রান করা যায় এমন এজেন্ট ডেলিভার করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  • অ্যাপের APK-এর লাইব্রেরি ডিরেক্টরিতে এজেন্টকে এম্বেড করুন।
  • অ্যাপের ডেটা ডিরেক্টরিতে এজেন্ট কপি করতে run-as ব্যবহার করুন।

এপিআই

android.os.Debug-এ নিম্নলিখিত পদ্ধতি যোগ করা হয়েছে।

/**
     * Attach a library as a jvmti agent to the current runtime, with the given classloader
     * determining the library search path.
     * Note: agents may only be attached to debuggable apps. Otherwise, this function will
     * throw a SecurityException.
     *
     * @param library the library containing the agent.
     * @param options the options passed to the agent.
     * @param classLoader the classloader determining the library search path.
     *
     * @throws IOException if the agent could not be attached.
     * @throws a SecurityException if the app is not debuggable.
     */
    public static void attachJvmtiAgent(@NonNull String library, @Nullable String options,
            @Nullable ClassLoader classLoader) throws IOException {

অন্যান্য Android API

attach-agent কমান্ডটি সর্বজনীনভাবে দৃশ্যমান। এই কমান্ডটি একটি রানিং প্রসেসে JVMTI এজেন্ট অ্যাটাচ করে:

adb shell 'am attach-agent com.example.android.displayingbitmaps
\'/data/data/com.example.android.displayingbitmaps/code_cache/libfieldnulls.so=Ljava/lang/Class;.name:Ljava/lang/String;\''

am start -P ও am start-profiler/stop-profiler কমান্ড অ্যাটাচ-এজেন্ট কমান্ডের মতো।

JVMTI

এই ফিচার এজেন্টদের (নেটিভ কোড) কাছে JVMTI API প্রকাশ করে। গুরুত্বপূর্ণ ক্ষমতাগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • ক্লাস নতুন করে ডিফাইন করা।
  • অবজেক্ট অ্যালোকেশন ও গার্বেজ কালেকশন ট্র্যাক করা।
  • অবজেক্টের রেফারেন্স ট্রি অনুসরণ করে, হিপের সব অবজেক্টের উপর পুনরাবৃত্তি করা হচ্ছে।
  • Java কল স্ট্যাক পরীক্ষা করা হচ্ছে।
  • সব থ্রেড সাসপেন্ড (এবং আবার চালু) করা হচ্ছে।

Android-এর বিভিন্ন ভার্সনে বিভিন্ন ধরনের সুবিধা উপলভ্য থাকতে পারে।

মানানসই

এই ফিচারের জন্য কোর রানটাইম সহায়তা প্রয়োজন যা শুধুমাত্র Android 8.0 ও তার পরবর্তী যেকোনও ভার্সনে উপলভ্য। এই ফিচার প্রয়োগ করার জন্য ডিভাইস প্রস্তুতকারকদের কোনও পরিবর্তন করতে হবে না। এটি AOSP-এর অংশ।

যাচাইকরণ

Android 8 ও তার পরবর্তী যেকোনও ভার্সনে CTS নিম্নলিখিত বিষয়গুলি পরীক্ষা করে:

  • এজেন্ট ডিবাগ করা যায় এমন অ্যাপে অ্যাটাচ করে এবং ডিবাগ করা যায় না এমন অ্যাপে অ্যাটাচ করতে পারে না, এমন টেস্ট।
  • ইমপ্লিমেন্ট করা সব JVMTI API পরীক্ষা করে
  • এজেন্টের জন্য বাইনারি ইন্টারফেস স্থিতিশীল কিনা তা পরীক্ষা করে

Android 9 ও তার পরের যেকোনও ভার্সনে অতিরিক্ত পরীক্ষা যোগ করা হয়েছে এবং সেগুলি সেইসব রিলিজের জন্য CTS পরীক্ষায় অন্তর্ভুক্ত করা হয়েছে।