GPS系统

相关文件

// 应用层接口
frameworks/base/location/java/android/location/LocationManager.java
frameworks/base/location/java/android/location/LocationProvider.java
frameworks/base/location/java/android/location/Location.java
frameworks/base/location/java/android/location/GpsStatus.java
frameworks/base/location/java/android/location/GpsSatellite.java
frameworks/base/location/java/android/location/Geocoder.java
frameworks/base/location/java/android/location/Criteria.java
frameworks/base/location/java/android/location/Address.java

// Service
frameworks/base/services/java/com/android/server/LocationManagerService.java
frameworks/base/services/java/com/android/server/location/GpsLocationProvider.java
frameworks/base/services/java/com/android/server/location/GpsXtraDownloader.java

// JNI
frameworks/base/services/jni/com_android_server_location_GpsLocationProvider.cpp

// HAL
hardware/libhardware/include/hardware/gps.h

架构描述

GPS管理类

LocationManager

public LocationManager(ILocationManager service) {
    mService = service;
}

GPS信息的提供者

getProvider

public LocationProvider getProvider(String name) {
    ...... 
    try {
        Bundle info = mService.getProviderInfo(name);
        if (info == null) {
            return null;
        }
        return createProvider(name, info);
    } catch (RemoteException ex) {
    }
    return null;
}

注册定位信息的回调

ListenerTransport

private class ListenerTransport extends ILocationListener.Stub {
    private static final int TYPE_LOCATION_CHANGED = 1;
    private static final int TYPE_STATUS_CHANGED = 2;
    private static final int TYPE_PROVIDER_ENABLED = 3;
    private static final int TYPE_PROVIDER_DISABLED = 4;

    ......
    ListenerTransport(LocationListener listener, Looper looper) {
        mListener = listener;
        ...... 
    }

    public void onLocationChanged(Location location) {
        ......
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        ......
    }

    public void onProviderEnabled(String provider) {
        ......
    }

    public void onProviderDisabled(String provider) {
        ......
    }
}

_requestLocationUpdates

private void _requestLocationUpdates(String provider, Criteria criteria, 
                                     long minTime, float minDistance, 
                                     boolean singleShot, LocationListener listener, 
                                     Looper looper) {
    ...... 
    try {
        synchronized (mListeners) {
            ListenerTransport transport = mListeners.get(listener);
            if (transport == null) {
                transport = new ListenerTransport(listener, looper);
            }
            mListeners.put(listener, transport);
            mService.requestLocationUpdates(provider, criteria, minTime, minDistance, 
                                            singleShot, transport);
        }
    } catch (RemoteException ex) {
    }
}

注册状态信息的回调

private ILocationManager mService;
private final HashMap<GpsStatus.Listener, GpsStatusListenerTransport> mGpsStatusListeners =
        new HashMap<GpsStatus.Listener, GpsStatusListenerTransport>();
private final HashMap<GpsStatus.NmeaListener, GpsStatusListenerTransport> mNmeaListeners =
        new HashMap<GpsStatus.NmeaListener, GpsStatusListenerTransport>();
private final GpsStatus mGpsStatus = new GpsStatus();

GpsStatusListenerTransport

private class GpsStatusListenerTransport extends IGpsStatusListener.Stub {
    ......
    private class Nmea {
        ...... 
    }
    private ArrayList<Nmea> mNmeaBuffer;

    public void onGpsStarted() {
        ......
    }

    public void onGpsStopped() {
        ...... 
    }

    public void onFirstFix(int ttff) {
        ...... 
    }

    public void onSvStatusChanged(int svCount, int[] prns, float[] snrs,
            float[] elevations, float[] azimuths, int ephemerisMask,
            int almanacMask, int usedInFixMask) {
        ...... 
    }

    public void onNmeaReceived(long timestamp, String nmea) {
        ...... 
    }
}

addGpsStatusListener

public boolean addGpsStatusListener(GpsStatus.Listener listener) {
        boolean result;

    ...... 
    try {
        GpsStatusListenerTransport transport = new GpsStatusListenerTransport(listener);
        result = mService.addGpsStatusListener(transport);
        if (result) {
            mGpsStatusListeners.put(listener, transport);
        }
    } catch (RemoteException e) {
        result = false;
    }

    return result;
}

GPS Service

    GPS Service是ILocationManager接口的服务端实现(使用Binder机制),LocationManager管理通常会通过
该Service发送跨进程的请求。

GPS信息的内容提供者

GPS的JNI层

static JNINativeMethod sMethods[] = {
    {"class_init_native", "()V", ......},
    {"native_is_supported", "()Z", ......},
    {"native_init", "()Z", ......},
    {"native_cleanup", "()V", ......},
    {"native_set_position_mode", "(IIIII)Z", ......},
    {"native_start", "()Z", ......},
    {"native_stop", "()Z", ......},
    {"native_delete_aiding_data", "(I)V", ......},
    {"native_read_sv_status", "([I[F[F[F[I)I", ......},
    {"native_read_nmea", "([BI)I", ......},
    {"native_inject_time", "(JJI)V", ......},
    {"native_inject_location", "(DDF)V", ......},
    {"native_supports_xtra", "()Z", ......},
    {"native_inject_xtra_data", "([BI)V", ......},
    {"native_agps_data_conn_open", "(Ljava/lang/String;)V", ......},
    {"native_agps_data_conn_closed", "()V", ......},
    {"native_agps_data_conn_failed", "()V", ......},
    {"native_agps_set_id","(ILjava/lang/String;)V", ......},
    {"native_agps_set_ref_location_cellid","(IIIII)V", ......},
    {"native_set_agps_server", "(ILjava/lang/String;I)V", ......},
    {"native_send_ni_response", "(II)V", ......},
    {"native_agps_ni_message", "([BI)V", ......},
    {"native_get_internal_state", "()Ljava/lang/String;", ......},
    {"native_update_network_state", "(ZIZLjava/lang/String;)V", ......},
};

GPS的HAL层