Android यूज़र इंटरफ़ेस (यूआई) की ज़्यादातर जांचों के उलट, मैक्रोबेंचमार्क की जांच अलग प्रोसेस में की जाती है से हटा दिया जाता है. को रोकने जैसी चीज़ों को सक्षम करने के लिए यह आवश्यक है ऐप्लिकेशन प्रोसेस करने के साथ-साथ, DEX बाइटकोड से मशीन कोड में कंपाइल करना भी शामिल है.
UIAutomator लाइब्रेरी या अन्य
ऐसे सिस्टम जो टेस्ट से, टारगेट किए गए ऐप्लिकेशन को कंट्रोल कर सकते हैं.
Espresso या ActivityScenario
का इस्तेमाल इसके लिए नहीं किया जा सकता
मैक्रोबेंचमार्क, क्योंकि उन्हें ऐप्लिकेशन के साथ शेयर की गई प्रोसेस में चलने की उम्मीद है.
नीचे दिए गए उदाहरण में, RecyclerView
को उसके रिसॉर्स आईडी और
नीचे कई बार स्क्रोल करता है:
Kotlin
@Test fun scrollList() { benchmarkRule.measureRepeated( // ... setupBlock = { // Before starting to measure, navigate to the UI to be measured val intent = Intent("$packageName.RECYCLER_VIEW_ACTIVITY") startActivityAndWait(intent) } ) { val recycler = device.findObject(By.res(packageName, "recycler")) // Set gesture margin to avoid triggering gesture navigation // with input events from automation. recycler.setGestureMargin(device.displayWidth / 5) // Scroll down several times repeat(3) { recycler.fling(Direction.DOWN) } } }
Java
@Test public void scrollList() { benchmarkRule.measureRepeated( // ... /* setupBlock */ scope -> { // Before measuring, navigate to the UI to be measured. val intent = Intent("$packageName.RECYCLER_VIEW_ACTIVITY") scope.startActivityAndWait(); return Unit.INSTANCE; }, /* measureBlock */ scope -> { UiDevice device = scope.getDevice(); UiObject2 recycler = device.findObject(By.res(scope.getPackageName(), "recycler")); // Set gesture margin to avoid triggering gesture navigation // with input events from automation. recycler.setGestureMargin(device.getDisplayWidth() / 5); // Fling the recycler several times. for (int i = 0; i < 3; i++) { recycler.fling(Direction.DOWN); } return Unit.INSTANCE; } ); }
आपके बेंचमार्क को यूज़र इंटरफ़ेस (यूआई) को स्क्रोल करने की ज़रूरत नहीं है. इसके बजाय, यह उदाहरण के लिए, ऐनिमेशन. इसके लिए यूआई ऑटोमेशन का इस्तेमाल करने की भी ज़रूरत नहीं है खास तौर पर. यह तब तक परफ़ॉर्मेंस मेट्रिक इकट्ठा करता रहता है, जब तक फ़्रेम इसमें व्यू सिस्टम से बनाए गए फ़्रेम शामिल होते हैं. इनमें Jetpack Compose से तैयार किए गए फ़्रेम शामिल होते हैं.
ऐप्लिकेशन के अंदरूनी हिस्सों पर जाना
कभी-कभी, आप अपने ऐप्लिकेशन के उन हिस्सों को बेंचमार्क करना चाहते हैं जो सीधे तौर पर नहीं होते
का ऐक्सेस बाहर से मिलेगा. उदाहरण के लिए, इनर ऐक्टिविटी को ऐक्सेस करना
जिन पर exported=false
का निशान लगा हो, Fragment
पर जा रहे हों या स्वाइप कर रहे हों
अपने यूज़र इंटरफ़ेस का कुछ हिस्सा दूर रखा जा सकता है. मानदंड को मैन्युअल रूप से इन पर जाना होता है
उपयोगकर्ताओं जैसे ऐप्लिकेशन के अलग-अलग हिस्सों को चालू करता है.
मैन्युअल रूप से नेविगेट करने के लिए, setupBlock{}
में कोड को बदलें, ताकि
आपकी पसंद का इफ़ेक्ट, जैसे कि बटन पर टैप या स्वाइप करें. आपके measureBlock{}
में ये चीज़ें शामिल हैं
सिर्फ़ वह यूज़र इंटरफ़ेस (यूआई) बदलाव जिसे आपको असल में बेंचमार्क करना है:
Kotlin
@Test fun nonExportedActivityScrollList() { benchmarkRule.measureRepeated( // ... setupBlock = setupBenchmark() ) { // ... } } private fun setupBenchmark(): MacrobenchmarkScope.() -> Unit = { // Before starting to measure, navigate to the UI to be measured startActivityAndWait() // click a button to launch the target activity. // While we use button text here to find the button, you could also use // accessibility info or resourceId. val selector = By.text("RecyclerView") if (!device.wait(Until.hasObject(selector), 5_500)) { fail("Could not find resource in time") } val launchRecyclerActivity = device.findObject(selector) launchRecyclerActivity.click() // wait until the activity is shown device.wait( Until.hasObject(By.clazz("$packageName.NonExportedRecyclerActivity")), TimeUnit.SECONDS.toMillis(10) ) }
Java
@Test public void scrollList() { benchmarkRule.measureRepeated( // ... /* setupBlock */ scope -> { // Before measuring, navigate to the default activity. scope.startActivityAndWait(); // Click a button to launch the target activity. // While you use resourceId here to find the button, you can also // use accessibility info or button text content. UiObject2 launchRecyclerActivity = scope.getDevice().findObject( By.res(packageName, "launchRecyclerActivity") ) launchRecyclerActivity.click(); // Wait until activity is shown. scope.getDevice().wait( Until.hasObject(By.clazz("$packageName.NonExportedRecyclerActivity")), 10000L ) return Unit.INSTANCE; }, /* measureBlock */ scope -> { // ... } ); }
आपके लिए सुझाव
- ध्यान दें: JavaScript बंद होने पर लिंक टेक्स्ट दिखता है
- मैक्रोबेंचमार्क लिखना
- मैक्रोबेंचमार्क मेट्रिक कैप्चर करना
- माइक्रोबेंचमार्क