diff options
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 49 | ||||
| -rw-r--r-- | cmds/bootanimation/BootAnimation.h | 4 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsLogProcessor.cpp | 13 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsLogProcessor.h | 6 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsService.cpp | 7 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsService.h | 5 | ||||
| -rw-r--r-- | cmds/statsd/src/atoms.proto | 23 | ||||
| -rw-r--r-- | cmds/statsd/src/main.cpp | 36 | ||||
| -rw-r--r-- | cmds/statsd/src/stats_log.proto | 1 |
9 files changed, 134 insertions, 10 deletions
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 8ffe5bf59315..ed6c25dc49c3 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -302,6 +302,7 @@ status_t BootAnimation::readyToRun() { mHeight = h; mFlingerSurfaceControl = control; mFlingerSurface = s; + mTargetInset = -1; // If the device has encryption turned on or is in process // of being encrypted we show the encrypted boot animation. @@ -942,6 +943,7 @@ bool BootAnimation::playAnimation(const Animation& animation) if (mClockEnabled && mTimeIsAccurate && validClock(part)) { drawClock(animation.clockFont, part.clockPosX, part.clockPosY); } + handleViewport(frameDuration); eglSwapBuffers(mDisplay, mSurface); @@ -966,7 +968,7 @@ bool BootAnimation::playAnimation(const Animation& animation) usleep(part.pause * ns2us(frameDuration)); // For infinite parts, we've now played them at least once, so perhaps exit - if(exitPending() && !part.count) + if(exitPending() && !part.count && mCurrentInset >= mTargetInset) break; } @@ -986,6 +988,51 @@ bool BootAnimation::playAnimation(const Animation& animation) return true; } +void BootAnimation::handleViewport(nsecs_t timestep) { + if (mShuttingDown || !mFlingerSurfaceControl || mTargetInset == 0) { + return; + } + if (mTargetInset < 0) { + // Poll the amount for the top display inset. This will return -1 until persistent properties + // have been loaded. + mTargetInset = android::base::GetIntProperty("persist.sys.displayinset.top", + -1 /* default */, -1 /* min */, mHeight / 2 /* max */); + } + if (mTargetInset <= 0) { + return; + } + + if (mCurrentInset < mTargetInset) { + // After the device boots, the inset will effectively be cropped away. We animate this here. + float fraction = static_cast<float>(mCurrentInset) / mTargetInset; + int interpolatedInset = (cosf((fraction + 1) * M_PI) / 2.0f + 0.5f) * mTargetInset; + + SurfaceComposerClient::Transaction() + .setCrop(mFlingerSurfaceControl, Rect(0, interpolatedInset, mWidth, mHeight)) + .apply(); + } else { + // At the end of the animation, we switch to the viewport that DisplayManager will apply + // later. This changes the coordinate system, and means we must move the surface up by + // the inset amount. + sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay( + ISurfaceComposer::eDisplayIdMain)); + + Rect layerStackRect(0, 0, mWidth, mHeight - mTargetInset); + Rect displayRect(0, mTargetInset, mWidth, mHeight); + + SurfaceComposerClient::Transaction t; + t.setPosition(mFlingerSurfaceControl, 0, -mTargetInset) + .setCrop(mFlingerSurfaceControl, Rect(0, mTargetInset, mWidth, mHeight)); + t.setDisplayProjection(dtoken, 0 /* orientation */, layerStackRect, displayRect); + t.apply(); + + mTargetInset = mCurrentInset = 0; + } + + int delta = timestep * mTargetInset / ms2ns(200); + mCurrentInset += delta; +} + void BootAnimation::releaseAnimation(Animation* animation) const { for (Vector<Animation::Part>::iterator it = animation->parts.begin(), diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index 56e131523bcb..b4699d884681 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -157,11 +157,15 @@ private: void checkExit(); + void handleViewport(nsecs_t timestep); + sp<SurfaceComposerClient> mSession; AssetManager mAssets; Texture mAndroid[2]; int mWidth; int mHeight; + int mCurrentInset; + int mTargetInset; bool mUseNpotTextures = false; EGLDisplay mDisplay; EGLDisplay mContext; diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index e7f1caf26932..e7adba4d194a 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -71,6 +71,9 @@ const int FIELD_ID_STRINGS = 9; #define STATS_DATA_DIR "/data/misc/stats-data" +// Cool down period for writing data to disk to avoid overwriting files. +#define WRITE_DATA_COOL_DOWN_SEC 5 + StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor, @@ -526,6 +529,16 @@ void StatsLogProcessor::WriteDataToDiskLocked(const ConfigKey& key, void StatsLogProcessor::WriteDataToDiskLocked(const DumpReportReason dumpReportReason) { const int64_t timeNs = getElapsedRealtimeNs(); + // Do not write to disk if we already have in the last few seconds. + // This is to avoid overwriting files that would have the same name if we + // write twice in the same second. + if (static_cast<unsigned long long> (timeNs) < + mLastWriteTimeNs + WRITE_DATA_COOL_DOWN_SEC * NS_PER_SEC) { + ALOGI("Statsd skipping writing data to disk. Already wrote data in last %d seconds", + WRITE_DATA_COOL_DOWN_SEC); + return; + } + mLastWriteTimeNs = timeNs; for (auto& pair : mMetricsManagers) { WriteDataToDiskLocked(pair.first, timeNs, dumpReportReason); } diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index b175b3c544b5..86eb855825aa 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -40,7 +40,8 @@ enum DumpReportReason { GET_DATA_CALLED = 4, ADB_DUMP = 5, CONFIG_RESET = 6, - STATSCOMPANION_DIED = 7 + STATSCOMPANION_DIED = 7, + TERMINATION_SIGNAL_RECEIVED = 8 }; class StatsLogProcessor : public ConfigListener { @@ -183,6 +184,9 @@ private: long mLastPullerCacheClearTimeSec = 0; + // Last time we wrote data to disk. + int64_t mLastWriteTimeNs = 0; + #ifdef VERY_VERBOSE_PRINTING bool mPrintAllLogs = false; #endif diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 10c04f67ca05..cb48a716231f 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -881,6 +881,13 @@ void StatsService::Startup() { mConfigManager->Startup(); } +void StatsService::Terminate() { + ALOGI("StatsService::Terminating"); + if (mProcessor != nullptr) { + mProcessor->WriteDataToDisk(TERMINATION_SIGNAL_RECEIVED); + } +} + void StatsService::OnLogEvent(LogEvent* event, bool reconnectionStarts) { mProcessor->OnLogEvent(event, reconnectionStarts); } diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index b3a477645b73..d8aab88ce9f9 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -74,6 +74,11 @@ public: void Startup(); /** + * Called when terminiation signal received. + */ + void Terminate(); + + /** * Called by LogReader when there's a log event to process. */ virtual void OnLogEvent(LogEvent* event, bool reconnectionStarts); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index e12b665d1505..ac402c3d2caf 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -123,8 +123,7 @@ message Atom { PhoneServiceStateChanged phone_service_state_changed = 94; PhoneStateChanged phone_state_changed = 95; LowMemReported low_mem_reported = 81; - - + ThermalThrottlingStateChanged thermal_throttling = 86; } // Pulled events will start at field 10000. @@ -201,6 +200,26 @@ message AttributionNode { */ /** + * Logs when the Thermal service HAL notifies the throttling start/stop events. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java + */ +message ThermalThrottlingStateChanged { + optional android.os.TemperatureTypeEnum sensor_type = 1; + + enum State { + UNKNOWN = 0; + START = 1; + STOP = 2; + } + + optional State state = 2; + + optional float temperature = 3; +} + +/** * Logs when the screen state changes. * * Logged from: diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp index e8904c625325..58bbd96af7cf 100644 --- a/cmds/statsd/src/main.cpp +++ b/cmds/statsd/src/main.cpp @@ -96,6 +96,27 @@ static status_t start_log_reader_thread(const sp<StatsService>& service) { return NO_ERROR; } + +sp<StatsService> gStatsService = nullptr; + +void sigHandler(int sig) { + if (gStatsService != nullptr) { + gStatsService->Terminate(); + } +} + +void registerSigHandler() +{ + struct sigaction sa; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = sigHandler; + sigaction(SIGHUP, &sa, nullptr); + sigaction(SIGINT, &sa, nullptr); + sigaction(SIGQUIT, &sa, nullptr); + sigaction(SIGTERM, &sa, nullptr); +} + int main(int /*argc*/, char** /*argv*/) { // Set up the looper sp<Looper> looper(Looper::prepare(0 /* opts */)); @@ -108,21 +129,24 @@ int main(int /*argc*/, char** /*argv*/) { IPCThreadState::self()->disableBackgroundScheduling(true); // Create the service - sp<StatsService> service = new StatsService(looper); - if (defaultServiceManager()->addService(String16("stats"), service) != 0) { + gStatsService = new StatsService(looper); + if (defaultServiceManager()->addService(String16("stats"), gStatsService) != 0) { ALOGE("Failed to add service"); return -1; } - service->sayHiToStatsCompanion(); - service->Startup(); + registerSigHandler(); + + gStatsService->sayHiToStatsCompanion(); + + gStatsService->Startup(); - sp<StatsSocketListener> socketListener = new StatsSocketListener(service); + sp<StatsSocketListener> socketListener = new StatsSocketListener(gStatsService); if (kUseLogd) { ALOGI("using logd"); // Start the log reader thread - status_t err = start_log_reader_thread(service); + status_t err = start_log_reader_thread(gStatsService); if (err != NO_ERROR) { return 1; } diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index 2fe17daf7542..1c70d88f6cf3 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -265,6 +265,7 @@ message ConfigMetricsReport { ADB_DUMP = 5; CONFIG_RESET = 6; STATSCOMPANION_DIED = 7; + TERMINATION_SIGNAL_RECEIVED = 8; } optional DumpReportReason dump_report_reason = 8; |