इस पेज पर, 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/पाथ का इस्तेमाल करें. उदाहरण के लिए,pushFileके लिए सोर्स कोड देखें जोNativeDevice.javaमें है.
जब कोई कॉन्टेंट देने वाला ऐप्लिकेशन, दूसरे उपयोगकर्ता के लिए काम कर रहा होता है, तब उसे adb shell content कमांड का इस्तेमाल करके ऐक्सेस किया जा सकता है. इसके लिए, सही user, uri, और अन्य पैरामीटर तय किए जाते हैं.
ऐप्लिकेशन डेवलपर के लिए वर्कअराउंड
push या pull कमांड के बजाय, adb content और
ContentProvider के इंस्टेंस का इस्तेमाल करके टेस्ट फ़ाइलों के साथ इंटरैक्ट करें.
ContentProviderका एक इंस्टेंस बनाएं. इसे उस ऐप्लिकेशन से होस्ट किया जाता है जो ज़रूरत पड़ने पर फ़ाइलें उपलब्ध करा सकता है और उन्हें सेव कर सकता है. ऐप्लिकेशन के इंटरनल स्टोरेज का इस्तेमाल करें.- फ़ाइलें पुश या पुल करने के लिए,
adb shell contentreadया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
को साफ़ तौर पर तय किया जाता है, ताकि डेवलपर को एक से ज़्यादा उपयोगकर्ताओं के लिए टेस्ट करने में मदद मिल सके. यह ट्रैक करता है कि किसी टेस्ट ने डिवाइस पर उपयोगकर्ताओं की स्थिति बदली है या नहीं. उदाहरण के लिए, बिना हटाए उपयोगकर्ता बनाए गए हैं या नहीं. इसके अलावा, अगर 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>
होस्ट-ड्रिवन टेस्ट
कुछ मामलों में, किसी टेस्ट को टेस्ट के दौरान उपयोगकर्ताओं के बीच स्विच करना पड़ता है. डिवाइस-साइड टेस्ट फ़्रेमवर्क, जैसे कि
यूआई ऑटोमेटरसे स्विच न करें,
क्योंकि टेस्ट प्रोसेस को कभी भी बंद किया जा सकता है. इसके बजाय, होस्ट-साइड
टेस्ट फ़्रेमवर्क का इस्तेमाल करें. जैसे, Tradefed का होस्ट-ड्रिवन टेस्ट
फ़्रेमवर्क.
इससे
ITestDevice को ऐक्सेस किया जा सकता है.
इससे, ज़रूरत के मुताबिक उपयोगकर्ता में कोई भी बदलाव किया जा सकता है.
होस्ट-ड्रिवन टेस्ट के लिए UserChecker (स्टेटस चेक करने वाले टूल में बताया गया है
) का इस्तेमाल करें. इससे उपयोगकर्ता की स्थिति में बदलाव होता है
, क्योंकि यह पक्का करता है कि टेस्ट के बाद सही तरीके से क्लीनअप हो.