इस ट्यूटोरियल में, "हैलो वर्ल्ड" Trade Federation (Tradefed या TF) टेस्ट कॉन्फ़िगरेशन बनाने का तरीका बताया गया है. साथ ही, इसमें TF फ़्रेमवर्क के बारे में जानकारी दी गई है. डेवलपमेंट एनवायरमेंट से शुरू करके, आपको एक आसान कॉन्फ़िगरेशन बनाना होगा और सुविधाएं जोड़नी होंगी.
इस ट्यूटोरियल में, टेस्ट डेवलपमेंट की प्रोसेस को एक्सरसाइज़ के सेट के तौर पर दिखाया गया है. इसमें हर एक्सरसाइज़ में कई चरण होते हैं. इन चरणों में, कॉन्फ़िगरेशन बनाने और उसे धीरे-धीरे बेहतर बनाने का तरीका बताया गया है. टेस्ट कॉन्फ़िगरेशन पूरा करने के लिए, आपको सभी सैंपल कोड दिए जाते हैं. साथ ही, हर एक्सरसाइज़ के टाइटल के साथ एक अक्षर जोड़ा जाता है, जिसमें उस चरण में शामिल भूमिकाओं के बारे में बताया जाता है:
- डेवलपर के लिए D
- इंटिग्रेटर के लिए I
- टेस्ट रनर के लिए R
ट्यूटोरियल पूरा करने के बाद, आपके पास काम करने वाला TF कॉन्फ़िगरेशन होगा और आप TF फ़्रेमवर्क के कई अहम कॉन्सेप्ट को समझ पाएंगे.
ट्रेड फ़ेडरेशन सेट अप करना
TF डेवलपमेंट एनवायरमेंट सेट अप करने के बारे में ज़्यादा जानने के लिए, मशीन सेटअप देखें. इस ट्यूटोरियल के बाकी हिस्से में यह माना गया है कि आपके पास एक शेल खुला है, जिसे TF एनवायरमेंट में शुरू किया गया है.
इस ट्यूटोरियल में, TF फ़्रेमवर्क की मुख्य लाइब्रेरी में कॉन्फ़िगरेशन और उसकी क्लास जोड़ने का तरीका आसानी से बताया गया है. इस प्रोसेस को सोर्स ट्री के बाहर मॉड्यूल बनाने के लिए भी इस्तेमाल किया जा सकता है. इसके लिए, आपको tradefed JAR को कंपाइल करना होगा. इसके बाद, उस JAR के हिसाब से अपने मॉड्यूल कंपाइल करने होंगे.
टेस्ट क्लास बनाना (D)
आइए, एक ऐसा 'हैलो वर्ल्ड' टेस्ट बनाएं जो सिर्फ़ स्टैंडर्ड आउटपुट (stdout) में एक मैसेज डालता है. आम तौर पर, ट्रेडफ़ेड टेस्ट में IRemoteTest इंटरफ़ेस लागू होता है. 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
में सेव करें और अपने शेल से tradefed को फिर से बनाएं:
m -jN
ध्यान दें कि ऊपर दिए गए उदाहरण में, CLog.i
का इस्तेमाल आउटपुट को कंसोल पर भेजने के लिए किया गया है. Trade Federation में लॉग इन करने के बारे में ज़्यादा जानकारी, लॉगिंग (D, I, R) में दी गई है.
अगर बिल्ड पूरा नहीं होता है, तो मशीन सेटअप सेक्शन में जाकर पक्का करें कि आपने कोई चरण न छोड़ा हो.
कॉन्फ़िगरेशन बनाना (I)
Trade Federation टेस्ट को चलाने के लिए, एक कॉन्फ़िगरेशन बनाया जाता है. यह एक एक्सएमएल फ़ाइल होती है, जो TradeFed को यह निर्देश देती है कि कौनसा टेस्ट (या टेस्ट) चलाना है. साथ ही, यह भी बताती है कि कौनसे अन्य मॉड्यूल को किस क्रम में चलाना है.
आइए, अपने HelloWorldTest के लिए एक नया कॉन्फ़िगरेशन बनाएं (HelloWorldTest की पूरी क्लास का नाम ध्यान दें):
<configuration description="Runs the hello world test"> <test class="com.android.tradefed.example.HelloWorldTest" /> </configuration>
इस डेटा को अपने लोकल फ़ाइल सिस्टम (जैसे, /tmp/helloworld.xml
) में कहीं भी helloworld.xml
फ़ाइल में सेव करें. TF, कॉन्फ़िगरेशन एक्सएमएल फ़ाइल (जिसे config भी कहा जाता है) को पार्स करेगा, रिफ़्लेक्शन का इस्तेमाल करके बताई गई क्लास को लोड करेगा, उसे इंस्टैंशिएट करेगा, उसे IRemoteTest
में कास्ट करेगा, और उसके run
तरीके को कॉल करेगा.
कॉन्फ़िगरेशन चलाना (R)
अपने शेल से, tradefed कंसोल लॉन्च करें:
tradefed.sh
पक्का करें कि डिवाइस, होस्ट मशीन से कनेक्ट हो और tradefed को दिख रहा हो:
tf> list devices Serial State Product Variant Build Battery 004ad9880810a548 Available mako mako JDQ39 100
कॉन्फ़िगरेशन को run <config>
console कमांड का इस्तेमाल करके चलाया जा सकता है. ऐसा करके देखें:
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!
आपको टर्मिनल पर "Hello, 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) में जोड़ना
डिप्लॉयमेंट को आसान बनाने के लिए, कॉन्फ़िगरेशन को खुद tradefed JARs में बंडल किया जा सकता है. Tradefed, क्लासपाथ पर मौजूद config फ़ोल्डर में रखे गए सभी कॉन्फ़िगरेशन को अपने-आप पहचान लेता है.
उदाहरण के लिए, helloworld.xml
फ़ाइल को tradefed की मुख्य लाइब्रेरी (<tree>/tools/tradefederation/core/res/config/example/helloworld.xml
) में ले जाएं. इसके बाद, tradefed को फिर से बनाएं और tradefed कंसोल को रीस्टार्ट करें. इसके बाद, tradefed को क्लासपाथ से कॉन्फ़िगरेशन की सूची दिखाने के लिए कहें:
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 कुछ खास नहीं कर रहा है. Tradefed की खासियत, 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 को फिर से बनाएं और डिवाइसों की सूची देखें:
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
, #run
वाले तरीके के लिए दिए गए ITestInvocationListener इंस्टेंस पर तरीके कॉल करके नतीजे दिखाता है. हर INVOCATION की शुरुआत (ITestInvocationListener#invocationStarted के ज़रिए) और आखिर (ITestInvocationListener#invocationEnded के ज़रिए) की रिपोर्टिंग करने की ज़िम्मेदारी, TF फ़्रेमवर्क की होती है.
टेस्ट रन, टेस्ट का एक लॉजिकल कलेक्शन होता है. जांच के नतीजों की रिपोर्ट करने के लिए,
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
लागू करने के कई तरीके शामिल हैं. इनका इस्तेमाल करके, अपने तरीके से फिर से लिखने के बजाय, पहले से मौजूद तरीकों का फिर से इस्तेमाल किया जा सकता है. उदाहरण के लिए, InstrumentationTest, किसी Android डिवाइस पर Android ऐप्लिकेशन की जांच को रिमोट तौर पर चला सकता है, नतीजों को पार्स कर सकता है, और उन नतीजों को ITestInvocationListener
पर भेज सकता है. ज़्यादा जानकारी के लिए, टेस्ट के टाइप देखें.
स्टोर की जांच के नतीजे (I)
TF कॉन्फ़िगरेशन के लिए, डिफ़ॉल्ट टेस्ट लिसनर के तौर पर TextResultReporter का इस्तेमाल किया जाता है. यह स्टैंडर्ड आउटपुट (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
किसी फ़ाइल में या किसी अन्य जगह पर, कॉल के नतीजे सेव करने के लिए, अपने कॉन्फ़िगरेशन में result_reporter
टैग का इस्तेमाल करके, पसंद के मुताबिक ITestInvocationListener
लागू करें.
TF में XmlResultReporter लिसनर भी शामिल है. यह ant JUnit एक्सएमएल लेखक के इस्तेमाल किए गए फ़ॉर्मैट के मिलते-जुलते फ़ॉर्मैट में, एक्सएमएल फ़ाइल में टेस्ट के नतीजे लिखता है. कॉन्फ़िगरेशन में result_reporter तय करने के लिए, …/res/config/example/helloworld.xml
config में बदलाव करें:
<configuration description="Runs the hello world test"> <test class="com.android.tradefed.example.HelloWorldTest" /> <result_reporter class="com.android.tradefed.result.XmlResultReporter" /> </configuration>
अब tradefed को फिर से बनाएं और 'नमस्ते दुनिया' सैंपल को फिर से चलाएं:
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 इंटरफ़ेस लागू करना होगा.
Tradefed, कई इंवोकेशन लिसनर के साथ काम करता है, ताकि आप टेस्ट के नतीजों को कई अलग-अलग डेस्टिनेशन पर भेज सकें. ऐसा करने के लिए, अपने कॉन्फ़िगरेशन में एक से ज़्यादा
<result_reporter>
टैग डालें.
लॉगिंग की सुविधाएं (D, I, R)
TF की लॉगिंग सुविधाओं में ये काम किए जा सकते हैं:
- डिवाइस से लॉग कैप्चर करना (जिसे डिवाइस लॉगकैट भी कहा जाता है)
- होस्ट मशीन पर चल रहे Trade Federation फ़्रेमवर्क के लॉग रिकॉर्ड करना (इसे होस्ट लॉग भी कहा जाता है)
TF फ़्रेमवर्क, डिवाइस के लिए तय किए गए लॉगकैट को अपने-आप कैप्चर करता है और उसे प्रोसेस करने के लिए, invocaton listener को भेजता है.
XmlResultReporter
इसके बाद, कैप्चर किए गए डिवाइस के लॉगकैट को फ़ाइल के तौर पर सेव करता है.
ddmlib लॉग क्लास के लिए, CLog wrapper का इस्तेमाल करके, TF होस्ट लॉग की रिपोर्ट की जाती है. आइए, 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 को फिर से बनाने और फिर से चलाने पर, आपको स्टैंडर्ड आउटपुट पर लॉग मैसेज दिखेगा:
tf> run example/helloworld … 05-16 21:30:46 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548 …
डिफ़ॉल्ट रूप से, tradefed होस्ट लॉग मैसेज को स्टैंडर्ड आउटपुट (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>
अब, helloworld उदाहरण को फिर से बनाएं और चलाएं:
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 को फिर से बनाएं और helloworld को चलाएं. आपको 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
एट्रिब्यूट का इस्तेमाल करता है. इससे यह तय किया जाता है कि --help
तय किए जाने पर, किसी खास @Option
फ़ील्ड का सहायता टेक्स्ट दिखाया जाए या नहीं. --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
World! मेरे पास डिवाइस …' लॉग मैसेज, स्टैंडआउट पर दिखना बंद हो गया है. ऐसा इसलिए हुआ, क्योंकि हमने FileLogger
का इस्तेमाल शुरू किया है. --log-level-display
आर्ग्युमेंट पास करके, स्टैंडर्ड आउटपुट में लॉग करने की जानकारी को ज़्यादा किया जा सकता है.
अब इसे आज़माएं. आपको 'मेरे पास डिवाइस है' लॉग मैसेज, स्क्रीन पर फिर से दिखेगा. साथ ही, यह किसी फ़ाइल में भी लॉग किया जाएगा:
tf> run example/helloworld --log-level-display info … 05-24 18:53:50 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
बस इतना ही है, दोस्तों!
आपको याद दिला दें कि अगर आपको किसी समस्या का हल नहीं मिल रहा है, तो Trade Federation के सोर्स कोड में बहुत सारी काम की जानकारी मौजूद है. यह जानकारी दस्तावेज़ में नहीं दी गई है. अगर आपको कोई मदद नहीं मिलती है, तो android-platform Google ग्रुप पर जाकर, मैसेज के विषय में "ट्रेड फ़ेडरेशन" लिखकर पूछें.