Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.app;
     18 
     19 import android.content.ComponentName;
     20 import android.content.Intent;
     21 import android.content.IIntentReceiver;
     22 import android.content.pm.ActivityInfo;
     23 import android.content.pm.ApplicationInfo;
     24 import android.content.pm.ProviderInfo;
     25 import android.content.pm.ServiceInfo;
     26 import android.content.res.CompatibilityInfo;
     27 import android.content.res.Configuration;
     28 import android.os.Binder;
     29 import android.os.Bundle;
     30 import android.os.Debug;
     31 import android.os.Parcelable;
     32 import android.os.RemoteException;
     33 import android.os.IBinder;
     34 import android.os.Parcel;
     35 import android.os.ParcelFileDescriptor;
     36 
     37 import java.io.FileDescriptor;
     38 import java.io.IOException;
     39 import java.util.HashMap;
     40 import java.util.List;
     41 import java.util.Map;
     42 
     43 /** {@hide} */
     44 public abstract class ApplicationThreadNative extends Binder
     45         implements IApplicationThread {
     46     /**
     47      * Cast a Binder object into an application thread interface, generating
     48      * a proxy if needed.
     49      */
     50     static public IApplicationThread asInterface(IBinder obj) {
     51         if (obj == null) {
     52             return null;
     53         }
     54         IApplicationThread in =
     55             (IApplicationThread)obj.queryLocalInterface(descriptor);
     56         if (in != null) {
     57             return in;
     58         }
     59 
     60         return new ApplicationThreadProxy(obj);
     61     }
     62 
     63     public ApplicationThreadNative() {
     64         attachInterface(this, descriptor);
     65     }
     66 
     67     @Override
     68     public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
     69             throws RemoteException {
     70         switch (code) {
     71         case SCHEDULE_PAUSE_ACTIVITY_TRANSACTION:
     72         {
     73             data.enforceInterface(IApplicationThread.descriptor);
     74             IBinder b = data.readStrongBinder();
     75             boolean finished = data.readInt() != 0;
     76             boolean userLeaving = data.readInt() != 0;
     77             int configChanges = data.readInt();
     78             schedulePauseActivity(b, finished, userLeaving, configChanges);
     79             return true;
     80         }
     81 
     82         case SCHEDULE_STOP_ACTIVITY_TRANSACTION:
     83         {
     84             data.enforceInterface(IApplicationThread.descriptor);
     85             IBinder b = data.readStrongBinder();
     86             boolean show = data.readInt() != 0;
     87             int configChanges = data.readInt();
     88             scheduleStopActivity(b, show, configChanges);
     89             return true;
     90         }
     91 
     92         case SCHEDULE_WINDOW_VISIBILITY_TRANSACTION:
     93         {
     94             data.enforceInterface(IApplicationThread.descriptor);
     95             IBinder b = data.readStrongBinder();
     96             boolean show = data.readInt() != 0;
     97             scheduleWindowVisibility(b, show);
     98             return true;
     99         }
    100 
    101         case SCHEDULE_SLEEPING_TRANSACTION:
    102         {
    103             data.enforceInterface(IApplicationThread.descriptor);
    104             IBinder b = data.readStrongBinder();
    105             boolean sleeping = data.readInt() != 0;
    106             scheduleSleeping(b, sleeping);
    107             return true;
    108         }
    109 
    110         case SCHEDULE_RESUME_ACTIVITY_TRANSACTION:
    111         {
    112             data.enforceInterface(IApplicationThread.descriptor);
    113             IBinder b = data.readStrongBinder();
    114             boolean isForward = data.readInt() != 0;
    115             scheduleResumeActivity(b, isForward);
    116             return true;
    117         }
    118 
    119         case SCHEDULE_SEND_RESULT_TRANSACTION:
    120         {
    121             data.enforceInterface(IApplicationThread.descriptor);
    122             IBinder b = data.readStrongBinder();
    123             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
    124             scheduleSendResult(b, ri);
    125             return true;
    126         }
    127 
    128         case SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION:
    129         {
    130             data.enforceInterface(IApplicationThread.descriptor);
    131             Intent intent = Intent.CREATOR.createFromParcel(data);
    132             IBinder b = data.readStrongBinder();
    133             int ident = data.readInt();
    134             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
    135             Configuration curConfig = Configuration.CREATOR.createFromParcel(data);
    136             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
    137             Bundle state = data.readBundle();
    138             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
    139             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
    140             boolean notResumed = data.readInt() != 0;
    141             boolean isForward = data.readInt() != 0;
    142             String profileName = data.readString();
    143             ParcelFileDescriptor profileFd = data.readInt() != 0
    144                     ? data.readFileDescriptor() : null;
    145             boolean autoStopProfiler = data.readInt() != 0;
    146             scheduleLaunchActivity(intent, b, ident, info, curConfig, compatInfo, state, ri, pi,
    147                     notResumed, isForward, profileName, profileFd, autoStopProfiler);
    148             return true;
    149         }
    150 
    151         case SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION:
    152         {
    153             data.enforceInterface(IApplicationThread.descriptor);
    154             IBinder b = data.readStrongBinder();
    155             List<ResultInfo> ri = data.createTypedArrayList(ResultInfo.CREATOR);
    156             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
    157             int configChanges = data.readInt();
    158             boolean notResumed = data.readInt() != 0;
    159             Configuration config = null;
    160             if (data.readInt() != 0) {
    161                 config = Configuration.CREATOR.createFromParcel(data);
    162             }
    163             scheduleRelaunchActivity(b, ri, pi, configChanges, notResumed, config);
    164             return true;
    165         }
    166 
    167         case SCHEDULE_NEW_INTENT_TRANSACTION:
    168         {
    169             data.enforceInterface(IApplicationThread.descriptor);
    170             List<Intent> pi = data.createTypedArrayList(Intent.CREATOR);
    171             IBinder b = data.readStrongBinder();
    172             scheduleNewIntent(pi, b);
    173             return true;
    174         }
    175 
    176         case SCHEDULE_FINISH_ACTIVITY_TRANSACTION:
    177         {
    178             data.enforceInterface(IApplicationThread.descriptor);
    179             IBinder b = data.readStrongBinder();
    180             boolean finishing = data.readInt() != 0;
    181             int configChanges = data.readInt();
    182             scheduleDestroyActivity(b, finishing, configChanges);
    183             return true;
    184         }
    185 
    186         case SCHEDULE_RECEIVER_TRANSACTION:
    187         {
    188             data.enforceInterface(IApplicationThread.descriptor);
    189             Intent intent = Intent.CREATOR.createFromParcel(data);
    190             ActivityInfo info = ActivityInfo.CREATOR.createFromParcel(data);
    191             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
    192             int resultCode = data.readInt();
    193             String resultData = data.readString();
    194             Bundle resultExtras = data.readBundle();
    195             boolean sync = data.readInt() != 0;
    196             scheduleReceiver(intent, info, compatInfo, resultCode, resultData,
    197                     resultExtras, sync);
    198             return true;
    199         }
    200 
    201         case SCHEDULE_CREATE_SERVICE_TRANSACTION: {
    202             data.enforceInterface(IApplicationThread.descriptor);
    203             IBinder token = data.readStrongBinder();
    204             ServiceInfo info = ServiceInfo.CREATOR.createFromParcel(data);
    205             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
    206             scheduleCreateService(token, info, compatInfo);
    207             return true;
    208         }
    209 
    210         case SCHEDULE_BIND_SERVICE_TRANSACTION: {
    211             data.enforceInterface(IApplicationThread.descriptor);
    212             IBinder token = data.readStrongBinder();
    213             Intent intent = Intent.CREATOR.createFromParcel(data);
    214             boolean rebind = data.readInt() != 0;
    215             scheduleBindService(token, intent, rebind);
    216             return true;
    217         }
    218 
    219         case SCHEDULE_UNBIND_SERVICE_TRANSACTION: {
    220             data.enforceInterface(IApplicationThread.descriptor);
    221             IBinder token = data.readStrongBinder();
    222             Intent intent = Intent.CREATOR.createFromParcel(data);
    223             scheduleUnbindService(token, intent);
    224             return true;
    225         }
    226 
    227         case SCHEDULE_SERVICE_ARGS_TRANSACTION:
    228         {
    229             data.enforceInterface(IApplicationThread.descriptor);
    230             IBinder token = data.readStrongBinder();
    231             boolean taskRemoved = data.readInt() != 0;
    232             int startId = data.readInt();
    233             int fl = data.readInt();
    234             Intent args;
    235             if (data.readInt() != 0) {
    236                 args = Intent.CREATOR.createFromParcel(data);
    237             } else {
    238                 args = null;
    239             }
    240             scheduleServiceArgs(token, taskRemoved, startId, fl, args);
    241             return true;
    242         }
    243 
    244         case SCHEDULE_STOP_SERVICE_TRANSACTION:
    245         {
    246             data.enforceInterface(IApplicationThread.descriptor);
    247             IBinder token = data.readStrongBinder();
    248             scheduleStopService(token);
    249             return true;
    250         }
    251 
    252         case BIND_APPLICATION_TRANSACTION:
    253         {
    254             data.enforceInterface(IApplicationThread.descriptor);
    255             String packageName = data.readString();
    256             ApplicationInfo info =
    257                 ApplicationInfo.CREATOR.createFromParcel(data);
    258             List<ProviderInfo> providers =
    259                 data.createTypedArrayList(ProviderInfo.CREATOR);
    260             ComponentName testName = (data.readInt() != 0)
    261                 ? new ComponentName(data) : null;
    262             String profileName = data.readString();
    263             ParcelFileDescriptor profileFd = data.readInt() != 0
    264                     ? data.readFileDescriptor() : null;
    265             boolean autoStopProfiler = data.readInt() != 0;
    266             Bundle testArgs = data.readBundle();
    267             IBinder binder = data.readStrongBinder();
    268             IInstrumentationWatcher testWatcher = IInstrumentationWatcher.Stub.asInterface(binder);
    269             int testMode = data.readInt();
    270             boolean openGlTrace = data.readInt() != 0;
    271             boolean restrictedBackupMode = (data.readInt() != 0);
    272             boolean persistent = (data.readInt() != 0);
    273             Configuration config = Configuration.CREATOR.createFromParcel(data);
    274             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
    275             HashMap<String, IBinder> services = data.readHashMap(null);
    276             Bundle coreSettings = data.readBundle();
    277             bindApplication(packageName, info,
    278                             providers, testName, profileName, profileFd, autoStopProfiler,
    279                             testArgs, testWatcher, testMode, openGlTrace, restrictedBackupMode,
    280                             persistent, config, compatInfo, services, coreSettings);
    281             return true;
    282         }
    283 
    284         case SCHEDULE_EXIT_TRANSACTION:
    285         {
    286             data.enforceInterface(IApplicationThread.descriptor);
    287             scheduleExit();
    288             return true;
    289         }
    290 
    291         case SCHEDULE_SUICIDE_TRANSACTION:
    292         {
    293             data.enforceInterface(IApplicationThread.descriptor);
    294             scheduleSuicide();
    295             return true;
    296         }
    297 
    298         case REQUEST_THUMBNAIL_TRANSACTION:
    299         {
    300             data.enforceInterface(IApplicationThread.descriptor);
    301             IBinder b = data.readStrongBinder();
    302             requestThumbnail(b);
    303             return true;
    304         }
    305 
    306         case SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION:
    307         {
    308             data.enforceInterface(IApplicationThread.descriptor);
    309             Configuration config = Configuration.CREATOR.createFromParcel(data);
    310             scheduleConfigurationChanged(config);
    311             return true;
    312         }
    313 
    314         case UPDATE_TIME_ZONE_TRANSACTION: {
    315             data.enforceInterface(IApplicationThread.descriptor);
    316             updateTimeZone();
    317             return true;
    318         }
    319 
    320         case CLEAR_DNS_CACHE_TRANSACTION: {
    321             data.enforceInterface(IApplicationThread.descriptor);
    322             clearDnsCache();
    323             return true;
    324         }
    325 
    326         case SET_HTTP_PROXY_TRANSACTION: {
    327             data.enforceInterface(IApplicationThread.descriptor);
    328             final String proxy = data.readString();
    329             final String port = data.readString();
    330             final String exclList = data.readString();
    331             setHttpProxy(proxy, port, exclList);
    332             return true;
    333         }
    334 
    335         case PROCESS_IN_BACKGROUND_TRANSACTION: {
    336             data.enforceInterface(IApplicationThread.descriptor);
    337             processInBackground();
    338             return true;
    339         }
    340 
    341         case DUMP_SERVICE_TRANSACTION: {
    342             data.enforceInterface(IApplicationThread.descriptor);
    343             ParcelFileDescriptor fd = data.readFileDescriptor();
    344             final IBinder service = data.readStrongBinder();
    345             final String[] args = data.readStringArray();
    346             if (fd != null) {
    347                 dumpService(fd.getFileDescriptor(), service, args);
    348                 try {
    349                     fd.close();
    350                 } catch (IOException e) {
    351                 }
    352             }
    353             return true;
    354         }
    355 
    356         case DUMP_PROVIDER_TRANSACTION: {
    357             data.enforceInterface(IApplicationThread.descriptor);
    358             ParcelFileDescriptor fd = data.readFileDescriptor();
    359             final IBinder service = data.readStrongBinder();
    360             final String[] args = data.readStringArray();
    361             if (fd != null) {
    362                 dumpProvider(fd.getFileDescriptor(), service, args);
    363                 try {
    364                     fd.close();
    365                 } catch (IOException e) {
    366                 }
    367             }
    368             return true;
    369         }
    370 
    371         case SCHEDULE_REGISTERED_RECEIVER_TRANSACTION: {
    372             data.enforceInterface(IApplicationThread.descriptor);
    373             IIntentReceiver receiver = IIntentReceiver.Stub.asInterface(
    374                     data.readStrongBinder());
    375             Intent intent = Intent.CREATOR.createFromParcel(data);
    376             int resultCode = data.readInt();
    377             String dataStr = data.readString();
    378             Bundle extras = data.readBundle();
    379             boolean ordered = data.readInt() != 0;
    380             boolean sticky = data.readInt() != 0;
    381             scheduleRegisteredReceiver(receiver, intent,
    382                     resultCode, dataStr, extras, ordered, sticky);
    383             return true;
    384         }
    385 
    386         case SCHEDULE_LOW_MEMORY_TRANSACTION:
    387         {
    388             scheduleLowMemory();
    389             return true;
    390         }
    391 
    392         case SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION:
    393         {
    394             data.enforceInterface(IApplicationThread.descriptor);
    395             IBinder b = data.readStrongBinder();
    396             scheduleActivityConfigurationChanged(b);
    397             return true;
    398         }
    399 
    400         case PROFILER_CONTROL_TRANSACTION:
    401         {
    402             data.enforceInterface(IApplicationThread.descriptor);
    403             boolean start = data.readInt() != 0;
    404             int profileType = data.readInt();
    405             String path = data.readString();
    406             ParcelFileDescriptor fd = data.readInt() != 0
    407                     ? data.readFileDescriptor() : null;
    408             profilerControl(start, path, fd, profileType);
    409             return true;
    410         }
    411 
    412         case SET_SCHEDULING_GROUP_TRANSACTION:
    413         {
    414             data.enforceInterface(IApplicationThread.descriptor);
    415             int group = data.readInt();
    416             setSchedulingGroup(group);
    417             return true;
    418         }
    419 
    420         case SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION:
    421         {
    422             data.enforceInterface(IApplicationThread.descriptor);
    423             ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(data);
    424             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
    425             int backupMode = data.readInt();
    426             scheduleCreateBackupAgent(appInfo, compatInfo, backupMode);
    427             return true;
    428         }
    429 
    430         case SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION:
    431         {
    432             data.enforceInterface(IApplicationThread.descriptor);
    433             ApplicationInfo appInfo = ApplicationInfo.CREATOR.createFromParcel(data);
    434             CompatibilityInfo compatInfo = CompatibilityInfo.CREATOR.createFromParcel(data);
    435             scheduleDestroyBackupAgent(appInfo, compatInfo);
    436             return true;
    437         }
    438 
    439         case GET_MEMORY_INFO_TRANSACTION:
    440         {
    441             data.enforceInterface(IApplicationThread.descriptor);
    442             Debug.MemoryInfo mi = new Debug.MemoryInfo();
    443             getMemoryInfo(mi);
    444             reply.writeNoException();
    445             mi.writeToParcel(reply, 0);
    446             return true;
    447         }
    448 
    449         case DISPATCH_PACKAGE_BROADCAST_TRANSACTION:
    450         {
    451             data.enforceInterface(IApplicationThread.descriptor);
    452             int cmd = data.readInt();
    453             String[] packages = data.readStringArray();
    454             dispatchPackageBroadcast(cmd, packages);
    455             return true;
    456         }
    457 
    458         case SCHEDULE_CRASH_TRANSACTION:
    459         {
    460             data.enforceInterface(IApplicationThread.descriptor);
    461             String msg = data.readString();
    462             scheduleCrash(msg);
    463             return true;
    464         }
    465 
    466         case DUMP_HEAP_TRANSACTION:
    467         {
    468             data.enforceInterface(IApplicationThread.descriptor);
    469             boolean managed = data.readInt() != 0;
    470             String path = data.readString();
    471             ParcelFileDescriptor fd = data.readInt() != 0
    472                     ? data.readFileDescriptor() : null;
    473             dumpHeap(managed, path, fd);
    474             return true;
    475         }
    476 
    477         case DUMP_ACTIVITY_TRANSACTION: {
    478             data.enforceInterface(IApplicationThread.descriptor);
    479             ParcelFileDescriptor fd = data.readFileDescriptor();
    480             final IBinder activity = data.readStrongBinder();
    481             final String prefix = data.readString();
    482             final String[] args = data.readStringArray();
    483             if (fd != null) {
    484                 dumpActivity(fd.getFileDescriptor(), activity, prefix, args);
    485                 try {
    486                     fd.close();
    487                 } catch (IOException e) {
    488                 }
    489             }
    490             return true;
    491         }
    492 
    493         case SET_CORE_SETTINGS_TRANSACTION: {
    494             data.enforceInterface(IApplicationThread.descriptor);
    495             Bundle settings = data.readBundle();
    496             setCoreSettings(settings);
    497             return true;
    498         }
    499 
    500         case UPDATE_PACKAGE_COMPATIBILITY_INFO_TRANSACTION: {
    501             data.enforceInterface(IApplicationThread.descriptor);
    502             String pkg = data.readString();
    503             CompatibilityInfo compat = CompatibilityInfo.CREATOR.createFromParcel(data);
    504             updatePackageCompatibilityInfo(pkg, compat);
    505             return true;
    506         }
    507 
    508         case SCHEDULE_TRIM_MEMORY_TRANSACTION: {
    509             data.enforceInterface(IApplicationThread.descriptor);
    510             int level = data.readInt();
    511             scheduleTrimMemory(level);
    512             return true;
    513         }
    514 
    515         case DUMP_MEM_INFO_TRANSACTION:
    516         {
    517             data.enforceInterface(IApplicationThread.descriptor);
    518             ParcelFileDescriptor fd = data.readFileDescriptor();
    519             boolean checkin = data.readInt() != 0;
    520             boolean all = data.readInt() != 0;
    521             String[] args = data.readStringArray();
    522             Debug.MemoryInfo mi = null;
    523             if (fd != null) {
    524                 try {
    525                     mi = dumpMemInfo(fd.getFileDescriptor(), checkin, all, args);
    526                 } finally {
    527                     try {
    528                         fd.close();
    529                     } catch (IOException e) {
    530                         // swallowed, not propagated back to the caller
    531                     }
    532                 }
    533             }
    534             reply.writeNoException();
    535             mi.writeToParcel(reply, 0);
    536             return true;
    537         }
    538 
    539         case DUMP_GFX_INFO_TRANSACTION:
    540         {
    541             data.enforceInterface(IApplicationThread.descriptor);
    542             ParcelFileDescriptor fd = data.readFileDescriptor();
    543             String[] args = data.readStringArray();
    544             if (fd != null) {
    545                 try {
    546                     dumpGfxInfo(fd.getFileDescriptor(), args);
    547                 } finally {
    548                     try {
    549                         fd.close();
    550                     } catch (IOException e) {
    551                         // swallowed, not propagated back to the caller
    552                     }
    553                 }
    554             }
    555             reply.writeNoException();
    556             return true;
    557         }
    558 
    559         case DUMP_DB_INFO_TRANSACTION:
    560         {
    561             data.enforceInterface(IApplicationThread.descriptor);
    562             ParcelFileDescriptor fd = data.readFileDescriptor();
    563             String[] args = data.readStringArray();
    564             if (fd != null) {
    565                 try {
    566                     dumpDbInfo(fd.getFileDescriptor(), args);
    567                 } finally {
    568                     try {
    569                         fd.close();
    570                     } catch (IOException e) {
    571                         // swallowed, not propagated back to the caller
    572                     }
    573                 }
    574             }
    575             reply.writeNoException();
    576             return true;
    577         }
    578 
    579         case UNSTABLE_PROVIDER_DIED_TRANSACTION:
    580         {
    581             data.enforceInterface(IApplicationThread.descriptor);
    582             IBinder provider = data.readStrongBinder();
    583             unstableProviderDied(provider);
    584             reply.writeNoException();
    585             return true;
    586         }
    587         }
    588 
    589         return super.onTransact(code, data, reply, flags);
    590     }
    591 
    592     public IBinder asBinder()
    593     {
    594         return this;
    595     }
    596 }
    597 
    598 class ApplicationThreadProxy implements IApplicationThread {
    599     private final IBinder mRemote;
    600 
    601     public ApplicationThreadProxy(IBinder remote) {
    602         mRemote = remote;
    603     }
    604 
    605     public final IBinder asBinder() {
    606         return mRemote;
    607     }
    608 
    609     public final void schedulePauseActivity(IBinder token, boolean finished,
    610             boolean userLeaving, int configChanges) throws RemoteException {
    611         Parcel data = Parcel.obtain();
    612         data.writeInterfaceToken(IApplicationThread.descriptor);
    613         data.writeStrongBinder(token);
    614         data.writeInt(finished ? 1 : 0);
    615         data.writeInt(userLeaving ? 1 :0);
    616         data.writeInt(configChanges);
    617         mRemote.transact(SCHEDULE_PAUSE_ACTIVITY_TRANSACTION, data, null,
    618                 IBinder.FLAG_ONEWAY);
    619         data.recycle();
    620     }
    621 
    622     public final void scheduleStopActivity(IBinder token, boolean showWindow,
    623             int configChanges) throws RemoteException {
    624         Parcel data = Parcel.obtain();
    625         data.writeInterfaceToken(IApplicationThread.descriptor);
    626         data.writeStrongBinder(token);
    627         data.writeInt(showWindow ? 1 : 0);
    628         data.writeInt(configChanges);
    629         mRemote.transact(SCHEDULE_STOP_ACTIVITY_TRANSACTION, data, null,
    630                 IBinder.FLAG_ONEWAY);
    631         data.recycle();
    632     }
    633 
    634     public final void scheduleWindowVisibility(IBinder token,
    635             boolean showWindow) throws RemoteException {
    636         Parcel data = Parcel.obtain();
    637         data.writeInterfaceToken(IApplicationThread.descriptor);
    638         data.writeStrongBinder(token);
    639         data.writeInt(showWindow ? 1 : 0);
    640         mRemote.transact(SCHEDULE_WINDOW_VISIBILITY_TRANSACTION, data, null,
    641                 IBinder.FLAG_ONEWAY);
    642         data.recycle();
    643     }
    644 
    645     public final void scheduleSleeping(IBinder token,
    646             boolean sleeping) throws RemoteException {
    647         Parcel data = Parcel.obtain();
    648         data.writeInterfaceToken(IApplicationThread.descriptor);
    649         data.writeStrongBinder(token);
    650         data.writeInt(sleeping ? 1 : 0);
    651         mRemote.transact(SCHEDULE_SLEEPING_TRANSACTION, data, null,
    652                 IBinder.FLAG_ONEWAY);
    653         data.recycle();
    654     }
    655 
    656     public final void scheduleResumeActivity(IBinder token, boolean isForward)
    657             throws RemoteException {
    658         Parcel data = Parcel.obtain();
    659         data.writeInterfaceToken(IApplicationThread.descriptor);
    660         data.writeStrongBinder(token);
    661         data.writeInt(isForward ? 1 : 0);
    662         mRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null,
    663                 IBinder.FLAG_ONEWAY);
    664         data.recycle();
    665     }
    666 
    667     public final void scheduleSendResult(IBinder token, List<ResultInfo> results)
    668     		throws RemoteException {
    669         Parcel data = Parcel.obtain();
    670         data.writeInterfaceToken(IApplicationThread.descriptor);
    671         data.writeStrongBinder(token);
    672         data.writeTypedList(results);
    673         mRemote.transact(SCHEDULE_SEND_RESULT_TRANSACTION, data, null,
    674                 IBinder.FLAG_ONEWAY);
    675         data.recycle();
    676     }
    677 
    678     public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
    679             ActivityInfo info, Configuration curConfig, CompatibilityInfo compatInfo,
    680             Bundle state, List<ResultInfo> pendingResults,
    681     		List<Intent> pendingNewIntents, boolean notResumed, boolean isForward,
    682     		String profileName, ParcelFileDescriptor profileFd, boolean autoStopProfiler)
    683     		throws RemoteException {
    684         Parcel data = Parcel.obtain();
    685         data.writeInterfaceToken(IApplicationThread.descriptor);
    686         intent.writeToParcel(data, 0);
    687         data.writeStrongBinder(token);
    688         data.writeInt(ident);
    689         info.writeToParcel(data, 0);
    690         curConfig.writeToParcel(data, 0);
    691         compatInfo.writeToParcel(data, 0);
    692         data.writeBundle(state);
    693         data.writeTypedList(pendingResults);
    694         data.writeTypedList(pendingNewIntents);
    695         data.writeInt(notResumed ? 1 : 0);
    696         data.writeInt(isForward ? 1 : 0);
    697         data.writeString(profileName);
    698         if (profileFd != null) {
    699             data.writeInt(1);
    700             profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
    701         } else {
    702             data.writeInt(0);
    703         }
    704         data.writeInt(autoStopProfiler ? 1 : 0);
    705         mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
    706                 IBinder.FLAG_ONEWAY);
    707         data.recycle();
    708     }
    709 
    710     public final void scheduleRelaunchActivity(IBinder token,
    711             List<ResultInfo> pendingResults, List<Intent> pendingNewIntents,
    712             int configChanges, boolean notResumed, Configuration config)
    713             throws RemoteException {
    714         Parcel data = Parcel.obtain();
    715         data.writeInterfaceToken(IApplicationThread.descriptor);
    716         data.writeStrongBinder(token);
    717         data.writeTypedList(pendingResults);
    718         data.writeTypedList(pendingNewIntents);
    719         data.writeInt(configChanges);
    720         data.writeInt(notResumed ? 1 : 0);
    721         if (config != null) {
    722             data.writeInt(1);
    723             config.writeToParcel(data, 0);
    724         } else {
    725             data.writeInt(0);
    726         }
    727         mRemote.transact(SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION, data, null,
    728                 IBinder.FLAG_ONEWAY);
    729         data.recycle();
    730     }
    731 
    732     public void scheduleNewIntent(List<Intent> intents, IBinder token)
    733             throws RemoteException {
    734         Parcel data = Parcel.obtain();
    735         data.writeInterfaceToken(IApplicationThread.descriptor);
    736         data.writeTypedList(intents);
    737         data.writeStrongBinder(token);
    738         mRemote.transact(SCHEDULE_NEW_INTENT_TRANSACTION, data, null,
    739                 IBinder.FLAG_ONEWAY);
    740         data.recycle();
    741     }
    742 
    743     public final void scheduleDestroyActivity(IBinder token, boolean finishing,
    744             int configChanges) throws RemoteException {
    745         Parcel data = Parcel.obtain();
    746         data.writeInterfaceToken(IApplicationThread.descriptor);
    747         data.writeStrongBinder(token);
    748         data.writeInt(finishing ? 1 : 0);
    749         data.writeInt(configChanges);
    750         mRemote.transact(SCHEDULE_FINISH_ACTIVITY_TRANSACTION, data, null,
    751                 IBinder.FLAG_ONEWAY);
    752         data.recycle();
    753     }
    754 
    755     public final void scheduleReceiver(Intent intent, ActivityInfo info,
    756             CompatibilityInfo compatInfo, int resultCode, String resultData,
    757             Bundle map, boolean sync) throws RemoteException {
    758         Parcel data = Parcel.obtain();
    759         data.writeInterfaceToken(IApplicationThread.descriptor);
    760         intent.writeToParcel(data, 0);
    761         info.writeToParcel(data, 0);
    762         compatInfo.writeToParcel(data, 0);
    763         data.writeInt(resultCode);
    764         data.writeString(resultData);
    765         data.writeBundle(map);
    766         data.writeInt(sync ? 1 : 0);
    767         mRemote.transact(SCHEDULE_RECEIVER_TRANSACTION, data, null,
    768                 IBinder.FLAG_ONEWAY);
    769         data.recycle();
    770     }
    771 
    772     public final void scheduleCreateBackupAgent(ApplicationInfo app,
    773             CompatibilityInfo compatInfo, int backupMode) throws RemoteException {
    774         Parcel data = Parcel.obtain();
    775         data.writeInterfaceToken(IApplicationThread.descriptor);
    776         app.writeToParcel(data, 0);
    777         compatInfo.writeToParcel(data, 0);
    778         data.writeInt(backupMode);
    779         mRemote.transact(SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION, data, null,
    780                 IBinder.FLAG_ONEWAY);
    781         data.recycle();
    782     }
    783 
    784     public final void scheduleDestroyBackupAgent(ApplicationInfo app,
    785             CompatibilityInfo compatInfo) throws RemoteException {
    786         Parcel data = Parcel.obtain();
    787         data.writeInterfaceToken(IApplicationThread.descriptor);
    788         app.writeToParcel(data, 0);
    789         compatInfo.writeToParcel(data, 0);
    790         mRemote.transact(SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION, data, null,
    791                 IBinder.FLAG_ONEWAY);
    792         data.recycle();
    793     }
    794 
    795     public final void scheduleCreateService(IBinder token, ServiceInfo info,
    796             CompatibilityInfo compatInfo) throws RemoteException {
    797         Parcel data = Parcel.obtain();
    798         data.writeInterfaceToken(IApplicationThread.descriptor);
    799         data.writeStrongBinder(token);
    800         info.writeToParcel(data, 0);
    801         compatInfo.writeToParcel(data, 0);
    802         mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION, data, null,
    803                 IBinder.FLAG_ONEWAY);
    804         data.recycle();
    805     }
    806 
    807     public final void scheduleBindService(IBinder token, Intent intent, boolean rebind)
    808             throws RemoteException {
    809         Parcel data = Parcel.obtain();
    810         data.writeInterfaceToken(IApplicationThread.descriptor);
    811         data.writeStrongBinder(token);
    812         intent.writeToParcel(data, 0);
    813         data.writeInt(rebind ? 1 : 0);
    814         mRemote.transact(SCHEDULE_BIND_SERVICE_TRANSACTION, data, null,
    815                 IBinder.FLAG_ONEWAY);
    816         data.recycle();
    817     }
    818 
    819     public final void scheduleUnbindService(IBinder token, Intent intent)
    820             throws RemoteException {
    821         Parcel data = Parcel.obtain();
    822         data.writeInterfaceToken(IApplicationThread.descriptor);
    823         data.writeStrongBinder(token);
    824         intent.writeToParcel(data, 0);
    825         mRemote.transact(SCHEDULE_UNBIND_SERVICE_TRANSACTION, data, null,
    826                 IBinder.FLAG_ONEWAY);
    827         data.recycle();
    828     }
    829 
    830     public final void scheduleServiceArgs(IBinder token, boolean taskRemoved, int startId,
    831 	    int flags, Intent args) throws RemoteException {
    832         Parcel data = Parcel.obtain();
    833         data.writeInterfaceToken(IApplicationThread.descriptor);
    834         data.writeStrongBinder(token);
    835         data.writeInt(taskRemoved ? 1 : 0);
    836         data.writeInt(startId);
    837         data.writeInt(flags);
    838         if (args != null) {
    839             data.writeInt(1);
    840             args.writeToParcel(data, 0);
    841         } else {
    842             data.writeInt(0);
    843         }
    844         mRemote.transact(SCHEDULE_SERVICE_ARGS_TRANSACTION, data, null,
    845                 IBinder.FLAG_ONEWAY);
    846         data.recycle();
    847     }
    848 
    849     public final void scheduleStopService(IBinder token)
    850             throws RemoteException {
    851         Parcel data = Parcel.obtain();
    852         data.writeInterfaceToken(IApplicationThread.descriptor);
    853         data.writeStrongBinder(token);
    854         mRemote.transact(SCHEDULE_STOP_SERVICE_TRANSACTION, data, null,
    855                 IBinder.FLAG_ONEWAY);
    856         data.recycle();
    857     }
    858 
    859     public final void bindApplication(String packageName, ApplicationInfo info,
    860             List<ProviderInfo> providers, ComponentName testName, String profileName,
    861             ParcelFileDescriptor profileFd, boolean autoStopProfiler, Bundle testArgs,
    862             IInstrumentationWatcher testWatcher, int debugMode, boolean openGlTrace,
    863             boolean restrictedBackupMode, boolean persistent,
    864             Configuration config, CompatibilityInfo compatInfo,
    865             Map<String, IBinder> services, Bundle coreSettings) throws RemoteException {
    866         Parcel data = Parcel.obtain();
    867         data.writeInterfaceToken(IApplicationThread.descriptor);
    868         data.writeString(packageName);
    869         info.writeToParcel(data, 0);
    870         data.writeTypedList(providers);
    871         if (testName == null) {
    872             data.writeInt(0);
    873         } else {
    874             data.writeInt(1);
    875             testName.writeToParcel(data, 0);
    876         }
    877         data.writeString(profileName);
    878         if (profileFd != null) {
    879             data.writeInt(1);
    880             profileFd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
    881         } else {
    882             data.writeInt(0);
    883         }
    884         data.writeInt(autoStopProfiler ? 1 : 0);
    885         data.writeBundle(testArgs);
    886         data.writeStrongInterface(testWatcher);
    887         data.writeInt(debugMode);
    888         data.writeInt(openGlTrace ? 1 : 0);
    889         data.writeInt(restrictedBackupMode ? 1 : 0);
    890         data.writeInt(persistent ? 1 : 0);
    891         config.writeToParcel(data, 0);
    892         compatInfo.writeToParcel(data, 0);
    893         data.writeMap(services);
    894         data.writeBundle(coreSettings);
    895         mRemote.transact(BIND_APPLICATION_TRANSACTION, data, null,
    896                 IBinder.FLAG_ONEWAY);
    897         data.recycle();
    898     }
    899 
    900     public final void scheduleExit() throws RemoteException {
    901         Parcel data = Parcel.obtain();
    902         data.writeInterfaceToken(IApplicationThread.descriptor);
    903         mRemote.transact(SCHEDULE_EXIT_TRANSACTION, data, null,
    904                 IBinder.FLAG_ONEWAY);
    905         data.recycle();
    906     }
    907 
    908     public final void scheduleSuicide() throws RemoteException {
    909         Parcel data = Parcel.obtain();
    910         data.writeInterfaceToken(IApplicationThread.descriptor);
    911         mRemote.transact(SCHEDULE_SUICIDE_TRANSACTION, data, null,
    912                 IBinder.FLAG_ONEWAY);
    913         data.recycle();
    914     }
    915 
    916     public final void requestThumbnail(IBinder token)
    917             throws RemoteException {
    918         Parcel data = Parcel.obtain();
    919         data.writeInterfaceToken(IApplicationThread.descriptor);
    920         data.writeStrongBinder(token);
    921         mRemote.transact(REQUEST_THUMBNAIL_TRANSACTION, data, null,
    922                 IBinder.FLAG_ONEWAY);
    923         data.recycle();
    924     }
    925 
    926     public final void scheduleConfigurationChanged(Configuration config)
    927             throws RemoteException {
    928         Parcel data = Parcel.obtain();
    929         data.writeInterfaceToken(IApplicationThread.descriptor);
    930         config.writeToParcel(data, 0);
    931         mRemote.transact(SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION, data, null,
    932                 IBinder.FLAG_ONEWAY);
    933         data.recycle();
    934     }
    935 
    936     public void updateTimeZone() throws RemoteException {
    937         Parcel data = Parcel.obtain();
    938         data.writeInterfaceToken(IApplicationThread.descriptor);
    939         mRemote.transact(UPDATE_TIME_ZONE_TRANSACTION, data, null,
    940                 IBinder.FLAG_ONEWAY);
    941         data.recycle();
    942     }
    943 
    944     public void clearDnsCache() throws RemoteException {
    945         Parcel data = Parcel.obtain();
    946         data.writeInterfaceToken(IApplicationThread.descriptor);
    947         mRemote.transact(CLEAR_DNS_CACHE_TRANSACTION, data, null,
    948                 IBinder.FLAG_ONEWAY);
    949         data.recycle();
    950     }
    951 
    952     public void setHttpProxy(String proxy, String port, String exclList) throws RemoteException {
    953         Parcel data = Parcel.obtain();
    954         data.writeInterfaceToken(IApplicationThread.descriptor);
    955         data.writeString(proxy);
    956         data.writeString(port);
    957         data.writeString(exclList);
    958         mRemote.transact(SET_HTTP_PROXY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
    959         data.recycle();
    960     }
    961 
    962     public void processInBackground() throws RemoteException {
    963         Parcel data = Parcel.obtain();
    964         data.writeInterfaceToken(IApplicationThread.descriptor);
    965         mRemote.transact(PROCESS_IN_BACKGROUND_TRANSACTION, data, null,
    966                 IBinder.FLAG_ONEWAY);
    967         data.recycle();
    968     }
    969 
    970     public void dumpService(FileDescriptor fd, IBinder token, String[] args)
    971             throws RemoteException {
    972         Parcel data = Parcel.obtain();
    973         data.writeInterfaceToken(IApplicationThread.descriptor);
    974         data.writeFileDescriptor(fd);
    975         data.writeStrongBinder(token);
    976         data.writeStringArray(args);
    977         mRemote.transact(DUMP_SERVICE_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
    978         data.recycle();
    979     }
    980 
    981     public void dumpProvider(FileDescriptor fd, IBinder token, String[] args)
    982             throws RemoteException {
    983         Parcel data = Parcel.obtain();
    984         data.writeInterfaceToken(IApplicationThread.descriptor);
    985         data.writeFileDescriptor(fd);
    986         data.writeStrongBinder(token);
    987         data.writeStringArray(args);
    988         mRemote.transact(DUMP_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
    989         data.recycle();
    990     }
    991 
    992     public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
    993             int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky)
    994             throws RemoteException {
    995         Parcel data = Parcel.obtain();
    996         data.writeInterfaceToken(IApplicationThread.descriptor);
    997         data.writeStrongBinder(receiver.asBinder());
    998         intent.writeToParcel(data, 0);
    999         data.writeInt(resultCode);
   1000         data.writeString(dataStr);
   1001         data.writeBundle(extras);
   1002         data.writeInt(ordered ? 1 : 0);
   1003         data.writeInt(sticky ? 1 : 0);
   1004         mRemote.transact(SCHEDULE_REGISTERED_RECEIVER_TRANSACTION, data, null,
   1005                 IBinder.FLAG_ONEWAY);
   1006         data.recycle();
   1007     }
   1008 
   1009     public final void scheduleLowMemory() throws RemoteException {
   1010         Parcel data = Parcel.obtain();
   1011         data.writeInterfaceToken(IApplicationThread.descriptor);
   1012         mRemote.transact(SCHEDULE_LOW_MEMORY_TRANSACTION, data, null,
   1013                 IBinder.FLAG_ONEWAY);
   1014         data.recycle();
   1015     }
   1016 
   1017     public final void scheduleActivityConfigurationChanged(
   1018             IBinder token) throws RemoteException {
   1019         Parcel data = Parcel.obtain();
   1020         data.writeInterfaceToken(IApplicationThread.descriptor);
   1021         data.writeStrongBinder(token);
   1022         mRemote.transact(SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION, data, null,
   1023                 IBinder.FLAG_ONEWAY);
   1024         data.recycle();
   1025     }
   1026 
   1027     public void profilerControl(boolean start, String path,
   1028             ParcelFileDescriptor fd, int profileType) throws RemoteException {
   1029         Parcel data = Parcel.obtain();
   1030         data.writeInterfaceToken(IApplicationThread.descriptor);
   1031         data.writeInt(start ? 1 : 0);
   1032         data.writeInt(profileType);
   1033         data.writeString(path);
   1034         if (fd != null) {
   1035             data.writeInt(1);
   1036             fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1037         } else {
   1038             data.writeInt(0);
   1039         }
   1040         mRemote.transact(PROFILER_CONTROL_TRANSACTION, data, null,
   1041                 IBinder.FLAG_ONEWAY);
   1042         data.recycle();
   1043     }
   1044 
   1045     public void setSchedulingGroup(int group) throws RemoteException {
   1046         Parcel data = Parcel.obtain();
   1047         data.writeInterfaceToken(IApplicationThread.descriptor);
   1048         data.writeInt(group);
   1049         mRemote.transact(SET_SCHEDULING_GROUP_TRANSACTION, data, null,
   1050                 IBinder.FLAG_ONEWAY);
   1051         data.recycle();
   1052     }
   1053 
   1054     public void getMemoryInfo(Debug.MemoryInfo outInfo) throws RemoteException {
   1055         Parcel data = Parcel.obtain();
   1056         Parcel reply = Parcel.obtain();
   1057         data.writeInterfaceToken(IApplicationThread.descriptor);
   1058         mRemote.transact(GET_MEMORY_INFO_TRANSACTION, data, reply, 0);
   1059         reply.readException();
   1060         outInfo.readFromParcel(reply);
   1061         data.recycle();
   1062         reply.recycle();
   1063     }
   1064 
   1065     public void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException {
   1066         Parcel data = Parcel.obtain();
   1067         data.writeInterfaceToken(IApplicationThread.descriptor);
   1068         data.writeInt(cmd);
   1069         data.writeStringArray(packages);
   1070         mRemote.transact(DISPATCH_PACKAGE_BROADCAST_TRANSACTION, data, null,
   1071                 IBinder.FLAG_ONEWAY);
   1072         data.recycle();
   1073 
   1074     }
   1075 
   1076     public void scheduleCrash(String msg) throws RemoteException {
   1077         Parcel data = Parcel.obtain();
   1078         data.writeInterfaceToken(IApplicationThread.descriptor);
   1079         data.writeString(msg);
   1080         mRemote.transact(SCHEDULE_CRASH_TRANSACTION, data, null,
   1081                 IBinder.FLAG_ONEWAY);
   1082         data.recycle();
   1083 
   1084     }
   1085 
   1086     public void dumpHeap(boolean managed, String path,
   1087             ParcelFileDescriptor fd) throws RemoteException {
   1088         Parcel data = Parcel.obtain();
   1089         data.writeInterfaceToken(IApplicationThread.descriptor);
   1090         data.writeInt(managed ? 1 : 0);
   1091         data.writeString(path);
   1092         if (fd != null) {
   1093             data.writeInt(1);
   1094             fd.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
   1095         } else {
   1096             data.writeInt(0);
   1097         }
   1098         mRemote.transact(DUMP_HEAP_TRANSACTION, data, null,
   1099                 IBinder.FLAG_ONEWAY);
   1100         data.recycle();
   1101     }
   1102 
   1103     public void dumpActivity(FileDescriptor fd, IBinder token, String prefix, String[] args)
   1104             throws RemoteException {
   1105         Parcel data = Parcel.obtain();
   1106         data.writeInterfaceToken(IApplicationThread.descriptor);
   1107         data.writeFileDescriptor(fd);
   1108         data.writeStrongBinder(token);
   1109         data.writeString(prefix);
   1110         data.writeStringArray(args);
   1111         mRemote.transact(DUMP_ACTIVITY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
   1112         data.recycle();
   1113     }
   1114 
   1115     public void setCoreSettings(Bundle coreSettings) throws RemoteException {
   1116         Parcel data = Parcel.obtain();
   1117         data.writeInterfaceToken(IApplicationThread.descriptor);
   1118         data.writeBundle(coreSettings);
   1119         mRemote.transact(SET_CORE_SETTINGS_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
   1120     }
   1121 
   1122     public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info)
   1123             throws RemoteException {
   1124         Parcel data = Parcel.obtain();
   1125         data.writeInterfaceToken(IApplicationThread.descriptor);
   1126         data.writeString(pkg);
   1127         info.writeToParcel(data, 0);
   1128         mRemote.transact(UPDATE_PACKAGE_COMPATIBILITY_INFO_TRANSACTION, data, null,
   1129                 IBinder.FLAG_ONEWAY);
   1130     }
   1131 
   1132     public void scheduleTrimMemory(int level) throws RemoteException {
   1133         Parcel data = Parcel.obtain();
   1134         data.writeInterfaceToken(IApplicationThread.descriptor);
   1135         data.writeInt(level);
   1136         mRemote.transact(SCHEDULE_TRIM_MEMORY_TRANSACTION, data, null,
   1137                 IBinder.FLAG_ONEWAY);
   1138     }
   1139 
   1140     public Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin, boolean all,
   1141             String[] args) throws RemoteException {
   1142         Parcel data = Parcel.obtain();
   1143         Parcel reply = Parcel.obtain();
   1144         data.writeInterfaceToken(IApplicationThread.descriptor);
   1145         data.writeFileDescriptor(fd);
   1146         data.writeInt(checkin ? 1 : 0);
   1147         data.writeInt(all ? 1 : 0);
   1148         data.writeStringArray(args);
   1149         mRemote.transact(DUMP_MEM_INFO_TRANSACTION, data, reply, 0);
   1150         reply.readException();
   1151         Debug.MemoryInfo info = new Debug.MemoryInfo();
   1152         info.readFromParcel(reply);
   1153         data.recycle();
   1154         reply.recycle();
   1155         return info;
   1156     }
   1157 
   1158     public void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException {
   1159         Parcel data = Parcel.obtain();
   1160         data.writeInterfaceToken(IApplicationThread.descriptor);
   1161         data.writeFileDescriptor(fd);
   1162         data.writeStringArray(args);
   1163         mRemote.transact(DUMP_GFX_INFO_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
   1164         data.recycle();
   1165     }
   1166 
   1167     public void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException {
   1168         Parcel data = Parcel.obtain();
   1169         data.writeInterfaceToken(IApplicationThread.descriptor);
   1170         data.writeFileDescriptor(fd);
   1171         data.writeStringArray(args);
   1172         mRemote.transact(DUMP_DB_INFO_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
   1173         data.recycle();
   1174     }
   1175 
   1176     public void unstableProviderDied(IBinder provider) throws RemoteException {
   1177         Parcel data = Parcel.obtain();
   1178         data.writeInterfaceToken(IApplicationThread.descriptor);
   1179         data.writeStrongBinder(provider);
   1180         mRemote.transact(UNSTABLE_PROVIDER_DIED_TRANSACTION, data, null, IBinder.FLAG_ONEWAY);
   1181         data.recycle();
   1182     }
   1183 }
   1184