एक से ज़्यादा उपयोगकर्ताओं को टेस्ट करना

इस पेज पर, Android प्लैटफ़ॉर्म पर एक से ज़्यादा उपयोगकर्ताओं की टेस्टिंग के अहम पहलुओं के बारे में बताया गया है. एक डिवाइस पर कई लोगों के काम करने की सुविधा लागू करने के बारे में जानने के लिए, एक डिवाइस पर कई लोगों के काम करने की सुविधा देखें.

डिवाइस पाथ

यहां दी गई टेबल में, डिवाइस के कई पाथ और उन्हें हल करने का तरीका बताया गया है. पाथ कॉलम में मौजूद सभी वैल्यू, उपयोगकर्ता के हिसाब से सैंडबॉक्स किया गया स्टोरेज होता है. Android के स्टोरेज की सुविधा में समय के साथ बदलाव हुए हैं. ज़्यादा जानकारी के लिए, स्टोरेज से जुड़ा दस्तावेज़ पढ़ें.

पाथ सिस्टम पाथ (ज़रूरी नहीं) मकसद
/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 इंटरैक्शन

एक से ज़्यादा उपयोगकर्ताओं के साथ काम करते समय, कई adb निर्देश काम के होते हैं. इनमें से कुछ निर्देश, सिर्फ़ Android 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> का इस्तेमाल उन सभी निर्देशों के लिए करें जिनमें यह काम करता है. Android 9 तक, साफ़ तौर पर बताए गए उपयोगकर्ता फ़्लैग, सभी निर्देशों के लिए काम नहीं करते थे.

  • Android 9 से, दूसरे उपयोगकर्ताओं के /sdcard पाथ का ऐक्सेस नहीं दिया जाएगा. जांच के दौरान फ़ाइलें वापस पाने का तरीका जानने के लिए, एक से ज़्यादा उपयोगकर्ताओं के डेटा के लिए कॉन्टेंट उपलब्ध कराने वाली कंपनी देखें.

एक से ज़्यादा उपयोगकर्ताओं के डेटा के लिए कॉन्टेंट देने वाली कंपनी

adb, सिस्टम उपयोगकर्ता के तौर पर काम करता है और Android 9 और उसके बाद के वर्शन में डेटा को सैंडबॉक्स किया जाता है. इसलिए, किसी ऐसे उपयोगकर्ता से टेस्ट डेटा पुश या पुल करने के लिए, आपको कॉन्टेंट प्रोवाइडर का इस्तेमाल करना होगा जो सिस्टम उपयोगकर्ता नहीं है. ऐसा करना ज़रूरी नहीं है, अगर:

  • adbd, adb root के ज़रिए रूट के तौर पर चल रहा है. ऐसा सिर्फ़ userdebug या usereng बिल्ड का इस्तेमाल करके किया जा सकता है.

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

जब कोई कॉन्टेंट प्रोवाइडर सेकंडरी उपयोगकर्ता के तौर पर काम कर रहा हो, तो उसे ऐक्सेस करने के लिए, adb shell content कमांड के साथ सही user, uri, और अन्य पैरामीटर का इस्तेमाल करें.

ऐप्लिकेशन डेवलपर के लिए समस्या हल करने का तरीका

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 पाथ में फ़ाइलों को पढ़ती और लिखती है.

make TradefedContentProvider का इस्तेमाल करके, सोर्स से TradefedContentProvider.apk बनाएं:

```
# 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
```

Trade Federation में एक से ज़्यादा लोगों के साथ काम करने की सुविधा

Tradefed, Android का आधिकारिक टेस्ट हार्नेस है. इस सेक्शन में, एक से ज़्यादा उपयोगकर्ताओं के टेस्ट के लिए, Tradefed में पहले से मौजूद कुछ सहायता के बारे में बताया गया है.

स्टेटस की जांच करने वाले

टारगेट तैयार करने वाले टूल से पहले, सिस्टम स्टेटस की जांच करने वाले टूल (एसएससी) चलाए जाते हैं. साथ ही, इन टूल के बाद, क्लीनअप प्रोसेस शुरू की जाती है.

UserChecker को खास तौर पर, एक से ज़्यादा उपयोगकर्ताओं की जांच करते समय डेवलपर की मदद करने के लिए बनाया गया है. यह ट्रैक करता है कि किसी टेस्ट से डिवाइस पर उपयोगकर्ताओं की स्थिति में बदलाव हुआ है या नहीं. उदाहरण के लिए, teardown में उपयोगकर्ताओं को हटाए बिना उन्हें बनाना. इसके अलावा, अगर user-cleanup सेट है, तो जांच के बाद यह अपने-आप क्लीन अप करने की कोशिश करता है. साथ ही, जांच को ठीक करने के लिए, काम की गड़बड़ियां भी दिखाता है.

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

टारगेट तैयार करने वाला

टारगेट तैयार करने वाले टूल का इस्तेमाल, आम तौर पर किसी खास कॉन्फ़िगरेशन वाले डिवाइस को सेट अप करने के लिए किया जाता है. एक से ज़्यादा उपयोगकर्ताओं के साथ टेस्ट करने के लिए, प्रिपरर का इस्तेमाल करके किसी खास तरह के उपयोगकर्ता बनाए जा सकते हैं. साथ ही, दूसरे उपयोगकर्ताओं पर स्विच भी किया जा सकता है.

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

<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>

होस्ट से चलाए जाने वाले टेस्ट

कुछ मामलों में, टेस्ट के दौरान उपयोगकर्ताओं को स्विच करना पड़ता है. यूआई ऑटोमेट जैसे डिवाइस-साइड टेस्ट फ़्रेमवर्क से, डिवाइस-साइड टेस्ट फ़्रेमवर्क पर स्विच न करें, क्योंकि टेस्ट प्रोसेस कभी भी बंद की जा सकती है. इसके बजाय, होस्ट-साइड टेस्ट फ़्रेमवर्क का इस्तेमाल करें. जैसे, Tradefed का होस्ट-ड्रिवन टेस्ट फ़्रेमवर्क. इससे ITestDevice को ऐक्सेस किया जा सकता है. साथ ही, ज़रूरत के हिसाब से उपयोगकर्ता को मैनिप्युलेट किया जा सकता है.

होस्ट-ड्रिवन टेस्ट के लिए UserChecker का इस्तेमाल करें. इससे उपयोगकर्ता की स्थिति बदलती है. ऐसा इसलिए, क्योंकि इससे यह पक्का होता है कि टेस्ट के बाद, डेटा को सही तरीके से मिटा दिया गया है. UserChecker के बारे में स्टेटस की जांच करने वाले टूल में बताया गया है.