এআরটি টিআই

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

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

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

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

ডিজাইন

একটি যন্ত্রযুক্ত অ্যাপের সাধারণ প্রবাহ এবং আন্তঃসংযোগ চিত্র 1 এ দেখানো হয়েছে।

Flow and interconnection in an instrumented app
চিত্র 1. একটি যন্ত্রযুক্ত অ্যাপের প্রবাহ এবং আন্তঃসংযোগ

ART প্লাগইন libopenjdkjvmti ART TI প্রকাশ করে, যা প্ল্যাটফর্মের চাহিদা এবং সীমাবদ্ধতাগুলিকে মিটমাট করার জন্য ডিজাইন করা হয়েছে:

  • ক্লাস রিডেফিনেশন Dex ফাইলের উপর ভিত্তি করে তৈরি করা হয়, যেখানে ক্লাস ফাইলের পরিবর্তে শুধুমাত্র একটি ক্লাস ডেফিনেশন থাকে।
  • ইন্সট্রুমেন্টেশন এবং রিডেফিনেশনের জন্য জাভা-ভাষা APIs প্রকাশ করা হয় না।

এআরটি টিআই অ্যান্ড্রয়েড স্টুডিও প্রোফাইলারকে সমর্থন করে।

লোড বা একটি এজেন্ট সংযুক্ত করুন

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

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

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

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

ইতিমধ্যেই চলমান একটি অ্যাপে একটি এজেন্ট সংযুক্ত করতে, এই কমান্ডটি ব্যবহার করুন:

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

যদি JVMTI প্লাগইন এখনও লোড করা না হয়, তাহলে একটি এজেন্ট সংযুক্ত করলে প্লাগইন এবং এজেন্ট লাইব্রেরি উভয়ই লোড হয়।

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

এজেন্ট অবস্থান

রানটাইমকে বর্তমান প্রক্রিয়ায় এজেন্ট লোড করতে হবে, যাতে এজেন্ট সরাসরি আবদ্ধ হতে পারে এবং এর সাথে যোগাযোগ করতে পারে। এজেন্ট যে নির্দিষ্ট স্থান থেকে আসে সে সম্পর্কে এআরটি নিজেই অজ্ঞেয়বাদী। স্ট্রিংটি একটি 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 APIs

সংযুক্ত-এজেন্ট কমান্ড সর্বজনীনভাবে দৃশ্যমান। এই কমান্ডটি একটি চলমান প্রক্রিয়ার সাথে একটি 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 API-কে এজেন্টদের (নেটিভ কোড) প্রকাশ করে। গুরুত্বপূর্ণ ক্ষমতা অন্তর্ভুক্ত:

  • একটি ক্লাস পুনরায় সংজ্ঞায়িত করা.
  • ট্র্যাকিং বস্তু বরাদ্দ এবং আবর্জনা সংগ্রহ.
  • বস্তুর রেফারেন্স ট্রি অনুসরণ করে একটি স্তূপে সমস্ত বস্তুর উপর পুনরাবৃত্তি করা।
  • জাভা কল স্ট্যাক পরিদর্শন করা হচ্ছে।
  • সমস্ত থ্রেড স্থগিত করা হচ্ছে (এবং পুনরায় শুরু করা হচ্ছে)।

Android এর বিভিন্ন সংস্করণে বিভিন্ন ক্ষমতা উপলব্ধ হতে পারে।

সামঞ্জস্য

এই বৈশিষ্ট্যটির মূল রানটাইম সমর্থন প্রয়োজন যা শুধুমাত্র Android 8.0 এবং উচ্চতর সংস্করণে উপলব্ধ। এই বৈশিষ্ট্যটি বাস্তবায়নের জন্য ডিভাইস নির্মাতাদের কোনো পরিবর্তন করতে হবে না। এটি AOSP এর অংশ।

বৈধতা

CTS অ্যান্ড্রয়েড 8 এবং উচ্চতর তে নিম্নলিখিত পরীক্ষা করে:

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

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