एकाधिक उपयोगकर्ताओं का परीक्षण

यह पृष्ठ एंड्रॉइड प्लेटफ़ॉर्म पर एकाधिक उपयोगकर्ताओं के परीक्षण के महत्वपूर्ण पहलुओं का वर्णन करता है। बहु-उपयोगकर्ता समर्थन लागू करने के बारे में जानकारी के लिए, एकाधिक उपयोगकर्ताओं का समर्थन करना देखें।

डिवाइस पथ

निम्न तालिका कई डिवाइस पथों को सूचीबद्ध करती है और उनका समाधान कैसे किया जाता है। पाथ कॉलम में सभी मान उपयोगकर्ता-विशिष्ट सैंडबॉक्स्ड स्टोरेज हैं। समय के साथ एंड्रॉइड की स्टोरेज कहानी बदल गई है; अधिक जानकारी के लिए संग्रहण दस्तावेज़ पढ़ें.

पथ सिस्टम पथ (वैकल्पिक) उद्देश्य
/data/user/{userId}/{app.path} /data/data ऐप स्टोरेज
/storage/emulated/{userId} /sdcard साझा आंतरिक भंडारण
/data/media/{userId} कोई नहीं उपयोगकर्ता मीडिया डेटा (उदाहरण के लिए, संगीत, वीडियो)
/data/system/users/{userId} कोई नहीं प्रति उपयोगकर्ता सिस्टम कॉन्फ़िगरेशन/स्थिति

केवल सिस्टम ऐप्स द्वारा पहुंच योग्य

यहां उपयोगकर्ता-विशिष्ट पथ का उपयोग करने का एक उदाहरण दिया गया है:

# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/

उपयोगकर्ताओं के बीच एडीबी इंटरैक्शन

एकाधिक उपयोगकर्ताओं के साथ व्यवहार करते समय कई adb कमांड उपयोगी होते हैं। इनमें से कुछ कमांड केवल एंड्रॉइड 9 और उच्चतर में समर्थित हैं:

  • adb shell am instrument --user <userId> एक विशिष्ट उपयोगकर्ता के खिलाफ एक इंस्ट्रुमेंटेशन परीक्षण चलाता है। डिफ़ॉल्ट रूप से यह वर्तमान उपयोगकर्ता का उपयोग करता है।
  • adb install --user <userId> एक विशिष्ट उपयोगकर्ता के लिए एक पैकेज स्थापित करता है। यह गारंटी देने के लिए कि सभी उपयोगकर्ताओं के लिए एक पैकेज स्थापित है, आपको इसे प्रत्येक उपयोगकर्ता के लिए कॉल करना होगा।
  • adb uninstall --user <userId> किसी विशिष्ट उपयोगकर्ता के लिए पैकेज को अनइंस्टॉल करता है। सभी उपयोगकर्ताओं के लिए अनइंस्टॉल करने के लिए --user फ़्लैग के बिना कॉल करें।
  • adb shell am get-current-user वर्तमान (अग्रभूमि) उपयोगकर्ता आईडी मिलती है।
  • adb shell pm list users सभी मौजूदा उपयोगकर्ताओं की एक सूची मिलती है।
  • adb shell pm create-user आईडी लौटाकर एक नया उपयोगकर्ता बनाता है।
  • adb shell pm remove-user आईडी के आधार पर एक विशिष्ट उपयोगकर्ता को हटा देता है।
  • adb shell pm disable --user <userId> किसी विशिष्ट उपयोगकर्ता के लिए पैकेज को अक्षम करता है।
  • adb shell pm enable --user <userId> एक विशिष्ट उपयोगकर्ता के लिए एक पैकेज सक्षम करता है।
  • adb shell pm list packages --user <userId> किसी विशिष्ट उपयोगकर्ता के लिए पैकेज सूचीबद्ध करता है (सक्षम के लिए -e , अक्षम के लिए -d )। डिफ़ॉल्ट रूप से यह हमेशा सिस्टम उपयोगकर्ता के लिए सूचीबद्ध होता है।

निम्नलिखित जानकारी यह समझाने में मदद करती है कि adb एकाधिक उपयोगकर्ताओं के साथ कैसे व्यवहार करता है:

  • adb (या अधिक सटीक रूप से adbd डेमॉन) हमेशा सिस्टम उपयोगकर्ता (उपयोगकर्ता आईडी = 0) के रूप में चलता है , भले ही कौन सा उपयोगकर्ता वर्तमान हो । इसलिए डिवाइस पथ जो उपयोगकर्ता पर निर्भर हैं (जैसे /sdcard/ ) हमेशा सिस्टम उपयोगकर्ता के रूप में हल होते हैं। अधिक विवरण के लिए डिवाइस पथ देखें।

  • यदि कोई डिफ़ॉल्ट उपयोगकर्ता निर्दिष्ट नहीं है, तो प्रत्येक adb उपकमांड का एक अलग उपयोगकर्ता होता है। सबसे अच्छा अभ्यास उपयोगकर्ता आईडी को am get-current-user के साथ पुनर्प्राप्त करना है और फिर इसका समर्थन करने वाले किसी भी कमांड के लिए स्पष्ट रूप से --user <userId> उपयोग करना है। एंड्रॉइड 9 तक सभी कमांड के लिए स्पष्ट उपयोगकर्ता फ़्लैग समर्थित नहीं थे।

  • एंड्रॉइड 9 में द्वितीयक उपयोगकर्ताओं के /sdcard पथों तक पहुंच शुरू करने से इनकार कर दिया गया है। परीक्षण के दौरान फ़ाइलों को पुनर्प्राप्त करने के तरीके के विवरण के लिए बहु-उपयोगकर्ता डेटा के लिए सामग्री प्रदाता देखें।

बहु-उपयोगकर्ता डेटा के लिए सामग्री प्रदाता

क्योंकि adb सिस्टम उपयोगकर्ता के रूप में चलता है और डेटा एंड्रॉइड 9 और उच्चतर में सैंडबॉक्स किया गया है, आपको किसी गैर-सिस्टम उपयोगकर्ता से किसी भी परीक्षण डेटा को पुश या खींचने के लिए सामग्री प्रदाताओं का उपयोग करना होगा। यह आवश्यक नहीं है यदि:

  • adbd रूट के रूप में चल रहा है ( adb root के माध्यम से), जो केवल userdebug या usereng बिल्ड का उपयोग करके संभव है।

  • आप फ़ाइलों को पुश/खींचने के लिए ट्रेड फेडरेशन (ट्रेडफेड) के ITestDevice उपयोग कर रहे हैं, ऐसी स्थिति में अपने परीक्षण कॉन्फ़िगरेशन में /sdcard/ पथ का उपयोग करें (उदाहरण के लिए, NativeDevice.java में pushFile के लिए स्रोत कोड देखें)।

जब कोई सामग्री प्रदाता द्वितीयक उपयोगकर्ता में चल रहा हो, तो आप उपयुक्त user , uri और निर्दिष्ट अन्य मापदंडों के साथ adb shell content कमांड का उपयोग करके इसे एक्सेस कर सकते हैं।

ऐप डेवलपर्स के लिए समाधान

push या pull कमांड के बजाय adb content और ContentProvider के उदाहरण का उपयोग करके परीक्षण फ़ाइलों के साथ इंटरैक्ट करें।

  1. ऐप द्वारा होस्ट किए गए ContentProvider का एक उदाहरण बनाएं जो जरूरत पड़ने पर फाइलों को परोस/स्टोर कर सके। ऐप के आंतरिक संग्रहण का उपयोग करें.
  2. फ़ाइलों को पुश/खींचने के लिए adb shell content read या write कमांड का उपयोग करें।

मीडिया फ़ाइलों के लिए समाधान

मीडिया फ़ाइलों को एसडी कार्ड के मीडिया विभाजन में पुश करने के लिए, MediaStore सार्वजनिक एपीआई का उपयोग करें। उदाहरण के लिए:

# push MVIMG_20190129_142956.jpg to /storage/emulated/10/Pictures
# step 1
$ adb shell content insert --user 10 --uri content://media/external/images/media/ --bind _display_name:s:foo.jpg

# step 2
$ adb shell content query --user 10 --projection _id --uri content://media/external/images/media/ --where "_display_name=\'foo.jpg\'"

# step 3
$ adb shell content write --user 10 --uri content://media/external/images/media/8022 < MVIMG_20190129_142956.jpg

एक सामान्य सामग्री प्रदाता स्थापित करना

मौजूदा सामग्री प्रदाता को स्थापित करें और उसका उपयोग करें जो उपयोगकर्ता-विशिष्ट /sdcard पथ पर फ़ाइलों को पढ़ता और लिखता है।

TradefedContentProvider.apk का उपयोग करके स्रोत से make TradefedContentProvider बनाएं।

```
# install content provider apk
$ adb install --user 10 -g TradefedContentProvider.apk

# pull some_file.txt
$ adb shell content read --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt > local_file.txt

# push local_file.txt
$ adb shell content write --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt < local_file.txt
```

ट्रेड फेडरेशन बहु-उपयोगकर्ता समर्थन

ट्रेडफेड आधिकारिक एंड्रॉइड टेस्ट हार्नेस है। यह अनुभाग बहु-उपयोगकर्ता परीक्षण परिदृश्यों के लिए ट्रेडफेड के कुछ अंतर्निहित समर्थन का सारांश प्रस्तुत करता है।

स्थिति जांचने वाले

सिस्टम स्टेटस चेकर्स (एसएससी) लक्ष्य तैयार करने वालों से पहले चलाए जाते हैं, और उनका क्लीनअप उन तैयार करने वालों के बाद चलाया जाता है।

एकाधिक उपयोगकर्ताओं का परीक्षण करते समय डेवलपर्स की सहायता के लिए UserChecker स्पष्ट रूप से परिभाषित किया गया है। यह ट्रैक करता है कि क्या किसी परीक्षण ने डिवाइस पर उपयोगकर्ताओं की स्थिति को बदल दिया है (उदाहरण के लिए, उपयोगकर्ताओं को टियरडाउन में हटाए बिना बनाया गया है)। इसके अलावा, यदि user-cleanup सेट है, तो यह स्वचालित रूप से परीक्षण के बाद सफाई करने का प्रयास करता है, जबकि अभी भी सहायक त्रुटियां प्रदान करता है ताकि परीक्षण को ठीक किया जा सके।

<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
    <option name="user-cleanup" value="true" />
</system_checker>

लक्ष्य तैयार करने वाला

लक्ष्य तैयार करने वालों का उपयोग आम तौर पर एक विशेष कॉन्फ़िगरेशन के साथ एक उपकरण स्थापित करने के लिए किया जाता है। बहु-उपयोगकर्ता परीक्षण के मामले में प्रिपेयरर्स का उपयोग एक विशिष्ट प्रकार के उपयोगकर्ताओं को बनाने के साथ-साथ अन्य उपयोगकर्ताओं पर स्विच करने के लिए किया जा सकता है।

उन डिवाइस प्रकारों के लिए जिनमें द्वितीयक उपयोगकर्ता नहीं है, आप AndroidTest.xml में द्वितीयक उपयोगकर्ता बनाने और स्विच करने के लिए CreateUserPreparer उपयोग कर सकते हैं। परीक्षण के अंत में, तैयारीकर्ता वापस स्विच करता है और द्वितीयक उपयोगकर्ता को हटा देता है।

<target_preparer
  class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>

यदि आप जो उपयोगकर्ता प्रकार चाहते हैं वह डिवाइस पर पहले से मौजूद है, तो मौजूदा उपयोगकर्ता पर स्विच करने के लिए SwitchUserTargetPreparer का उपयोग करें। user-type के लिए सामान्य मानों में system या secondary शामिल हैं।

<target_preparer
  class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
    <option name="user-type" value="secondary" />
</target_preparer>

होस्ट-संचालित परीक्षण

कुछ उदाहरणों में, परीक्षण के लिए उपयोगकर्ताओं को परीक्षण के भीतर स्विच करने की आवश्यकता होती है। यूआई ऑटोमेटर जैसे डिवाइस-साइड परीक्षण ढांचे के भीतर से स्विच न करें, क्योंकि परीक्षण प्रक्रिया किसी भी समय समाप्त हो सकती है। इसके बजाय, ट्रेडफेड के होस्ट- ड्रिवेन टेस्ट फ्रेमवर्क जैसे होस्ट-साइड टेस्ट फ्रेमवर्क का उपयोग करें, जो ITestDevice तक पहुंच प्रदान करता है, जिससे किसी भी उपयोगकर्ता हेरफेर की आवश्यकता होती है।

होस्ट-संचालित परीक्षणों के लिए UserChecker ( स्टेटस चेकर्स में वर्णित) का उपयोग करें जो उपयोगकर्ता स्थिति को बदलता है क्योंकि यह सुनिश्चित करता है कि परीक्षण अपने आप ठीक से साफ हो जाए।