upload android base code part1

This commit is contained in:
August 2018-08-08 15:50:00 +08:00
parent e02f198e2d
commit 0a1de6c4b3
48159 changed files with 9071466 additions and 0 deletions

View file

@ -0,0 +1,61 @@
subdirs = [
"libthermalcallback"
]
cc_library {
name: "libthermalservice",
srcs: [
"aidl/android/os/IThermalEventListener.aidl",
"aidl/android/os/IThermalService.aidl",
"aidl/android/os/Temperature.cpp",
],
aidl: {
include_dirs: ["frameworks/native/services/thermalservice/aidl"],
export_aidl_headers: true,
},
export_include_dirs: ["aidl"],
shared_libs: [
"libbinder",
"libutils",
],
cflags: [
"-Wall",
"-Werror",
"-Wunused",
"-Wunreachable-code",
],
}
cc_binary {
name: "thermalserviced",
srcs: [
"ThermalService.cpp",
"thermalserviced.cpp",
],
include_dirs: ["frameworks/native"],
shared_libs: [
"libthermalservice",
"libbinder",
"libutils",
"libthermalcallback",
"android.hardware.thermal@1.1",
"libhidlbase",
"libhidltransport",
"liblog",
],
cflags: [
"-Wall",
"-Werror",
"-Wunused",
"-Wunreachable-code",
],
init_rc: ["thermalservice.rc"],
}

View file

@ -0,0 +1,126 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ThermalService.h"
#include <android/os/IThermalService.h>
#include <android/os/IThermalEventListener.h>
#include <android/os/Temperature.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <utils/Errors.h>
#include <utils/Mutex.h>
#include <utils/String16.h>
namespace android {
namespace os {
/**
* Notify registered listeners of a thermal throttling start/stop event.
* @param temperature the temperature at which the event was generated
*/
binder::Status ThermalService::notifyThrottling(
const bool isThrottling, const Temperature& temperature) {
Mutex::Autolock _l(mListenersLock);
mThrottled = isThrottling;
mThrottleTemperature = temperature;
for (size_t i = 0; i < mListeners.size(); i++) {
mListeners[i]->notifyThrottling(isThrottling, temperature);
}
return binder::Status::ok();
}
/**
* Query whether the system is currently thermal throttling.
* @return true if currently thermal throttling, else false
*/
binder::Status ThermalService::isThrottling(bool* _aidl_return) {
Mutex::Autolock _l(mListenersLock);
*_aidl_return = mThrottled;
return binder::Status::ok();
}
/**
* Register a new thermal event listener.
* @param listener the client's IThermalEventListener instance to which
* notifications are to be sent
*/
binder::Status ThermalService::registerThermalEventListener(
const sp<IThermalEventListener>& listener) {
{
if (listener == NULL)
return binder::Status::ok();
Mutex::Autolock _l(mListenersLock);
// check whether this is a duplicate
for (size_t i = 0; i < mListeners.size(); i++) {
if (IInterface::asBinder(mListeners[i]) ==
IInterface::asBinder(listener)) {
return binder::Status::ok();
}
}
mListeners.add(listener);
IInterface::asBinder(listener)->linkToDeath(this);
}
return binder::Status::ok();
}
/**
* Unregister a previously-registered thermal event listener.
* @param listener the client's IThermalEventListener instance to which
* notifications are to no longer be sent
*/
binder::Status ThermalService::unregisterThermalEventListener(
const sp<IThermalEventListener>& listener) {
if (listener == NULL)
return binder::Status::ok();
Mutex::Autolock _l(mListenersLock);
for (size_t i = 0; i < mListeners.size(); i++) {
if (IInterface::asBinder(mListeners[i]) ==
IInterface::asBinder(listener)) {
IInterface::asBinder(mListeners[i])->unlinkToDeath(this);
mListeners.removeAt(i);
break;
}
}
return binder::Status::ok();
}
void ThermalService::binderDied(const wp<IBinder>& who) {
Mutex::Autolock _l(mListenersLock);
for (size_t i = 0; i < mListeners.size(); i++) {
if (IInterface::asBinder(mListeners[i]) == who) {
mListeners.removeAt(i);
break;
}
}
}
/**
* Publish the supplied ThermalService to servicemanager.
*/
void ThermalService::publish(
const sp<ThermalService>& service) {
defaultServiceManager()->addService(String16("thermalservice"),
service);
}
} // namespace os
} // namespace android

View file

@ -0,0 +1,55 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_THERMALSERVICE_THERMALSERVICE_H
#define ANDROID_THERMALSERVICE_THERMALSERVICE_H
#include <android/os/BnThermalService.h>
#include <android/os/IThermalEventListener.h>
#include <android/os/Temperature.h>
#include <utils/Mutex.h>
#include <utils/String16.h>
#include <utils/Vector.h>
namespace android {
namespace os {
class ThermalService : public BnThermalService,
public IBinder::DeathRecipient {
public:
ThermalService() : mThrottled(false) {};
void publish(const sp<ThermalService>& service);
binder::Status notifyThrottling(
const bool isThrottling, const Temperature& temperature);
private:
Mutex mListenersLock;
Vector<sp<IThermalEventListener> > mListeners;
bool mThrottled;
Temperature mThrottleTemperature;
binder::Status registerThermalEventListener(
const sp<IThermalEventListener>& listener);
binder::Status unregisterThermalEventListener(
const sp<IThermalEventListener>& listener);
binder::Status isThrottling(bool* _aidl_return);
void binderDied(const wp<IBinder>& who);
};
}; // namespace os
}; // namespace android
#endif // ANDROID_THERMALSERVICE_THERMALSERVICE_H

View file

@ -0,0 +1,32 @@
/**
* Copyright (c) 2017, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.os;
import android.os.Temperature;
/**
* Listener for thermal events.
* {@hide}
*/
oneway interface IThermalEventListener {
/**
* Called when a thermal throttling start/stop event is received.
* @param temperature the temperature at which the event was generated.
*/
void notifyThrottling(
in boolean isThrottling, in Temperature temperature);
}

View file

@ -0,0 +1,48 @@
/**
* Copyright (c) 2017, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.os;
import android.os.IThermalEventListener;
import android.os.Temperature;
/** {@hide} */
interface IThermalService {
/**
* Register a listener for thermal events.
* @param listener the IThermalEventListener to be notified.
* {@hide}
*/
void registerThermalEventListener(in IThermalEventListener listener);
/**
* Unregister a previously-registered listener for thermal events.
* @param listener the IThermalEventListener to no longer be notified.
* {@hide}
*/
void unregisterThermalEventListener(in IThermalEventListener listener);
/**
* Send a thermal throttling start/stop notification to all listeners.
* @param temperature the temperature at which the event was generated.
* {@hide}
*/
oneway void notifyThrottling(
in boolean isThrottling, in Temperature temperature);
/**
* Return whether system performance is currently thermal throttling.
* {@hide}
*/
boolean isThrottling();
}

View file

@ -0,0 +1,5 @@
package android.os;
/* Encodes a temperature used by ThermalService. */
parcelable Temperature cpp_header "android/os/Temperature.h";

View file

@ -0,0 +1,54 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "android/os/Temperature.h"
#include <math.h>
#include <stdint.h>
#include <binder/Parcel.h>
#include <hardware/thermal.h>
#include <sys/types.h>
#include <utils/Errors.h>
namespace android {
namespace os {
Temperature::Temperature() : value_(NAN), type_(DEVICE_TEMPERATURE_UNKNOWN) {}
Temperature::Temperature(const float value, const int type) :
value_(value), type_(type) {}
Temperature::~Temperature() {}
/*
* Parcel read/write code must be kept in sync with
* frameworks/base/core/java/android/os/Temperature.java
*/
status_t Temperature::readFromParcel(const Parcel* p) {
value_ = p->readFloat();
type_ = p->readInt32();
return OK;
}
status_t Temperature::writeToParcel(Parcel* p) const {
p->writeFloat(value_);
p->writeInt32(type_);
return OK;
}
} // namespace os
} // namespace android

View file

@ -0,0 +1,33 @@
#ifndef ANDROID_THERMALSERVICE_AIDL_ANDROID_OS_TEMPERATURE_H
#define ANDROID_THERMALSERVICE_AIDL_ANDROID_OS_TEMPERATURE_H
#include <binder/Parcelable.h>
namespace android {
namespace os {
class Temperature : public Parcelable {
public:
Temperature();
Temperature(const float value, const int type);
~Temperature() override;
float getValue() const {return value_;};
float getType() const {return type_;};
status_t writeToParcel(Parcel* parcel) const override;
status_t readFromParcel(const Parcel* parcel) override;
private:
// The value of the temperature as a float, or NAN if unknown.
float value_;
// The type of the temperature, an enum temperature_type from
// hardware/thermal.h
int type_;
};
} // namespace os
} // namespace android
#endif // ANDROID_THERMALSERVICE_AIDL_ANDROID_OS_TEMPERATURE_H

View file

@ -0,0 +1,19 @@
cc_library_shared {
name: "libthermalcallback",
srcs: [
"ThermalCallback.cpp",
],
cflags: [
"-Wall",
"-Werror",
],
include_dirs: ["frameworks/native"],
shared_libs: [
"android.hardware.thermal@1.1",
"libhidlbase",
"libhidltransport",
"liblog",
"libthermalservice",
"libutils",
],
}

View file

@ -0,0 +1,69 @@
#define LOG_TAG "android.hardware.thermal.thermalcallback@1.1-impl"
#include <log/log.h>
#include "ThermalCallback.h"
#include "services/thermalservice/ThermalService.h"
#include <math.h>
#include <android/os/Temperature.h>
#include <hardware/thermal.h>
namespace android {
namespace hardware {
namespace thermal {
namespace V1_1 {
namespace implementation {
using ::android::os::ThermalService;
using ::android::hardware::thermal::V1_0::TemperatureType;
// Register a binder ThermalService object for sending events
void ThermalCallback::registerThermalService(sp<ThermalService> thermalService)
{
mThermalService = thermalService;
}
// Methods from IThermalCallback::V1_1 follow.
Return<void> ThermalCallback::notifyThrottling(
bool isThrottling,
const android::hardware::thermal::V1_0::Temperature& temperature) {
// Convert HIDL IThermal Temperature to binder IThermalService Temperature.
if (mThermalService != nullptr) {
float value = NAN;
int type = DEVICE_TEMPERATURE_UNKNOWN;
switch(temperature.type) {
case TemperatureType::CPU:
type = DEVICE_TEMPERATURE_CPU;
break;
case TemperatureType::GPU:
type = DEVICE_TEMPERATURE_GPU;
break;
case TemperatureType::BATTERY:
type = DEVICE_TEMPERATURE_BATTERY;
break;
case TemperatureType::SKIN:
type = DEVICE_TEMPERATURE_SKIN;
break;
case TemperatureType::UNKNOWN:
default:
type = DEVICE_TEMPERATURE_UNKNOWN;
break;
}
value = temperature.currentValue == UNKNOWN_TEMPERATURE ? NAN :
temperature.currentValue;
android::os::Temperature thermal_svc_temp(value, type);
mThermalService->notifyThrottling(isThrottling, thermal_svc_temp);
} else {
ALOGE("IThermalService binder service not created, drop throttling event");
}
return Void();
}
} // namespace implementation
} // namespace V1_1
} // namespace thermal
} // namespace hardware
} // namespace android

View file

@ -0,0 +1,43 @@
#ifndef ANDROID_HARDWARE_THERMAL_V1_1_THERMALCALLBACK_H
#define ANDROID_HARDWARE_THERMAL_V1_1_THERMALCALLBACK_H
#include <android/hardware/thermal/1.1/IThermalCallback.h>
#include <android/hardware/thermal/1.0/types.h>
#include <android/os/Temperature.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include "services/thermalservice/ThermalService.h"
namespace android {
namespace hardware {
namespace thermal {
namespace V1_1 {
namespace implementation {
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::os::ThermalService;
class ThermalCallback : public IThermalCallback {
public:
// Register a binder ThermalService object for sending events
void registerThermalService(sp<ThermalService> thermalService);
// Methods from IThermalCallback::V1_1 follow.
Return<void> notifyThrottling(
bool isThrottling,
const android::hardware::thermal::V1_0::Temperature& temperature)
override;
private:
// Our registered binder ThermalService object to use for sending events
sp<android::os::ThermalService> mThermalService;
};
} // namespace implementation
} // namespace V1_1
} // namespace thermal
} // namespace hardware
} // namespace android
#endif // ANDROID_HARDWARE_THERMAL_V1_1_THERMALCALLBACK_H

View file

@ -0,0 +1,2 @@
service thermalservice /system/bin/thermalserviced
class core

View file

@ -0,0 +1,115 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "thermalserviced"
#include <log/log.h>
#include "thermalserviced.h"
#include "ThermalService.h"
#include "libthermalcallback/ThermalCallback.h"
#include <android/hardware/thermal/1.1/IThermal.h>
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <hidl/HidlTransportSupport.h>
using namespace android;
using ::android::hardware::thermal::V1_1::IThermal;
using ::android::hardware::thermal::V1_0::Temperature;
using ::android::hardware::thermal::V1_1::IThermalCallback;
using ::android::hardware::thermal::V1_1::implementation::ThermalCallback;
using ::android::hardware::configureRpcThreadpool;
using ::android::hardware::hidl_death_recipient;
using ::android::hidl::base::V1_0::IBase;
using ::android::os::ThermalService;
template<typename T>
using Return = hardware::Return<T>;
namespace {
// Our thermalserviced main object
ThermalServiceDaemon* gThermalServiceDaemon;
// Thermal HAL client
sp<IThermal> gThermalHal = nullptr;
// Binder death notifier informing of Thermal HAL death.
struct ThermalServiceDeathRecipient : hidl_death_recipient {
virtual void serviceDied(
uint64_t cookie __unused, const wp<IBase>& who __unused) {
gThermalHal = nullptr;
ALOGE("IThermal HAL died");
gThermalServiceDaemon->getThermalHal();
}
};
sp<ThermalServiceDeathRecipient> gThermalHalDied = nullptr;
} // anonymous namespace
void ThermalServiceDaemon::thermalServiceStartup() {
// Binder IThermalService startup
mThermalService = new android::os::ThermalService;
mThermalService->publish(mThermalService);
// Register IThermalService object with IThermalCallback
if (mThermalCallback != nullptr)
mThermalCallback->registerThermalService(mThermalService);
IPCThreadState::self()->joinThreadPool();
}
// Lookup Thermal HAL, register death notifier, register our
// ThermalCallback with the Thermal HAL.
void ThermalServiceDaemon::getThermalHal() {
gThermalHal = IThermal::getService();
if (gThermalHal == nullptr) {
ALOGW("Unable to get Thermal HAL V1.1, vendor thermal event notification not available");
return;
}
// Binder death notifier for Thermal HAL
if (gThermalHalDied == nullptr)
gThermalHalDied = new ThermalServiceDeathRecipient();
if (gThermalHalDied != nullptr)
gThermalHal->linkToDeath(gThermalHalDied, 0x451F /* cookie */);
if (mThermalCallback != nullptr) {
Return<void> ret = gThermalHal->registerThermalCallback(
mThermalCallback);
if (!ret.isOk())
ALOGE("registerThermalCallback failed, status: %s",
ret.description().c_str());
}
}
void ThermalServiceDaemon::thermalCallbackStartup() {
// HIDL IThermalCallback startup
// Need at least 2 threads in thread pool since we wait for dead HAL
// to come back on the binder death notification thread and we need
// another thread for the incoming service now available call.
configureRpcThreadpool(2, false /* callerWillJoin */);
mThermalCallback = new ThermalCallback();
// Lookup Thermal HAL and register our ThermalCallback.
getThermalHal();
}
int main(int /*argc*/, char** /*argv*/) {
gThermalServiceDaemon = new ThermalServiceDaemon();
gThermalServiceDaemon->thermalCallbackStartup();
gThermalServiceDaemon->thermalServiceStartup();
/* NOTREACHED */
}

View file

@ -0,0 +1,40 @@
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_THERMALSERVICE_THERMALSERVICED_H
#define ANDROID_THERMALSERVICE_THERMALSERVICED_H
#include "ThermalService.h"
#include "libthermalcallback/ThermalCallback.h"
using namespace android;
using ::android::hardware::thermal::V1_0::Temperature;
using ::android::hardware::thermal::V1_1::implementation::ThermalCallback;
using ::android::os::ThermalService;
class ThermalServiceDaemon {
public:
void thermalServiceStartup();
void thermalCallbackStartup();
void getThermalHal();
ThermalServiceDaemon() {};
private:
sp<ThermalService> mThermalService;
sp<ThermalCallback> mThermalCallback;
};
#endif // ANDROID_THERMALSERVICE_THERMALSERVICED_H