इस ट्यूटोरियल में आपको "हैलो वर्ल्ड" बनाने का तरीका बताया गया है ट्रेड फ़ेडरेशन (TF) टेस्ट कॉन्फ़िगरेशन और टीएफ़ के बारे में आपको जानकारी देता है फ़्रेमवर्क शामिल है. डेवलपमेंट एनवायरमेंट से शुरुआत करके, आपको एक आसान और बेहतर कॉन्फ़िगर करने और सुविधाएं जोड़ने के लिए किया जा सकता है.
ट्यूटोरियल में टेस्ट डेवलपमेंट प्रोसेस को कसरतों के एक सेट के रूप में दिखाया गया है, जिसमें हर चरण में कई चरण शामिल हों. इन सभी चरणों में यह बताया गया है कि कैंपेन कैसे बनाना है और फिर धीरे-धीरे कॉन्फ़िगरेशन को बेहतर बनाने के लिए किया जा सकता है. जांच पूरी करने के लिए ज़रूरी सभी सैंपल कोड कॉन्फ़िगरेशन दिया गया है और हर कसरत के टाइटल के साथ एनोटेट किया गया है इस चरण में शामिल भूमिकाओं की जानकारी देने वाला पत्र:
- डेवलपर के लिए D
- इंटिग्रेटर के लिए I
- टेस्ट रनर के लिए R
ट्यूटोरियल पूरा करने के बाद, आपके पास एक काम कर रहा टीएफ़ कॉन्फ़िगरेशन होगा और TF फ़्रेमवर्क के कई अहम सिद्धांतों को समझना है.
ट्रेड फ़ेडरेशन सेट अप करें
TF डेवलपमेंट एनवायरमेंट को सेट अप करने के बारे में जानकारी पाने के लिए, यह देखें मशीन सेटअप. इस ट्यूटोरियल का बाकी हिस्सा यह मानकर चलता है कि आपके पास एक शेल खुला है TF एनवायरमेंट में शुरू किया गया.
आसानी से इस्तेमाल करने के लिए, इस ट्यूटोरियल में कॉन्फ़िगरेशन और क्लास को TF फ़्रेमवर्क की कोर लाइब्रेरी में जोड़ा जा सकता है. इसे डेवलप करने के लिए बढ़ाया जा सकता है ट्रेड किए गए JAR को कंपाइल करके और फिर कंपाइल करके, सोर्स ट्री के बाहर मॉड्यूल के मॉड्यूल का इस्तेमाल कर सकते हैं.
टेस्ट क्लास बनाना (D)
आइए, एक ऐसा हैलो वर्ल्ड टेस्ट तैयार करते हैं, जिसमें सिर्फ़ stdout पर एक मैसेज भेजा जाता है. ऐप्लिकेशन ट्रेडेड टेस्ट आम तौर पर, Iरिमोटटेस्ट इंटरफ़ेस पर कॉपी करने की सुविधा मिलती है. HelloWorldTest के लिए इसे लागू करने के बारे में यहां बताया गया है:
package com.android.tradefed.example; import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.invoker.TestInformation; import com.android.tradefed.log.LogUtil.CLog; import com.android.tradefed.result.ITestInvocationListener; import com.android.tradefed.testtype.IRemoteTest; public class HelloWorldTest implements IRemoteTest { @Override public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException { CLog.i("Hello, TF World!"); } }
यह नमूना कोड यहां सेव करें
<tree>/tools/tradefederation/core/src/com/android/tradefed/example/HelloWorldTest.java
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
और अपने शेल से ट्रेड किए गए को फिर से बनाएं:
m -jN
ध्यान दें कि ऊपर दिए गए उदाहरण में CLog.i
का इस्तेमाल, आउटपुट को कंसोल पर भेजने के लिए किया जाता है. ज़्यादा देखें
ट्रेड फ़ेडरेशन में लॉग इन करने के बारे में जानकारी लॉगिंग (D, I, R) में दी गई है.
अगर बिल्ड सफल नहीं होता है, तो मशीन सेटअप करें, ताकि कोई भी चरण छूट न जाए.
कोई कॉन्फ़िगरेशन बनाना (I)
ट्रेड फ़ेडरेशन से किए जाने वाले टेस्ट को एक्ज़ीक्यूट करने लायक बनाने के लिए, कॉन्फ़िगरेशन, एक एक्सएमएल फ़ाइल जो ट्रेडेड डेटा देती है चलाने के लिए टेस्ट या टेस्ट किए जा सकते हैं. साथ ही, यह भी बताया जा सकता है कि कौनसे मॉड्यूल को एक्ज़ीक्यूट किया जाए और ऑर्डर.
आइए हमारे HelloWorldTest के लिए नया कॉन्फ़िगरेशन बनाएं (पूरी क्लास के बारे में बताएं HelloWorldTest का नाम):
<configuration description="Runs the hello world test"> <test class="com.android.tradefed.example.HelloWorldTest" /> </configuration>
इस डेटा को अपने डिवाइस पर कहीं भी helloworld.xml
फ़ाइल में सेव करें
फ़ाइल सिस्टम (जैसे, /tmp/helloworld.xml
). TF
कॉन्फ़िगरेशन एक्सएमएल फ़ाइल (यानी कॉन्फ़िगरेशन), इसका इस्तेमाल करके तय क्लास को लोड करती है
प्रतिबिंब बनाएं, उसे इंस्टैंशिएट करें, IRemoteTest
पर कास्ट करें, और
run
तरीका.
कॉन्फ़िगरेशन (R) चलाएं
अपने शेल से, ट्रेडेड कंसोल लॉन्च करें:
tradefed.sh
पक्का करें कि डिवाइस, होस्ट मशीन से कनेक्ट हो और वह ट्रेड किए गए डिवाइस पर दिख रहा हो:
tf> list devices Serial State Product Variant Build Battery 004ad9880810a548 Available mako mako JDQ39 100
कॉन्फ़िगरेशन को run <config>
का इस्तेमाल करके लागू किया जा सकता है
कंसोल निर्देश. ऐसा करके देखें:
tf> run /tmp/helloworld.xml 05-12 13:19:36 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548 Hello, TF World!
आपको "नमस्ते, TF World!" आउटपुट दिया गया हो.
list invocations
का इस्तेमाल करके, यह पुष्टि की जा सकती है कि कोई निर्देश चल रहा है या नहीं
l i
का इस्तेमाल किया जा सकता है और इसे कुछ भी प्रिंट नहीं करना चाहिए. अगर कमांड, फ़िलहाल
तो वे इस तरह प्रदर्शित होते हैं:
tf >l i Command Id Exec Time Device State 10 0m:00 [876X00GNG] running stub on build(s) 'BuildInfo{bid=0, target=stub, serial=876X00GNG}'
क्लासपाथ में कॉन्फ़िगरेशन जोड़ें (D, I, R)
डिप्लॉयमेंट की सुविधा के लिए, कॉन्फ़िगर किए गए डेटा में कॉन्फ़िगरेशन को भी बंडल किया जा सकता है JAR खुद शामिल करते हैं. Trefed ऐप्लिकेशन, उसमें रखे गए सभी कॉन्फ़िगरेशन को अपने-आप पहचान लेता है config फ़ोल्डर को सेट अप किया है.
उदाहरण के लिए, helloworld.xml
फ़ाइल को ट्रेडेड फ़ीड में ले जाएं
कोर लाइब्रेरी
(<tree>/tools/tradefederation/core/res/config/example/helloworld.xml
).
नए सिरे से तैयार किया गया प्रॉडक्ट दिखाएं, ट्रेड किए गए कंसोल को रीस्टार्ट करें. इसके बाद, उस कंपनी को प्रॉडक्ट दिखाने के लिए कहें
क्लासपाथ से कॉन्फ़िगरेशन की सूची:
tf> list configs […] example/helloworld: Runs the hello world test
अब इसका इस्तेमाल करके helloworld कॉन्फ़िगरेशन को चलाया जा सकता है:
tf> run example/helloworld 05-12 13:21:21 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548 Hello, TF World!
किसी डिवाइस से इंटरैक्ट करें (D, R)
अभी तक, हमारा HelloWorldTest कुछ भी दिलचस्प नहीं कर रहा है. ट्रेडफ़ेड्स खासियत, Android डिवाइसों का इस्तेमाल करके टेस्ट चलाना है, इसलिए Android डिवाइस जोड़ना उसका टेस्ट कैसे करना है.
जांच में TestInformation
का इस्तेमाल करके, किसी Android डिवाइस का रेफ़रंस मिल सकता है. इसके लिए, ज़रूरी है कि
IRemoteTest#run
तरीके को कॉल करने पर, फ़्रेमवर्क के मुताबिक इस्तेमाल किया जा सकता है.
मान लें कि आपके शब्द का सीरियल नंबर दिखाने के लिए HelloWorldTest के प्रिंट मैसेज में बदलाव करना है डिवाइस:
@Override public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException { CLog.i("Hello, TF World! I have device " + testInfo.getDevice().getSerialNumber()); }
ट्रेड किए गए डिवाइस को फिर से बनाएं और डिवाइसों की सूची देखें:
tradefed.sh
tf> list devices Serial State Product Variant Build Battery 004ad9880810a548 Available mako mako JDQ39 100
उपलब्ध की सूची में दिए गए सीरियल नंबर को ध्यान में रखें; यानी कि वह डिवाइस जिसे HelloWorld के लिए असाइन किया जाना चाहिए:
tf> run example/helloworld 05-12 13:26:18 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548 Hello, TF World! I have device 004ad9880810a548
आपको नया प्रिंट संदेश दिखाई देगा, जिस पर डिवाइस.
जांच के नतीजे भेजें (D)
IRemoteTest
इस पर कॉल करके नतीजों की रिपोर्ट करता है:
ITestInvocationListener
#run
तरीके को दिया गया इंस्टेंस. TF फ़्रेमवर्क खुद
(के माध्यम से)
ITestInvocationListener#invocationStarted)
और अंत में (के ज़रिए
ITestInvocationListener#invocationEnded)
हर इंटरैक्शन के लिए.
टेस्ट रन, टेस्ट का लॉजिकल कलेक्शन होता है. जांच के नतीजों की शिकायत करने के लिए,
टेस्ट रन शुरू होने की रिपोर्ट करने की ज़िम्मेदारी IRemoteTest
की होती है,
हर टेस्ट की शुरुआत और आखिर में, और टेस्ट रन के आखिर में.
यहां बताया गया है कि एक ही शब्द के साथ HelloWorldTest को लागू करने पर कैसा दिख सकता है जांच का नतीजा नहीं निकला.
@Override public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException { CLog.i("Hello, TF World! I have device " + testInfo.getDevice().getSerialNumber()); TestDescription testId = new TestDescription("com.example.TestClassName", "sampleTest"); listener.testRunStarted("helloworldrun", 1); listener.testStarted(testId); listener.testFailed(testId, "oh noes, test failed"); listener.testEnded(testId, Collections.emptyMap()); listener.testRunEnded(0, Collections.emptyMap()); }
TF में कई IRemoteTest
लागू करने की सुविधा शामिल हैं, जिन्हें फिर से इस्तेमाल किया जा सकता है
से लिखने में मदद मिलती है. उदाहरण के लिए,
इंस्ट्रुमेंटेशनटेस्ट
किसी Android ऐप्लिकेशन के परीक्षण को किसी Android डिवाइस पर दूरस्थ रूप से चला सकता है,
और उन परिणामों को ITestInvocationListener
पर भेजें).
जानकारी के लिए, यह देखें
जांच करें
टाइप.
स्टोर से जुड़े टेस्ट के नतीजे (I)
TF कॉन्फ़िगरेशन के लिए, टेस्ट लिसनर को डिफ़ॉल्ट तौर पर इस तरह लागू किया जाता है Textresults Reporter, जो शुरू करने के नतीजे को stdout पर भेज देता है. उदाहरण के लिए, पिछले सेक्शन में शामिल HelloWorldTest का कॉन्फ़िगरेशन:
./tradefed.sh
tf> run example/helloworld 04-29 18:25:55 I/TestInvocation: Invocation was started with cmd: /tmp/helloworld.xml 04-29 18:25:55 I/TestInvocation: Starting invocation for 'stub' with '[ BuildInfo{bid=0, target=stub, serial=876X00GNG} on device '876X00GNG'] 04-29 18:25:55 I/HelloWorldTest: Hello, TF World! I have device 876X00GNG 04-29 18:25:55 I/InvocationToJUnitResultForwarder: Running helloworldrun: 1 tests 04-29 18:25:55 W/InvocationToJUnitResultForwarder: Test com.example.TestClassName#sampleTest failed with stack: oh noes, test failed 04-29 18:25:55 I/InvocationToJUnitResultForwarder: Run ended in 0 ms
शुरू करने के बाद मिले नतीजों को किसी फ़ाइल में, जैसे कि किसी फ़ाइल में स्टोर करने के लिए,
कस्टम ITestInvocationListener
लागू करने के लिए,
आपके कॉन्फ़िगरेशन में result_reporter
टैग है.
TF में यह भी शामिल है:
Xmlनतीजे रिपोर्टर
लिसनर, जो इससे मिलते-जुलते फ़ॉर्मैट में एक्सएमएल फ़ाइल पर टेस्ट के नतीजे लिखता है
इसका इस्तेमाल ant JUnit XML राइटर करता है. इसमें रिज़ल्ट_रिपोर्टर की जानकारी देने के लिए
कॉन्फ़िगरेशन के हिसाब से, …/res/config/example/helloworld.xml
में बदलाव करें
कॉन्फ़िगरेशन:
<configuration description="Runs the hello world test"> <test class="com.android.tradefed.example.HelloWorldTest" /> <result_reporter class="com.android.tradefed.result.XmlResultReporter" /> </configuration>
अब नए सिरे से कारोबार करें और hello World सैंपल को फिर से चलाएं:
tf> run example/helloworld 05-16 21:07:07 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548 Hello, TF World! I have device 004ad9880810a548 05-16 21:07:07 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_2991649128735283633/device_logcat_6999997036887173857.txt 05-16 21:07:07 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_2991649128735283633/host_log_6307746032218561704.txt 05-16 21:07:07 I/XmlResultReporter: XML test result file generated at /tmp/0/inv_2991649128735283633/test_result_536358148261684076.xml. Total tests 1, Failed 1, Error 0
लॉग मैसेज पर ध्यान दें, जिसमें यह बताया गया हो कि एक्सएमएल फ़ाइल जनरेट कर दी गई है; यह जनरेट की गई फ़ाइल इस तरह दिखनी चाहिए:
<?xml version='1.0' encoding='UTF-8' ?> <testsuite name="stub" tests="1" failures="1" errors="0" time="9" timestamp="2011-05-17T04:07:07" hostname="localhost"> <properties /> <testcase name="sampleTest" classname="com.example.TestClassName" time="0"> <failure>oh noes, test failed </failure> </testcase> </testsuite>
इसके अलावा, अपनी पसंद के मुताबिक, लिसनर भी लिखा जा सकता है— को लागू करने की ज़रूरत है ITestInvocationListener इंटरफ़ेस पर कॉपी करने की सुविधा मिलती है.
Trefed ऐप्लिकेशन, शुरू करने के लिए एक से ज़्यादा लिसनर के साथ काम करता है, ताकि आप टेस्ट के नतीजे भेज सकें
कई अलग-अलग डेस्टिनेशन पर लागू किया जा सकता है. ऐसा करने के लिए, बस एक से ज़्यादा
आपके कॉन्फ़िगरेशन में <result_reporter>
टैग हैं.
लॉगिंग सुविधाएं (D, I, R)
TF की लॉगिंग सुविधाओं में ये काम करने की सुविधा शामिल है:
- डिवाइस से लॉग कैप्चर करें (यानी डिवाइस Logcat)
- होस्ट मशीन पर चल रहे ट्रेड फ़ेडरेशन फ़्रेमवर्क से लॉग रिकॉर्ड करें (यानी होस्ट लॉग)
TF फ़्रेमवर्क, असाइन किए गए डिवाइस से लॉगकैट को अपने-आप कैप्चर करता है
और उसे प्रोसेस करने के लिए न्योता देने वाले लिसनर को भेज दिया जाता है.
इसके बाद, XmlResultReporter
कैप्चर किए गए डिवाइस लॉगकैट को फ़ाइल के तौर पर सेव करता है.
TF होस्ट लॉग की रिपोर्ट,
Cलॉग रैपर
ddmlib लॉग क्लास के लिए. आइए, इस कीवर्ड को
HelloWorldTest में पिछले System.out.println
कॉल को
CLog
कॉल:
@Override public void run(ITestInvocationListener listener) throws DeviceNotAvailableException { CLog.i("Hello, TF World! I have device %s", getDevice().getSerialNumber());
CLog
, स्ट्रिंग इंटरपोलेशन को सीधे तौर पर हैंडल करता है. यह इसके जैसा ही है
String.format
. जब TF को फिर से बनाया और चलाया जाता है, तो आपको
stdout पर लॉग मैसेज:
tf> run example/helloworld … 05-16 21:30:46 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548 …
डिफ़ॉल्ट रूप से, शेयर किया गया
आउटपुट होस्ट लॉग
stdout पर भेजे जाने वाले मैसेज. TF में लॉग को लागू करने की सुविधा भी शामिल है, जो यह लिखता है
फ़ाइल में मौजूद मैसेज:
FileLogger.
फ़ाइल लॉगिंग जोड़ने के लिए, कॉन्फ़िगरेशन में logger
टैग जोड़ें
FileLogger
का पूरा क्लास नाम:
<configuration description="Runs the hello world test"> <test class="com.android.tradefed.example.HelloWorldTest" /> <result_reporter class="com.android.tradefed.result.XmlResultReporter" /> <logger class="com.android.tradefed.log.FileLogger" /> </configuration>
अब, हैलोवर्ल्ड उदाहरण को फिर से बनाएं और चलाएं:
tf >run example/helloworld … 05-16 21:38:21 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_6390011618174565918/device_logcat_1302097394309452308.txt 05-16 21:38:21 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt …
लॉग मैसेज, होस्ट लॉग का पाथ दिखाता है. इसे देखने पर, इसमें आपका HelloWorldTest लॉग वाला मैसेज होना चाहिए:
more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt
आउटपुट का उदाहरण:
… 05-16 21:38:21 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
हैंडलिंग के विकल्प (D, I, R)
TF कॉन्फ़िगरेशन (यानी कॉन्फ़िगरेशन ऑब्जेक्ट) से लोड किए गए ऑब्जेक्ट
कमांड लाइन आर्ग्युमेंट से भी डेटा हासिल किया जा सकता है. इसके लिए,
@Option
एनोटेशन.
इस सुविधा में शामिल होने के लिए, कॉन्फ़िगरेशन ऑब्जेक्ट क्लास @Option
को लागू करती है
एनोटेशन को सदस्य फ़ील्ड में जोड़ देता है और इसे एक यूनीक नाम देता है. इससे,
सदस्य फ़ील्ड मान को कमांड लाइन विकल्प के ज़रिए भरा जाना है (और यह भी
उस विकल्प को अपने-आप कॉन्फ़िगरेशन सहायता सिस्टम में जोड़ देता है).
ध्यान दें: सभी तरह के फ़ील्ड काम नहीं करते. समर्थित प्रकारों का वर्णन, देखें OptionSetter.
आइए, HelloWorldTest में @Option
जोड़ते हैं:
@Option(name="my_option", shortName='m', description="this is the option's help text", // always display this option in the default help text importance=Importance.ALWAYS) private String mMyOption = "thisisthedefault";
अब आपको एक लॉग मैसेज जोड़ना है, ताकि विकल्प की वैल्यू दिखाई जा सके HelloWorldTest ताकि हम यह दिखा सकें कि यह सही तरीके से मिला है:
@Override public void run(ITestInvocationListener listener) throws DeviceNotAvailableException { … CLog.logAndDisplay(LogLevel.INFO, "I received option '%s'", mMyOption);
आखिरकार, TF को फिर से बनाएं और हैलोवर्ल्ड चलाएं; आपको
my_option
डिफ़ॉल्ट वैल्यू:
tf> run example/helloworld … 05-24 18:30:05 I/HelloWorldTest: I received option 'thisisthedefault'
कमांड लाइन से वैल्यू पास करें
my_option
की वैल्यू पास करें; आपको यह देखना चाहिए
my_option
को उस वैल्यू से भरा गया:
tf> run example/helloworld --my_option foo … 05-24 18:33:44 I/HelloWorldTest: I received option 'foo'
टीएफ़ कॉन्फ़िगरेशन में एक सहायता सिस्टम भी शामिल होता है, जो अपने-आप दिखता है
@Option
फ़ील्ड के लिए सहायता टेक्स्ट. इसे अभी आज़माएं. आपको
my_option
के लिए सहायता टेक्स्ट:
tf> run example/helloworld --help Printing help for only the important options. To see help for all options, use the --help-all flag cmd_options options: --[no-]help display the help text for the most important/critical options. Default: false. --[no-]help-all display the full help text for all options. Default: false. --[no-]loop keep running continuously. Default: false. test options: -m, --my_option this is the option's help text Default: thisisthedefault. 'file' logger options: --log-level-display the minimum log level to display on stdout. Must be one of verbose, debug, info, warn, error, assert. Default: error.
"सिर्फ़ ज़रूरी विकल्पों को प्रिंट करें" वाला मैसेज नोट करें. कम करने के लिए
विकल्प अव्यवस्थित करने में मदद करने वाला विकल्प है, तो TF इन कामों के लिए Option#importance
एट्रिब्यूट का इस्तेमाल करता है
यह तय करें कि जब @Option
फ़ील्ड में कोई खास सहायता टेक्स्ट दिखे, तो
--help
बताया गया है. --help-all
इसके लिए हमेशा सहायता दिखाता है
सभी @Option
फ़ील्ड का इस्तेमाल किया जा सकता है. जानकारी के लिए, यह देखें
Option.Importance.
किसी कॉन्फ़िगरेशन से वैल्यू पास करें
आप चाहें, तो कॉन्फ़िगरेशन में
<option name="" value="">
एलिमेंट. इसका उपयोग करके इसका परीक्षण करें
helloworld.xml
:
<test class="com.android.tradefed.example.HelloWorldTest" > <option name="my_option" value="fromxml" /> </test>
फिर से बनाने और helloworld को चलाने से अब यह आउटपुट पैदा करना चाहिए:
05-24 20:38:25 I/HelloWorldTest: I received option 'fromxml'
कॉन्फ़िगरेशन सहायता भी अपडेट होनी चाहिए, ताकि
my_option
:
tf> run example/helloworld --help test options: -m, --my_option this is the option's help text Default: fromxml.
helloworld कॉन्फ़िगरेशन में शामिल अन्य कॉन्फ़िगरेशन ऑब्जेक्ट, जैसे
FileLogger
, विकल्पों को भी स्वीकार करें. विकल्प
--log-level-display
दिलचस्प है, क्योंकि यह ऐसे लॉग को फ़िल्टर करता है जो
stdout पर जाना. ट्यूटोरियल की शुरुआत में, आपने नोटिस किया होगा कि "नमस्ते, TF
दुनिया! मेरे पास डिवाइस है ...' stdout पर लॉग मैसेज दिखना बंद हो गया,
FileLogger
का इस्तेमाल करने के लिए स्विच किया गया. आप चाहें तो
--log-level-display
आर्ग्युमेंट में पास करके, stdout में लॉग इन करें.
इसे अभी आज़माएं और आपको 'मेरे पास डिवाइस है' दिखेगा लॉग मैसेज फिर से दिखने लगता है stdout:
tf> run example/helloworld --log-level-display info … 05-24 18:53:50 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
बस इतना ही, दोस्तों!
याद रखें कि अगर आपको किसी चीज़ को समझने में परेशानी होती है, ट्रेड फ़ेडरेशन सोर्स कोड में ऐसी कई काम की जानकारी मौजूद है जो दस्तावेज़. अगर सब कुछ विफल हो जाता है, तो इस पर पूछकर देखें Android प्लैटफ़ॉर्म "ट्रेड फ़ेडरेशन" के साथ Google समूह डालें.