Home | History | Annotate | Download | only in components
      1 page.title=Android Interface Definition Language (AIDL)
      2 @jd:body
      3 
      4 
      5 <div id="qv-wrapper">
      6 <div id="qv">
      7 <h2>In this document</h2>
      8 <ol>
      9   <li><a href="#Defining">Defining an AIDL Interface</a>
     10     <ol>
     11       <li><a href="#Create">Create the .aidl file</a></li>
     12       <li><a href="#Implement">Implement the interface</a></li>
     13       <li><a href="#Expose">Expose the interface to clients</a></li>
     14     </ol>
     15   </li>
     16   <li><a href="#PassingObjects">Passing Objects over IPC</a></li>
     17   <li><a href="#Calling">Calling an IPC Method</a></li>
     18 </ol>
     19 
     20 <h2>See also</h2>
     21 <ol>
     22   <li><a href="{@docRoot}guide/components/bound-services.html">Bound Services</a></li>
     23 </ol>
     24 
     25 </div>
     26 </div>
     27 
     28 
     29 <p>AIDL (Android Interface Definition Language) is similar to other IDLs you might have
     30 worked with. It allows you to define the programming interface that both
     31 the client and service agree upon in order to communicate with each other using
     32 interprocess communication (IPC). On Android, one process cannot normally access the
     33 memory of another process. So to talk, they need to decompose their objects into primitives that the
     34 operating system can understand, and marshall the objects across that boundary for you. The code to
     35 do that marshalling is tedious to write, so Android handles it for you with AIDL.</p>
     36 
     37 <p class="note"><strong>Note:</strong> Using AIDL is necessary only if you allow clients from
     38 different applications to access your service for IPC and want to handle multithreading in your
     39 service. If you do not need to perform concurrent IPC across
     40 different applications, you should create your interface by <a
     41 href="{@docRoot}guide/components/bound-services.html#Binder">implementing a
     42 Binder</a> or, if you want to perform IPC, but do <em>not</em> need to handle multithreading,
     43 implement your interface <a
     44 href="{@docRoot}guide/components/bound-services.html#Messenger">using a Messenger</a>.
     45 Regardless, be sure that you understand <a
     46 href="{@docRoot}guide/components/bound-services.html">Bound Services</a> before
     47 implementing an AIDL.</p>
     48 
     49 <p>Before you begin designing your AIDL interface, be aware that calls to an AIDL interface are
     50 direct function calls.  You should not make assumptions about the thread in which the call
     51 occurs.  What happens is different depending on whether the call is from a thread in the
     52 local process or a remote process. Specifically:</p>
     53 
     54 <ul>
     55 <li>Calls made from the local process are executed in the same thread that is making the call. If
     56 this is your main UI thread, that thread continues to execute in the AIDL interface.  If it is
     57 another thread, that is the one that executes your code in the service.  Thus, if only local
     58 threads are accessing the service, you can completely control which threads are executing in it (but
     59 if that is the case, then you shouldn't be using AIDL at all, but should instead create the
     60 interface by <a href="{@docRoot}guide/components/bound-services.html#Binder">implementing a
     61 Binder</a>).</li>
     62 
     63 <li>Calls from a remote process are dispatched from a thread pool the platform maintains inside of
     64 your own process.  You must be prepared for incoming calls from unknown threads, with multiple calls
     65 happening at the same time.  In other words, an implementation of an AIDL interface must be
     66 completely thread-safe.</li>
     67 
     68 <li>The {@code oneway} keyword modifies the behavior of remote calls.  When used, a remote call does
     69 not block; it simply sends the transaction data and immediately returns.
     70 The implementation of the interface eventually receives this as a regular call from the {@link
     71 android.os.Binder} thread pool as a normal remote call. If {@code oneway} is used with a local call,
     72 there is no impact and the call is still synchronous.</li>
     73 </ul>
     74 
     75 
     76 <h2 id="Defining">Defining an AIDL Interface</h2>
     77 
     78 <p>You must define your AIDL interface in an {@code .aidl} file using the Java
     79 programming language syntax, then save it in the source code (in the {@code src/} directory) of both
     80 the application hosting the service and any other application that binds to the service.</p>
     81 
     82 <p>When you build each application that contains the {@code .aidl} file, the Android SDK tools
     83 generate an {@link android.os.IBinder} interface based on the {@code .aidl} file and save it in
     84 the project's {@code gen/} directory. The service must implement the {@link android.os.IBinder}
     85 interface as appropriate. The client applications can then bind to the service and call methods from
     86 the {@link android.os.IBinder} to perform IPC.</p>
     87 
     88 <p>To create a bounded service using AIDL, follow these steps:</p>
     89 <ol>
     90     <li><a href="#CreateAidl">Create the .aidl file</a>
     91       <p>This file defines the programming interface with method signatures.</p>
     92     </li>
     93     <li><a href="#ImplementTheInterface">Implement the interface</a>
     94       <p>The Android SDK tools generate an interface in the Java programming language, based on your
     95 {@code .aidl} file. This interface has an inner abstract class named {@code Stub} that extends
     96 {@link android.os.Binder} and implements methods from your AIDL interface. You must extend the
     97 {@code Stub} class and implement the methods.</p>
     98     </li>
     99     <li><a href="#ExposeTheInterface">Expose the interface to clients</a>
    100       <p>Implement a {@link android.app.Service Service} and override {@link
    101 android.app.Service#onBind onBind()} to return your implementation of the {@code Stub}
    102 class.</p>
    103     </li>
    104 </ol>
    105 
    106 <p class="caution"><strong>Caution:</strong> Any changes that you make to your AIDL interface after
    107 your first release must remain backward compatible in order to avoid breaking other applications
    108 that use your service. That is, because your {@code .aidl} file must be copied to other applications
    109 in order for them to access your service's interface, you must maintain support for the original
    110 interface.</p>
    111 
    112 
    113 <h3 id="Create">1. Create the .aidl file</h3>
    114 
    115 <p>AIDL uses a simple syntax that lets you declare an interface with one or more methods that can
    116 take parameters and return values. The parameters and return values can be of any type, even other
    117 AIDL-generated interfaces.</p>
    118 
    119 <p>You must construct the {@code .aidl} file using the Java programming language. Each {@code .aidl}
    120 file must define a single interface and requires only the interface declaration and method
    121 signatures.</p>
    122 
    123 <p>By default, AIDL supports the following data types:</p>
    124 
    125 <ul>
    126   <li>All primitive types in the Java programming language (such as {@code int}, {@code long},
    127 {@code char}, {@code boolean}, and so on)</li>
    128   <li>{@link java.lang.String}</li>
    129   <li>{@link java.lang.CharSequence}</li>
    130   <li>{@link java.util.List}
    131     <p>All elements in the {@link java.util.List} must be one of the supported data types in this
    132 list or one of the other AIDL-generated interfaces or parcelables you've declared. A {@link
    133 java.util.List} may optionally be used as a "generic" class (for example,
    134 <code>List&lt;String&gt;</code>).
    135 The actual concrete class that the other side receives is always an {@link
    136 java.util.ArrayList}, although the method is generated to use the {@link
    137 java.util.List} interface.</p>
    138   </li>
    139   <li>{@link java.util.Map}
    140     <p>All elements in the {@link java.util.Map} must be one of the supported data types in this
    141 list or one of the other AIDL-generated interfaces or parcelables you've declared.  Generic maps,
    142 (such as those of the form
    143 {@code Map&lt;String,Integer&gt;} are not supported. The actual concrete class that the other side
    144 receives is always a {@link java.util.HashMap}, although the method is generated to
    145 use the {@link java.util.Map} interface.</p>
    146   </li>
    147 </ul>
    148 
    149 <p>You must include an {@code import} statement for each additional type not listed above, even if
    150 they are defined in the same package as your interface.</p>
    151 
    152 <p>When defining your service interface, be aware that:</p>
    153 <ul>
    154   <li>Methods can take zero or more parameters, and return a value or void.</li>
    155   <li>All non-primitive parameters require a directional tag indicating which way the data goes.
    156 Either <code>in</code>, <code>out</code>, or <code>inout</code> (see the example below).
    157     <p>Primitives are <code>in</code> by default, and cannot be otherwise.</p>
    158     <p class="caution"><strong>Caution:</strong> You should limit the direction to what is truly
    159 needed, because marshalling parameters is expensive.</p></li>
    160   <li>All code comments included in the {@code .aidl} file are included in the generated {@link
    161 android.os.IBinder} interface (except for comments before the import and package
    162 statements).</li>
    163     <li>Only methods are supported; you cannot expose static fields in AIDL.</li>
    164 </ul>
    165 
    166 <p>Here is an example {@code .aidl} file:</p>
    167 
    168 <pre>
    169 // IRemoteService.aidl
    170 package com.example.android;
    171 
    172 // Declare any non-default types here with import statements
    173 
    174 /** Example service interface */
    175 interface IRemoteService {
    176     /** Request the process ID of this service, to do evil things with it. */
    177     int getPid();
    178 
    179     /** Demonstrates some basic types that you can use as parameters
    180      * and return values in AIDL.
    181      */
    182     void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
    183             double aDouble, String aString);
    184 }
    185 </pre>
    186 
    187 <p>Simply save your {@code .aidl} file in your project's {@code src/} directory and when you
    188 build your application, the SDK tools generate the {@link android.os.IBinder} interface file in your
    189 project's {@code gen/} directory. The generated file name matches the {@code .aidl} file name, but
    190 with a {@code .java} extension (for example, {@code IRemoteService.aidl} results in {@code
    191 IRemoteService.java}).</p>
    192 
    193 <p>If you use Eclipse, the incremental build generates the binder class almost immediately. If you
    194 do not use Eclipse, then the Ant tool generates the binder class next time you build your
    195 application&mdash;you should build your project with <code>ant debug</code> (or <code>ant
    196 release</code>) as soon as you're finished writing the {@code .aidl} file, so that your code can
    197 link against the generated class.</p>
    198 
    199 
    200 <h3 id="Implement">2. Implement the interface</h3>
    201 
    202 <p>When you build your application, the Android SDK tools generate a {@code .java} interface file
    203 named after your {@code .aidl} file. The generated interface includes a subclass named {@code Stub}
    204 that is an abstract implementation of its parent interface (for example, {@code
    205 YourInterface.Stub}) and declares all the methods from the {@code .aidl} file.</p>
    206 
    207 <p class="note"><strong>Note:</strong> {@code Stub} also
    208 defines a few helper methods, most notably {@code asInterface()}, which takes an {@link
    209 android.os.IBinder} (usually the one passed to a client's {@link
    210 android.content.ServiceConnection#onServiceConnected onServiceConnected()} callback method) and
    211 returns an instance of the stub interface. See the section <a href="#Calling">Calling an IPC
    212 Method</a> for more details on how to make this cast.</p>
    213 
    214 <p>To implement the interface generated from the {@code .aidl}, extend the generated {@link
    215 android.os.Binder} interface (for example, {@code YourInterface.Stub}) and implement the methods
    216 inherited from the {@code .aidl} file.</p>
    217 
    218 <p>Here is an example implementation of an interface called {@code IRemoteService} (defined by the
    219 {@code IRemoteService.aidl} example, above) using an anonymous instance:</p>
    220   
    221 <pre>
    222 private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
    223     public int getPid(){
    224         return Process.myPid();
    225     }
    226     public void basicTypes(int anInt, long aLong, boolean aBoolean,
    227         float aFloat, double aDouble, String aString) {
    228         // Does nothing
    229     }
    230 };
    231 </pre>
    232 
    233 <p>Now the {@code mBinder} is an instance of the {@code Stub} class (a {@link android.os.Binder}),
    234 which defines the RPC interface for the service. In the next step, this instance is exposed to
    235 clients so they can interact with the service.</p>
    236 
    237 <p>There are a few rules you should be aware of when implementing your AIDL interface: </p>
    238 <ul>
    239     <li>Incoming calls are not guaranteed to be executed on the main thread, so you need to think
    240 about multithreading from the start and properly build your service to be thread-safe.</li>
    241     <li>By default, RPC calls are synchronous. If you know that the service takes more than a few
    242 milliseconds to complete a request, you should not call it from the activity's main thread, because
    243 it might hang the application (Android might display an &quot;Application is Not Responding&quot;
    244 dialog)&mdash;you should usually call them from a separate thread in the client. </li>
    245     <li>No exceptions that you throw are sent back to the caller.</li>
    246 </ul>
    247 
    248 
    249 <h3 id="Expose">3. Expose the interface to clients</h3>
    250 
    251 <p>Once you've implemented the interface for your service, you need to expose it to
    252 clients so they can bind to it. To expose the interface
    253 for your service, extend {@link android.app.Service Service} and implement {@link
    254 android.app.Service#onBind onBind()} to return an instance of your class that implements
    255 the generated {@code Stub} (as discussed in the previous section). Here's an example
    256 service that exposes the {@code IRemoteService} example interface to clients. </p>
    257 
    258 <pre>
    259 public class RemoteService extends Service {
    260     &#64;Override
    261     public void onCreate() {
    262         super.onCreate();
    263     }
    264 
    265     &#64;Override
    266     public IBinder onBind(Intent intent) {
    267         // Return the interface
    268         return mBinder;
    269     }
    270 
    271     private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
    272         public int getPid(){
    273             return Process.myPid();
    274         }
    275         public void basicTypes(int anInt, long aLong, boolean aBoolean,
    276             float aFloat, double aDouble, String aString) {
    277             // Does nothing
    278         }
    279     };
    280 }
    281 </pre>
    282 
    283 <p>Now, when a client (such as an activity) calls {@link android.content.Context#bindService
    284 bindService()} to connect to this service, the client's {@link
    285 android.content.ServiceConnection#onServiceConnected onServiceConnected()} callback receives the
    286 {@code mBinder} instance returned by the service's {@link android.app.Service#onBind onBind()}
    287 method.</p>
    288 
    289 <p>The client must also have access to the interface class, so if the client and service are in
    290 separate applications, then the client's application must have a copy of the {@code .aidl} file
    291 in its {@code src/} directory (which generates the {@code android.os.Binder}
    292 interface&mdash;providing the client access to the AIDL methods).</p>
    293 
    294 <p>When the client receives the {@link android.os.IBinder} in the {@link
    295 android.content.ServiceConnection#onServiceConnected onServiceConnected()} callback, it must call
    296 <code><em>YourServiceInterface</em>.Stub.asInterface(service)</code> to cast the returned
    297 parameter to <code><em>YourServiceInterface</em></code> type. For example:</p>
    298 
    299 <pre>
    300 IRemoteService mIRemoteService;
    301 private ServiceConnection mConnection = new ServiceConnection() {
    302     // Called when the connection with the service is established
    303     public void onServiceConnected(ComponentName className, IBinder service) {
    304         // Following the example above for an AIDL interface,
    305         // this gets an instance of the IRemoteInterface, which we can use to call on the service
    306         mIRemoteService = IRemoteService.Stub.asInterface(service);
    307     }
    308 
    309     // Called when the connection with the service disconnects unexpectedly
    310     public void onServiceDisconnected(ComponentName className) {
    311         Log.e(TAG, "Service has unexpectedly disconnected");
    312         mIRemoteService = null;
    313     }
    314 };
    315 </pre>
    316 
    317 <p>For more sample code, see the <a
    318 href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code
    319 RemoteService.java}</a> class in <a
    320 href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a>.</p>
    321 
    322 
    323 
    324 
    325 
    326 
    327   
    328 
    329 <h2 id="PassingObjects">Passing Objects over IPC</h2>
    330 
    331 <p>If you have a class that you would like to send from one process to another through
    332 an IPC interface, you can do that. However, you must ensure that the code for your class is
    333 available to the other side of the IPC channel and your class must support the {@link
    334 android.os.Parcelable} interface. Supporting the {@link android.os.Parcelable} interface is
    335 important because it allows the Android system to decompose objects into primitives that can be
    336 marshalled across processes.</p>
    337 
    338 <p>To create a class that supports the {@link android.os.Parcelable} protocol, you must do the
    339 following:</b>
    340 <ol>
    341 <li>Make your class implement the {@link android.os.Parcelable} interface.</li>
    342 <li>Implement {@link android.os.Parcelable#writeToParcel writeToParcel}, which takes the
    343 current state of the object and writes it to a {@link android.os.Parcel}.</li>
    344 <li>Add a static field called <code>CREATOR</code> to your class which is an object implementing
    345 the {@link android.os.Parcelable.Creator Parcelable.Creator} interface.</li>
    346 <li>Finally, create an {@code .aidl} file that declares your parcelable class (as shown for the
    347 {@code Rect.aidl} file, below).
    348   <p>If you are using a custom build process, do <em>not</em> add the {@code .aidl} file to your
    349 build. Similar to a header file in the C language, this {@code .aidl} file isn't compiled.</p></li>
    350 </ol>
    351 
    352 <p>AIDL uses these methods and fields in the code it generates to marshall and unmarshall
    353 your objects.</p>
    354 
    355 <p>For example, here is a {@code Rect.aidl} file to create a {@code Rect} class that's
    356 parcelable:</p>
    357 
    358 <pre>
    359 package android.graphics;
    360 
    361 // Declare Rect so AIDL can find it and knows that it implements
    362 // the parcelable protocol.
    363 parcelable Rect;
    364 </pre>
    365 
    366 <p>And here is an example of how the {@link android.graphics.Rect} class implements the
    367 {@link android.os.Parcelable} protocol.</p>
    368 
    369 <pre>
    370 import android.os.Parcel;
    371 import android.os.Parcelable;
    372 
    373 public final class Rect implements Parcelable {
    374     public int left;
    375     public int top;
    376     public int right;
    377     public int bottom;
    378 
    379     public static final Parcelable.Creator&lt;Rect&gt; CREATOR = new
    380 Parcelable.Creator&lt;Rect&gt;() {
    381         public Rect createFromParcel(Parcel in) {
    382             return new Rect(in);
    383         }
    384 
    385         public Rect[] newArray(int size) {
    386             return new Rect[size];
    387         }
    388     };
    389 
    390     public Rect() {
    391     }
    392 
    393     private Rect(Parcel in) {
    394         readFromParcel(in);
    395     }
    396 
    397     public void writeToParcel(Parcel out) {
    398         out.writeInt(left);
    399         out.writeInt(top);
    400         out.writeInt(right);
    401         out.writeInt(bottom);
    402     }
    403 
    404     public void readFromParcel(Parcel in) {
    405         left = in.readInt();
    406         top = in.readInt();
    407         right = in.readInt();
    408         bottom = in.readInt();
    409     }
    410 }
    411 </pre>
    412 
    413 <p>The marshalling in the {@code Rect} class is pretty simple.  Take a look at the other
    414 methods on {@link android.os.Parcel} to see the other kinds of values you can write
    415 to a Parcel.</p>
    416 
    417 <p class="warning"><strong>Warning:</strong> Don't forget the security implications of receiving
    418 data from other processes.  In this case, the {@code Rect} reads four numbers from the {@link
    419 android.os.Parcel}, but it is up to you to ensure that these are within the acceptable range of
    420 values for whatever the caller is trying to do.  See <a
    421 href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a> for more
    422 information about how to keep your application secure from malware.</p>
    423 
    424 
    425 
    426 <h2 id="Calling">Calling an IPC Method</h2>
    427 
    428 <p>Here are the steps a calling class must take to call a remote interface defined with AIDL: </p>
    429 <ol>
    430     <li>Include the {@code .aidl} file in the project {@code src/} directory.</li>
    431     <li>Declare an instance of the {@link android.os.IBinder} interface (generated based on the
    432 AIDL). </li>
    433     <li>Implement {@link android.content.ServiceConnection ServiceConnection}. </li>
    434     <li>Call {@link
    435 android.content.Context#bindService(android.content.Intent,android.content.ServiceConnection,int)
    436         Context.bindService()}, passing in your {@link
    437 android.content.ServiceConnection} implementation. </li>
    438     <li>In your implementation of {@link
    439 android.content.ServiceConnection#onServiceConnected onServiceConnected()},
    440 you will receive an {@link android.os.IBinder} instance (called <code>service</code>). Call
    441 <code><em>YourInterfaceName</em>.Stub.asInterface((IBinder)<em>service</em>)</code> to
    442         cast the returned parameter to <em>YourInterface</em> type.</li>
    443     <li>Call the methods that you defined on your interface. You should always trap
    444         {@link android.os.DeadObjectException} exceptions, which are thrown when
    445         the connection has broken; this will be the only exception thrown by remote
    446         methods.</li>
    447     <li>To disconnect, call {@link
    448 android.content.Context#unbindService(android.content.ServiceConnection)
    449         Context.unbindService()} with the instance of your interface. </li>
    450 </ol>
    451 <p>A few comments on calling an IPC service:</p>
    452 <ul>
    453     <li>Objects are reference counted across processes. </li>
    454     <li>You can send anonymous objects
    455         as method arguments. </li>
    456 </ul>
    457 
    458 <p>For more information about binding to a service, read the <a
    459 href="{@docRoot}guide/components/bound-services.html#Binding">Bound Services</a>
    460 document.</p>
    461 
    462 <p>Here is some sample code demonstrating calling an AIDL-created service, taken
    463     from the Remote Service sample in the ApiDemos project.</p>
    464 <p>{@sample development/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.java
    465     calling_a_service}</p>
    466