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