शुरू से आखिर तक के TF टेस्ट का उदाहरण

इस ट्यूटोरियल में, "हैलो वर्ल्ड" 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 की लॉगिंग सुविधाओं में ये काम किए जा सकते हैं:

  1. डिवाइस से लॉग कैप्चर करना (जिसे डिवाइस लॉगकैट भी कहा जाता है)
  2. होस्ट मशीन पर चल रहे 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 ग्रुप पर जाकर, मैसेज के विषय में "ट्रेड फ़ेडरेशन" लिखकर पूछें.