ใน Android 8.0 ขึ้นไป ART Tooling Interface (ART TI) จะแสดง ภายในรันไทม์บางรายการ และทำให้เครื่องมือสร้างโปรไฟล์และดีบักเกอร์มีผลต่อ พฤติกรรมรันไทม์ของแอป ข้อมูลเหล่านี้สามารถใช้เพื่อติดตั้งใช้งาน เครื่องมือประสิทธิภาพที่ทันสมัยมีให้สำหรับการติดตั้งใช้งาน ผ่านตัวแทนเนทีฟบนแพลตฟอร์มอื่น
Agent ที่โหลดในกระบวนการรันไทม์จะเห็นข้อมูลภายในรันไทม์
รายการเหล่านี้สื่อสารกับ ART ผ่านการโทรโดยตรงและการติดต่อกลับ รันไทม์
รองรับ Agent หลายตัว เพื่อให้ข้อกังวลเกี่ยวกับการสร้างโปรไฟล์ที่ต่างกัน
จะถูกแยกจากกัน อาจระบุ Agent เมื่อรันไทม์เริ่มต้น (เมื่อ
เรียกใช้ dalvikvm
หรือ app_process
) หรือแนบกับ
กระบวนการที่ทำงานอยู่แล้ว
เนื่องจากความสามารถในการวัดคุมและแก้ไขลักษณะการทำงานของแอปและรันไทม์นั้น ที่มีประสิทธิภาพมาก มีการผสานรวมมาตรการความปลอดภัย 2 แบบไว้ใน ART TI:
- ประการแรก โค้ดที่แสดงอินเทอร์เฟซของ Agent JVMTI ถูกนำมาใช้เป็น ปลั๊กอินรันไทม์ ไม่ใช่องค์ประกอบหลักของรันไทม์ อาจโหลดปลั๊กอิน จำกัด เพื่อให้ตัวแทนสามารถบล็อกไม่ให้ค้นหาอินเทอร์เฟซใดๆ ได้ คะแนน
- ประการที่ 2 ทั้งคลาส
ActivityManager
และกระบวนการรันไทม์อนุญาตให้เฉพาะ Agent ทำสิ่งต่อไปนี้ได้ แนบไปกับแอปที่แก้ไขข้อบกพร่องได้ ลงชื่อแอปที่แก้ไขข้อบกพร่องได้แล้ว โดยนักพัฒนาซอฟต์แวร์จะได้รับการวิเคราะห์และทำเครื่องมือ และจะไม่เผยแพร่ให้กับ ผู้ใช้ปลายทาง Google Play Store ไม่อนุญาตให้เผยแพร่โปรแกรมแก้ไขข้อบกพร่อง แอป วิธีนี้ช่วยให้มั่นใจได้ว่าแอปทั่วไป (รวมถึงคอมโพเนนต์หลัก) จะไม่สามารถ ใช้หรือดัดแปลง
การออกแบบ
ขั้นตอนทั่วไปและการเชื่อมต่อถึงกันในแอปที่มีการวัดจะแสดงใน รูปที่ 1
ปลั๊กอิน ART libopenjdkjvmti
แสดง ART TI ซึ่ง
ออกแบบมาเพื่อรองรับความต้องการและข้อจำกัดของแพลตฟอร์ม ดังนี้
- การกำหนดชั้นเรียนใหม่จะอิงตามไฟล์
Dex
ซึ่งมีเฉพาะ การกำหนดคลาสเดี่ยวๆ แทนการใช้ไฟล์คลาส - API ภาษา Java สำหรับการใช้เครื่องมือและการกำหนดนิยามใหม่ เปิดเผย
นอกจากนี้ ART TI ยังรองรับเครื่องมือสร้างโปรไฟล์ของ Android Studio ด้วย
โหลดหรือแนบ Agent
หากต้องการแนบ Agent เมื่อเริ่มต้นรันไทม์ ให้ใช้คำสั่งนี้เพื่อโหลดทั้ง ปลั๊กอิน JVMTI และ Agent ที่ระบุ:
dalvikvm -Xplugin:libopenjdkjvmti.so -agentpath:/path/to/agent/libagent.so …
ไม่มีมาตรการด้านความปลอดภัยเมื่อโหลด Agent ขณะรันไทม์ ดังนั้นโปรดทราบว่ารันไทม์ที่เริ่มต้นด้วยตนเองจะช่วยให้ การปรับเปลี่ยนโดยไม่มีมาตรการด้านความปลอดภัย (วิธีนี้ทำให้ทดสอบ ART ได้)
หมายเหตุ: ใช้ไม่ได้กับแอปทั่วไป (รวมถึงระบบ เซิร์ฟเวอร์) ในอุปกรณ์ แอปถูกแยกมาจากไซโกตที่ทำงานอยู่แล้ว และกระบวนการไซโกตไม่ได้รับอนุญาตให้โหลด Agent
หากต้องการแนบ Agent กับแอปที่ทำงานอยู่แล้ว ให้ใช้ คำสั่ง:
adb shell cmd activity attach-agent [process] /path/to/agent/libagent.so[=agent-options]
หากยังไม่ได้โหลดปลั๊กอิน JVMTI การแนบ Agent จะโหลดทั้งคู่ ปลั๊กอินและไลบรารีของ Agent
แนบ Agent ได้เฉพาะกับแอปที่ทำงานอยู่ซึ่งทำเครื่องหมายเป็น
debuggable (ส่วนหนึ่งของไฟล์ Manifest ของแอปที่มีแอตทริบิวต์
ตั้งค่า android:debuggable
เป็น true
ในแอป
โหนด) ทั้งคลาส ActivityManager
และ ART มีประสิทธิภาพ
ตรวจสอบก่อนที่จะอนุญาตให้แนบ Agent ActivityManager
จะตรวจสอบข้อมูลแอปปัจจุบัน (มาจาก PackageManager
คลาส) สำหรับสถานะที่แก้ไขข้อบกพร่องได้ และรันไทม์จะตรวจสอบสถานะปัจจุบัน
ที่ตั้งค่าไว้ตอนที่แอปเริ่มทำงาน
สถานที่ตั้งของตัวแทน
รันไทม์ต้องโหลด Agent ลงในกระบวนการปัจจุบันเพื่อให้ Agent ดังกล่าว
สามารถเชื่อมโยงและสื่อสารกับเซิร์ฟเวอร์ได้โดยตรง ตัว ART เองก็ไม่เชื่อสายตาตัวเอง
เกี่ยวกับสถานที่ตั้งที่ตัวแทนมา มีการใช้สตริง
สำหรับการโทร dlopen
สิทธิ์ของระบบไฟล์และนโยบาย SELinux
จำกัดการโหลดจริง
ในการนำส่ง Agent ที่เรียกใช้โดยแอปที่แก้ไขข้อบกพร่องได้ ให้ทำดังนี้
- ฝัง Agent ในไดเรกทอรีไลบรารีของ APK ของแอป
- ใช้
run-as
เพื่อคัดลอก Agent ไปยังข้อมูลของแอป ไดเรกทอรี
API
เพิ่มเมธอดต่อไปนี้ไปยัง 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 {
API อื่นๆ ของ Android
คำสั่ง Attach-agent จะปรากฏแบบสาธารณะ คำสั่งนี้แนบ JVMTI Agent ไปยังกระบวนการที่ทำงานอยู่:
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
คล้ายกับคำสั่งAttach-agent
เจวีเอ็มทีไอ
ฟีเจอร์นี้จะแสดง JVMTI API แก่ตัวแทน (โค้ดของระบบ) องค์ประกอบสำคัญ ความสามารถมีดังนี้
- การกำหนดชั้นเรียนใหม่
- การติดตามการจัดสรรออบเจ็กต์และการรวบรวมขยะ
- ทำซ้ำบนวัตถุทั้งหมดในฮีป ตามแผนผังอ้างอิงของ ออบเจ็กต์
- กำลังตรวจสอบการเรียกใช้สแต็ก Java
- กำลังระงับ (และทำให้ชุดข้อความทั้งหมดกลับมาทำงานอีกครั้ง)
เวอร์ชันต่างๆ อาจมีความสามารถแตกต่างกัน Android
ความเข้ากันได้
ฟีเจอร์นี้ต้องมีการรองรับรันไทม์หลักซึ่งมีเฉพาะใน Android 8.0 เท่านั้น และสูงกว่า ผู้ผลิตอุปกรณ์ไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ เพื่อติดตั้งใช้งาน ฟีเจอร์นี้ เป็นส่วนหนึ่งของ AOSP
การตรวจสอบความถูกต้อง
CTS จะทดสอบสิ่งต่อไปนี้ใน Android 8 ขึ้นไป
- การทดสอบที่ Agent แนบกับแอปที่แก้ไขข้อบกพร่องได้และไม่ได้แนบกับ แอปที่แก้ไขข้อบกพร่องไม่ได้
- การทดสอบ JVMTI API ทั้งหมด
- ทดสอบว่าอินเทอร์เฟซแบบไบนารีสำหรับ Agent นั้นเสถียร
เราเพิ่มการทดสอบอื่นๆ ใน Android 9 ขึ้นไป รวมถึง ในการทดสอบ CTS สำหรับรุ่นเหล่านั้น