MTK平台 Android9 SensorManager framework到Hal层解析

最近项目中有一个需求,在Framework层新添加一个sensor类型,所以在需求的驱使下研究了一下SensorManger在Framework层的流程。
首先从APP端入手,我们注册一个Sensor的流程如下

if(mSensorManager == null){
            mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
}
mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
Log.d("vivian","mAccSensor "+mAccSensor);
mSensorManager.registerListener(new MyPSensorListener(), mAccSensor, SensorManager.SENSOR_DELAY_NORMAL);

首先追一下getDefaultSensor这个方法的流程
/frameworks/base/core/java/android/hardware/SensorManager.java

    public Sensor getDefaultSensor(int type) {
    Log.d("vivian","getDefaultSensor type "+type);
        // TODO: need to be smarter, for now, just return the 1st sensor
        List<Sensor> l = getSensorList(type);

        boolean wakeUpSensor = false;
        // For the following sensor types, return a wake-up sensor. These types are by default
        // defined as wake-up sensors. For the rest of the SDK defined sensor types return a
        // non_wake-up version.
        if (type == Sensor.TYPE_PROXIMITY || type == Sensor.TYPE_SIGNIFICANT_MOTION
                || type == Sensor.TYPE_TILT_DETECTOR || type == Sensor.TYPE_WAKE_GESTURE
                || type == Sensor.TYPE_GLANCE_GESTURE || type == Sensor.TYPE_PICK_UP_GESTURE
                || type == Sensor.TYPE_WRIST_TILT_GESTURE
                || type == Sensor.TYPE_DYNAMIC_SENSOR_META
        || type == Sensor.TYPE_EKG) {
            wakeUpSensor = true;
        }

        for (Sensor sensor : l) {
        Log.d("vivian", "sensor.isWakeUpSensor() "+sensor.isWakeUpSensor());
            if (sensor.isWakeUpSensor() == wakeUpSensor) return sensor;
        }
        return null;
    }

接下来追List<Sensor> l = getSensorList(type)这个方法,同样也在当前文件

public List<Sensor> getSensorList(int type) {
        Log.d("vivian","getSensorList "+type);
        // cache the returned lists the first time
        List<Sensor> list;
        final List<Sensor> fullList = getFullSensorList();
    Log.d("vivian","getSensorList fullList size "+fullList.size());
        synchronized (mSensorListByType) {
            list = mSensorListByType.get(type);
            if (list == null) {
                if (type == Sensor.TYPE_ALL) {
                    list = fullList;
                } else {
                    list = new ArrayList<Sensor>();
                    for (Sensor i : fullList) {
            Log.d("vivian","getSensorList i.getType() "+i.getType());
                        if (i.getType() == type) {
                            list.add(i);
                        }
                    }
                }
                list = Collections.unmodifiableList(list);
                mSensorListByType.append(type, list);
            }else{
        Log.d("vivian","getSensorList list size "+list.size());
        }
        }
        Log.d("vivian","getSensorList list size "+list.size());
        return list;
    }

看代码可以清晰看出,下一步需要追getFullSensorList()这个方法,这个方法在SystemSensorManager.java中
/frameworks/base/core/java/android/hardware/SystemSensorManager.java

/** @hide */
    @Override
    protected List<Sensor> getFullSensorList() {
        return mFullSensorsList;
    }

mFullSensorsList这个变量值怎么来的,我们继续追到该类的构造函数里

/** {@hide} */
    public SystemSensorManager(Context context, Looper mainLooper) {
        synchronized (sLock) {
            if (!sNativeClassInited) {
                sNativeClassInited = true;
                nativeClassInit();
            }
        }

        mMainLooper = mainLooper;
        mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
        mContext = context;
        mNativeInstance = nativeCreate(context.getOpPackageName());

        Log.d("vivian", "SystemSensorManager initialize the sensor list");
        // initialize the sensor list
        for (int index = 0;; ++index) {
            Sensor sensor = new Sensor();
            if (!nativeGetSensorAtIndex(mNativeInstance, sensor, index)) break;
            mFullSensorsList.add(sensor);
            mHandleToSensor.put(sensor.getHandle(), sensor);
        }
    }

从上面代码可以看出,所有Sensor是通过nativeGetSensorAtIndex这个方法获取的,继续追这个方法我们追到了jni层
/frameworks/base/core/jni/android_hardware_SensorManager.cpp

static jboolean
nativeGetSensorAtIndex(JNIEnv *env, jclass clazz, jlong sensorManager, jobject sensor, jint index)
{
    ALOGE("vivian nativeGetSensorAtIndex");
    SensorManager* mgr = reinterpret_cast<SensorManager*>(sensorManager);

    Sensor const* const* sensorList;
    ssize_t count = mgr->getSensorList(&sensorList);
    if (ssize_t(index) >= count) {
        return false;
    }

    return translateNativeSensorToJavaSensor(env, sensor, *sensorList[index]) != NULL;
}

ssize_t count = mgr->getSensorList(&sensorList);这里开始就调到了native层的SensorManager
/frameworks/native/services/sensorservice/hidl/SensorManager.cpp

// Methods from ::android::frameworks::sensorservice::V1_0::ISensorManager follow.
Return<void> SensorManager::getSensorList(getSensorList_cb _hidl_cb) {
    LOG(ERROR) << "vivian native SensorManager getSensorList";
    ::android::Sensor const* const* list;
    ssize_t count = getInternalManager().getSensorList(&list);
    LOG(ERROR) << "vivian native SensorManager getSensorList count " << count;
    if (count < 0 || !list) {
        LOG(ERROR) << "::android::SensorManager::getSensorList encounters " << count;
        _hidl_cb({}, Result::UNKNOWN_ERROR);
        return Void();
    }
    hidl_vec<SensorInfo> ret;
    ret.resize(static_cast<size_t>(count));
    for (ssize_t i = 0; i < count; ++i) {
        ret[i] = convertSensor(*list[i]);
    }
    _hidl_cb(ret, Result::OK);
    return Void();
}

接下来就是通过SensorService的getSensorList拿数据
/frameworks/native/services/sensorservice/SensorService.java

Vector<Sensor> SensorService::getSensorList(const String16& /* opPackageName */) {
    ALOGE("vivian native SensorService::getSensorList");
    char value[PROPERTY_VALUE_MAX];
    property_get("debug.sensors", value, "0");
    const Vector<Sensor>& initialSensorList = (atoi(value)) ?
            mSensors.getUserDebugSensors() : mSensors.getUserSensors();
    Vector<Sensor> accessibleSensorList;
    for (size_t i = 0; i < initialSensorList.size(); i++) {
        Sensor sensor = initialSensorList[i];
        accessibleSensorList.add(sensor);
    }
    makeUuidsIntoIdsForSensorList(accessibleSensorList);
    return accessibleSensorList;
}

而SensorService的数据是在初始化的时候拿到的

// 这部分只截取一部分代码
void SensorService::onFirstRef() {
    ALOGE("vivian native SensorService::onFirstRef()");
    ALOGD("nuSensorService starting...");
    SensorDevice& dev(SensorDevice::getInstance());

    sHmacGlobalKeyIsValid = initializeHmacKey();

    if (dev.initCheck() == NO_ERROR) {

在SensorService初始化的时候初始化了Sensordevice,我们来看一下SensorDevice的构造函数
/frameworks/native/services/sensorservice/SensorDevice.cpp

SensorDevice::SensorDevice()
        : mHidlTransportErrors(20), mRestartWaiter(new HidlServiceRegistrationWaiter()) {
    ALOGE("vivian SensorDevice::SensorDevice()");
    if (!connectHidlService()) {
        return;
    }

    float minPowerMa = 0.001; // 1 microAmp

    checkReturn(mSensors->getSensorsList(
            [&](const auto &list) {
                const size_t count = list.size();

                mActivationCount.setCapacity(count);
                Info model;
                for (size_t i=0 ; i < count; i++) {
                    sensor_t sensor;
                    convertToSensor(list[i], &sensor);
            ALOGE("vivian SensorDevice::SensorDevice() type %d", sensor.type);
                    // Sanity check and clamp power if it is 0 (or close)
                    if (sensor.power < minPowerMa) {
                        ALOGE("Reported power %f not deemed sane, clamping to %f",
                              sensor.power, minPowerMa);
                        sensor.power = minPowerMa;
                    }
                    mSensorList.push_back(sensor);

                    mActivationCount.add(list[i].sensorHandle, model);

                    checkReturn(mSensors->activate(list[i].sensorHandle, 0 /* enabled */));
                }
            }));

    mIsDirectReportSupported =
           (checkReturn(mSensors->unregisterDirectChannel(-1)) != Result::INVALID_OPERATION);
}

在这个位置会调用connectHidlService()(该方法的代码就不贴了,可以自行到源码里查看),应该是connect了hal层的Sensor Service,连接成功后会初始化mSensors这个变量,这个变量不为空后,就可以通过mSensors->getSensorsList获取到sensor的列表,这样整个的获取sensor列表的流程就结束了,其他方法基本上都是走这几层,可以自行查看。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容