قرد

توفّر الأداة القديمة monkeyrunner واجهة برمجة تطبيقات لكتابة برامج تتحكّم في جهاز Android أو محاكي Android من خارج رمز Android.

تم تصميم أداة monkeyrunner في المقام الأول لاختبار التطبيقات والأجهزة على مستوى الوظائف/إطار العمل ولتشغيل مجموعات اختبارات الوحدات، ولكن يمكنك استخدامها لأغراض أخرى. باستخدام monkeyrunner، يمكنك كتابة برنامج Python يثبّت تطبيق Android أو حزمة اختبار، ويشغّله، ويرسل إليه ضغطات المفاتيح، ويلتقط لقطات شاشة لواجهة المستخدم، ويخزّنها على محطة العمل.

تنبيه: لم يعُد يتم صيانة واجهة برمجة التطبيقات monkeyrunner. ننصحك باستخدام إطار عمل الاختبار UI Automator بدلاً من ذلك.

لا ترتبط أداة monkeyrunner بأداة UI/Application Exerciser Monkey، المعروفة أيضًا باسم أداة monkey. يتم تشغيل أداة monkey في adb shell مباشرةً على الجهاز أو المحاكي، وتنشئ الأداة تدفقات شبه عشوائية من أحداث المستخدم والنظام. في المقابل، يتحكّم أداة monkeyrunner في الأجهزة والمحاكيات من محطة عمل عن طريق إرسال أوامر وأحداث معيّنة من واجهة برمجة تطبيقات.

توفّر أداة monkeyrunner الميزات التالية لاختبار Android:

  • التحكّم في أجهزة متعددة: يمكن لواجهة برمجة التطبيقات monkeyrunner تطبيق مجموعة اختبار واحدة أو أكثر على أجهزة أو محاكيات متعددة. يمكنك ربط جميع الأجهزة فعليًا أو بدء تشغيل جميع المحاكيات (أو كليهما) في وقت واحد، والاتصال بكل جهاز على حدة برمجيًا، ثم تنفيذ اختبار واحد أو أكثر. يمكنك أيضًا بدء برنامج إعداد المحاكي آليًا، وتشغيل اختبار واحد أو أكثر، ثم إيقاف المحاكي.
  • الاختبار الوظيفي: يمكن أن تنفِّذ monkeyrunner اختبارًا آليًا من البداية إلى النهاية لتطبيق Android. يمكنك تقديم قيم الإدخال باستخدام ضغطات المفاتيح أو أحداث اللمس وعرض النتائج كلقطات شاشة.
  • اختبار الانحدار: يمكن monkeyrunner اختبار ثبات التطبيق من خلال تشغيل تطبيق ومقارنة لقطات الشاشة الناتجة بمجموعة من لقطات الشاشة المعروف أنّها صحيحة.
  • التشغيل الآلي القابل للتوسيع: بما أنّ monkeyrunner عبارة عن مجموعة أدوات لواجهة برمجة التطبيقات، يمكنك تطوير نظام من الوحدات والبرامج المستندة إلى Python للتحكّم في أجهزة Android. بالإضافة إلى استخدام واجهة برمجة التطبيقات monkeyrunner نفسها، يمكنك استخدام وحدتَي Python النمطيتَين os وsubprocess لاستدعاء أدوات Android، مثل Android Debug Bridge.

    يمكنك أيضًا إضافة صفوفك إلى واجهة برمجة التطبيقات monkeyrunner. يمكنك الاطّلاع على المزيد من التفاصيل في قسم توسيع نطاق monkeyrunner باستخدام المكوّنات الإضافية.

تستخدم أداة monkeyrunner Jython، وهي تطبيق للغة Python يستخدم لغة برمجة Java. تتيح Jython لواجهة برمجة التطبيقات monkeyrunner التفاعل بسهولة مع إطار عمل Android. باستخدام Jython، يمكنك استخدام بنية Python للوصول إلى الثوابت والفئات والطرق الخاصة بواجهة برمجة التطبيقات.

برنامج بسيط باستخدام monkeyrunner

في ما يلي برنامج monkeyrunner بسيط يتصل بجهاز، ما يؤدي إلى إنشاء عنصر MonkeyDevice. باستخدام العنصر MonkeyDevice، يثبّت البرنامج حزمة تطبيق Android، ويشغّل أحد أنشطته، ويرسل أحداثًا رئيسية إلى النشاط. بعد ذلك، يأخذ البرنامج لقطة شاشة للنتيجة، ما يؤدي إلى إنشاء كائن MonkeyImage. من هذا العنصر، يكتب البرنامج ملف PNG يحتوي على لقطة الشاشة.

# Imports the monkeyrunner modules used by this program.
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object.
device = MonkeyRunner.waitForConnection()

# Installs the Android package. Notice that this method returns a boolean, so you can test
# whether the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')

# Sets a variable with the package's internal name.
package = 'com.example.android.myapplication'

# Sets a variable with the name of an Activity in the package.
activity = 'com.example.android.myapplication.MainActivity'

# Sets the name of the component to start.
runComponent = package + '/' + activity

# Runs the component.
device.startActivity(component=runComponent)

# Presses the Menu button.
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)

# Takes a screenshot.
result = device.takeSnapshot()

# Writes the screenshot to a file.
result.writeToFile('myproject/shot1.png','png')

واجهة برمجة التطبيقات monkeyrunner

تتضمّن حزمة com.android.monkeyrunner واجهة برمجة التطبيقات monkeyrunner في ثلاث وحدات:

  • MonkeyRunner: فئة من طرق الأدوات المساعدة لبرامج monkeyrunner يوفّر هذا الصف طريقة لربط monkeyrunner بجهاز أو محاكي. ويوفّر أيضًا طرقًا لإنشاء واجهات مستخدم لبرنامج monkeyrunner وعرض المساعدة المضمّنة.
  • MonkeyDevice: يمثّل هذا النوع جهازًا أو محاكيًا. يوفّر هذا الصف طرقًا لتثبيت الحِزم وإلغاء تثبيتها، وبدء نشاط، وإرسال أحداث لوحة المفاتيح أو اللمس إلى تطبيق. ويمكنك أيضًا استخدام هذا الصف لتشغيل حِزم الاختبار.
  • MonkeyImage: تمثّل صورة لقطة شاشة. يوفر هذا الصف طرقًا لالتقاط لقطات شاشة، وتحويل صور نقطية إلى تنسيقات مختلفة، ومقارنة كائنَين من النوع MonkeyImage، وكتابة صورة في ملف.

في برنامج Python، يمكنك الوصول إلى كل فئة كوحدة Python. monkeyrunner لا تستورد الأداة هذه الوحدات تلقائيًا. لاستيراد وحدة، استخدِم عبارة from في Python:

from com.android.monkeyrunner import <module>

حيث <module> هو اسم الفئة التي تريد استيرادها. يمكنك استيراد أكثر من وحدة واحدة في عبارة from نفسها من خلال الفصل بين أسماء الوحدات بفواصل.

تشغيل monkeyrunner

يمكنك تشغيل برامج monkeyrunner إما من ملف أو عن طريق إدخال عبارات monkeyrunner في جلسة تفاعلية. يمكنك تنفيذ كلتا العمليتين عن طريق استدعاء الأمر monkeyrunner، الموجود في الدليل الفرعي tools/ ضمن دليل حزمة تطوير البرامج (SDK). إذا قدّمت اسم ملف كمعلَمة، سيشغّل الأمر monkeyrunner محتويات الملف كبرنامج Python، وإلا سيبدأ جلسة تفاعلية.

في ما يلي بنية الأمر monkeyrunner:

monkeyrunner -plugin <plugin_jar> <program_filename> <program_options>

يوضّح الجدول 1 العلامات والوسيطات monkeyrunner.

الجدول 1. monkeyrunner العلامات والوسيطات

الوسيطة الوصف
-plugin <plugin_jar> (اختياري) تحدّد هذه السمة ملف JAR يحتوي على مكوّن إضافي لـ monkeyrunner. لمزيد من المعلومات حول مكوّنات monkeyrunner الإضافية، راجِع القسم توسيع نطاق monkeyrunner باستخدام المكوّنات الإضافية. لتحديد أكثر من ملف واحد، أدرِج الوسيط عدة مرات.
<program_filename> في حال تقديم هذه الوسيطة، ينفّذ الأمر monkeyrunner محتوى الملف كبرنامج Python. بخلاف ذلك، يبدأ الأمر جلسة تفاعلية.
<program_options> (اختياري) العلامات والوسيطات للبرنامج في <program_file>.

مساعدة monkeyrunner المضمَّنة

يمكنك إنشاء مرجع لواجهة برمجة التطبيقات monkeyrunner من خلال تنفيذ ما يلي:

monkeyrunner help.py <format> <outfile>

الوسيطات هي:

  • تكون قيمة <format> إما text لإخراج نص عادي أو html لإخراج HTML.
  • <outfile> هو اسم مؤهَّل حسب المسار لملف الإخراج.

توسيع نطاق monkeyrunner باستخدام المكوّنات الإضافية

يمكنك توسيع نطاق واجهة برمجة التطبيقات monkeyrunner باستخدام الفئات التي تكتبها بلغة Java وتضمينها في ملف واحد أو أكثر من ملفات JAR. يمكنك استخدام هذه الميزة لتوسيع نطاق واجهة برمجة التطبيقات monkeyrunner باستخدام الفئات الخاصة بك أو لتوسيع نطاق الفئات الحالية. يمكنك أيضًا استخدام هذه الميزة لتهيئة بيئة monkeyrunner.

لتوفير إضافة إلى monkeyrunner، استخدِم الأمر monkeyrunner مع الوسيطة -plugin <plugin_jar> الموضّحة في الجدول 1.

في رمز الإضافة، يمكنك استيراد وتوسيع نطاق فئات monkeyrunner الرئيسية MonkeyDevice وMonkeyImage وMonkeyRunner في com.android.monkeyrunner (راجِع القسم حول واجهة برمجة التطبيقات monkeyrunner).

يُرجى العِلم أنّ المكوّنات الإضافية لا تمنحك إذن الوصول إلى حزمة تطوير البرامج لنظام التشغيل Android. لا يمكنك استيراد حِزم، مثل com.android.app. ويرجع ذلك إلى أنّ monkeyrunner يتفاعل مع الجهاز أو المحاكي على مستوى أقل من مستوى واجهات برمجة التطبيقات الخاصة بإطار العمل.

فئة بدء تشغيل المكوّن الإضافي

يمكن أن يحدّد ملف JAR الخاص بإحدى الإضافات فئة يتم إنشاء مثيل لها قبل بدء معالجة البرنامج النصي. لتحديد هذه الفئة، أضِف المفتاح MonkeyRunnerStartupRunner إلى بيان ملف JAR. بالنسبة إلى القيمة، استخدِم اسم الفئة التي سيتم تشغيلها عند بدء التشغيل. يوضّح المقتطف التالي كيفية إجراء ذلك ضمن نص برمجي لإنشاء ant:

<jar jarfile="myplugin" basedir="${build.dir}">
<manifest>
<attribute name="MonkeyRunnerStartupRunner" value="com.myapp.myplugin"/>
</manifest>
</jar>

للوصول إلى بيئة وقت التشغيل الخاصة بالأداة monkeyrunner، يمكن لفئة بدء التشغيل تنفيذ com.google.common.base.Predicate<PythonInterpreter>. على سبيل المثال، يضبط هذا الصف بعض المتغيرات في مساحة الاسم التلقائية:

Kotlin

package com.android.example

import com.google.common.base.Predicate
import org.python.util.PythonInterpreter

class Main: Predicate<PythonInterpreter> {

    override fun apply(anInterpreter: PythonInterpreter): Boolean {
        /*
         * Examples of creating and initializing variables in the monkeyrunner environment's
         * namespace. During execution, the monkeyrunner program can refer to the variables
         * "newtest" and "use_emulator"
         *
         */
        anInterpreter.set("newtest", "enabled")
        anInterpreter.set("use_emulator", 1)
        return true
    }
}

Java

package com.android.example;

import com.google.common.base.Predicate;
import org.python.util.PythonInterpreter;

public class Main implements Predicate<PythonInterpreter> {
    @Override
    public boolean apply(PythonInterpreter anInterpreter) {

        /*
        * Examples of creating and initializing variables in the monkeyrunner environment's
        * namespace. During execution, the monkeyrunner program can refer to the variables "newtest"
        * and "use_emulator"
        *
        */
        anInterpreter.set("newtest", "enabled");
        anInterpreter.set("use_emulator", 1);

        return true;
    }
}