diff --git a/libstats/bootstrap/Android.bp b/libstats/bootstrap/Android.bp new file mode 100644 index 000000000..332d9c81b --- /dev/null +++ b/libstats/bootstrap/Android.bp @@ -0,0 +1,49 @@ +// +// Copyright (C) 2021 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. +// + +// ========================================================================= +// Native library that provide a client to StatsBootstrapAtomService. +// This library should only be used by processes that start in the bootstrap namespace. +// All other clients should use libstatssocket, provided by the statsd apex. +// ========================================================================= +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_defaults { + name: "libstatsbootstrap_defaults", + srcs: [ + "BootstrapClientInternal.cpp", + "StatsBootstrapAtomClient.cpp", + ], + cflags: [ + "-Wall", + "-Werror", + ], + shared_libs: [ + "libbinder", + "libutils", + "android.os.statsbootstrap_aidl-cpp", + ], +} + +cc_library { + name: "libstatsbootstrap", + defaults: ["libstatsbootstrap_defaults"], + export_include_dirs: ["include"], +} + + diff --git a/libstats/bootstrap/BootstrapClientInternal.cpp b/libstats/bootstrap/BootstrapClientInternal.cpp new file mode 100644 index 000000000..b02e11626 --- /dev/null +++ b/libstats/bootstrap/BootstrapClientInternal.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2021 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 "BootstrapClientInternal.h" + +#include + +namespace android { +namespace os { +namespace stats { + +sp BootstrapClientInternal::getInstance() { + static sp client = new BootstrapClientInternal(); + return client; +} + +sp BootstrapClientInternal::getServiceNonBlocking() { + std::lock_guard lock(mLock); + if (mService != nullptr) { + return mService; + } + connectNonBlockingLocked(); + return mService; +} + +void BootstrapClientInternal::binderDied(const wp&) { + std::lock_guard lock(mLock); + mService = nullptr; + connectNonBlockingLocked(); +} + +void BootstrapClientInternal::connectNonBlockingLocked() { + const String16 name("statsbootstrap"); + mService = + interface_cast(defaultServiceManager()->checkService(name)); + if (mService != nullptr) { + // Set up binder death. + IInterface::asBinder(mService)->linkToDeath(this); + } +} + +} // namespace stats +} // namespace os +} // namespace android \ No newline at end of file diff --git a/libstats/bootstrap/BootstrapClientInternal.h b/libstats/bootstrap/BootstrapClientInternal.h new file mode 100644 index 000000000..96238dade --- /dev/null +++ b/libstats/bootstrap/BootstrapClientInternal.h @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2021 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. + */ + +#pragma once + +#include + +namespace android { +namespace os { +namespace stats { + +class BootstrapClientInternal : public IBinder::DeathRecipient { + public: + static sp getInstance(); + void binderDied(const wp& who) override; + sp getServiceNonBlocking(); + + private: + BootstrapClientInternal() {} + void connectNonBlockingLocked(); + + mutable std::mutex mLock; + sp mService; +}; + +} // namespace stats +} // namespace os +} // namespace android diff --git a/libstats/bootstrap/StatsBootstrapAtomClient.cpp b/libstats/bootstrap/StatsBootstrapAtomClient.cpp new file mode 100644 index 000000000..348b7fa72 --- /dev/null +++ b/libstats/bootstrap/StatsBootstrapAtomClient.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2021 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 "include/StatsBootstrapAtomClient.h" + +#include + +#include "BootstrapClientInternal.h" + +namespace android { +namespace os { +namespace stats { + +bool StatsBootstrapAtomClient::reportBootstrapAtom(const StatsBootstrapAtom& atom) { + sp service = + BootstrapClientInternal::getInstance()->getServiceNonBlocking(); + if (service == nullptr) { + return false; + } + return service->reportBootstrapAtom(atom).isOk(); +} + +} // namespace stats +} // namespace os +} // namespace android \ No newline at end of file diff --git a/libstats/bootstrap/include/StatsBootstrapAtomClient.h b/libstats/bootstrap/include/StatsBootstrapAtomClient.h new file mode 100644 index 000000000..87930fd75 --- /dev/null +++ b/libstats/bootstrap/include/StatsBootstrapAtomClient.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 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. + */ + +#pragma once + +#include + +namespace android { +namespace os { +namespace stats { + +class StatsBootstrapAtomClient { + public: + static bool reportBootstrapAtom(const StatsBootstrapAtom& atom); +}; + +} // namespace stats +} // namespace os +} // namespace android \ No newline at end of file