StatsEventParcel impl.; move AIDL files
This implementation continue to uses libbinder, as opposed to
libbinder_ndk.
We also move many (but not all) statsd aidl files from
frameworks/base/core into the apex.
Test: m -j128 && bit statsd_test:*
Change-Id: I95f06e937e50c1e2a638163b13587682402956a7
diff --git a/Android.bp b/Android.bp
index 9426a9c..3dd8a0a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -253,6 +253,8 @@
":libcamera_client_aidl",
":libcamera_client_framework_aidl",
":libupdate_engine_aidl",
+ // TODO: this needs to be removed when statsd-framework.jar is separated out
+ ":statsd_aidl",
":storaged_aidl",
":vold_aidl",
@@ -413,18 +415,6 @@
}
filegroup {
- name: "statsd_aidl",
- srcs: [
- "core/java/android/os/IPullAtomCallback.aidl",
- "core/java/android/os/IPullAtomResultReceiver.aidl",
- "core/java/android/os/IStatsCompanionService.aidl",
- "core/java/android/os/IStatsManager.aidl",
- "core/java/android/os/IStatsPullerCallback.aidl",
- ],
- path: "core/java",
-}
-
-filegroup {
name: "libvibrator_aidl",
srcs: [
"core/java/android/os/IExternalVibrationController.aidl",
diff --git a/apex/statsd/aidl/Android.bp b/apex/statsd/aidl/Android.bp
new file mode 100644
index 0000000..e6ca544
--- /dev/null
+++ b/apex/statsd/aidl/Android.bp
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2019 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.
+//
+
+// TODO(b/145815909): move StatsDimensionsValue.aidl and StatsLogEventWrapper.aidl here
+filegroup {
+ name: "statsd_aidl",
+ srcs: ["**/*.aidl"],
+}
+
+// This library is currently unused
+aidl_interface {
+ name: "stats-event-parcel-aidl",
+ srcs: ["android/util/StatsEventParcel.aidl"],
+ backend: {
+ java: {
+ sdk_version: "28",
+ },
+ cpp: {
+ enabled: false,
+ }
+ }
+}
diff --git a/core/java/android/os/IPullAtomCallback.aidl b/apex/statsd/aidl/android/os/IPullAtomCallback.aidl
similarity index 100%
rename from core/java/android/os/IPullAtomCallback.aidl
rename to apex/statsd/aidl/android/os/IPullAtomCallback.aidl
diff --git a/core/java/android/os/IPullAtomResultReceiver.aidl b/apex/statsd/aidl/android/os/IPullAtomResultReceiver.aidl
similarity index 92%
rename from core/java/android/os/IPullAtomResultReceiver.aidl
rename to apex/statsd/aidl/android/os/IPullAtomResultReceiver.aidl
index bfb35ff..00d026e 100644
--- a/core/java/android/os/IPullAtomResultReceiver.aidl
+++ b/apex/statsd/aidl/android/os/IPullAtomResultReceiver.aidl
@@ -16,7 +16,7 @@
package android.os;
-import android.util.StatsEvent;
+import android.util.StatsEventParcel;
/**
* Binder interface to pull atoms for the stats service.
@@ -27,6 +27,6 @@
/**
* Indicate that a pull request for an atom is complete.
*/
- oneway void pullFinished(int atomTag, boolean success, in StatsEvent[] output);
+ oneway void pullFinished(int atomTag, boolean success, in StatsEventParcel[] output);
}
diff --git a/core/java/android/os/IStatsCompanionService.aidl b/apex/statsd/aidl/android/os/IStatsCompanionService.aidl
similarity index 100%
rename from core/java/android/os/IStatsCompanionService.aidl
rename to apex/statsd/aidl/android/os/IStatsCompanionService.aidl
diff --git a/core/java/android/os/IStatsManager.aidl b/apex/statsd/aidl/android/os/IStatsManager.aidl
similarity index 100%
rename from core/java/android/os/IStatsManager.aidl
rename to apex/statsd/aidl/android/os/IStatsManager.aidl
diff --git a/core/java/android/os/IStatsPullerCallback.aidl b/apex/statsd/aidl/android/os/IStatsPullerCallback.aidl
similarity index 100%
rename from core/java/android/os/IStatsPullerCallback.aidl
rename to apex/statsd/aidl/android/os/IStatsPullerCallback.aidl
diff --git a/apex/statsd/aidl/android/util/StatsEventParcel.aidl b/apex/statsd/aidl/android/util/StatsEventParcel.aidl
new file mode 100644
index 0000000..add8bfb
--- /dev/null
+++ b/apex/statsd/aidl/android/util/StatsEventParcel.aidl
@@ -0,0 +1,8 @@
+package android.util;
+
+/**
+ * @hide
+ */
+parcelable StatsEventParcel {
+ byte[] buffer;
+}
diff --git a/cmds/statsd/src/external/PullResultReceiver.cpp b/cmds/statsd/src/external/PullResultReceiver.cpp
index 6bd0545..6b6fe7d 100644
--- a/cmds/statsd/src/external/PullResultReceiver.cpp
+++ b/cmds/statsd/src/external/PullResultReceiver.cpp
@@ -25,12 +25,13 @@
namespace statsd {
PullResultReceiver::PullResultReceiver(
- std::function<void(int32_t, bool, const vector<android::util::StatsEvent>&)> pullFinishCb)
+ std::function<void(int32_t, bool, const vector<android::util::StatsEventParcel>&)>
+ pullFinishCb)
: pullFinishCallback(std::move(pullFinishCb)) {
}
Status PullResultReceiver::pullFinished(int32_t atomTag, bool success,
- const vector<StatsEvent>& output) {
+ const vector<StatsEventParcel>& output) {
pullFinishCallback(atomTag, success, output);
return Status::ok();
}
@@ -40,4 +41,4 @@
} // namespace statsd
} // namespace os
-} // namespace android
\ No newline at end of file
+} // namespace android
diff --git a/cmds/statsd/src/external/PullResultReceiver.h b/cmds/statsd/src/external/PullResultReceiver.h
index f731f77..17d06e4 100644
--- a/cmds/statsd/src/external/PullResultReceiver.h
+++ b/cmds/statsd/src/external/PullResultReceiver.h
@@ -24,7 +24,7 @@
class PullResultReceiver : public BnPullAtomResultReceiver {
public:
- PullResultReceiver(function<void(int32_t, bool, const vector<android::util::StatsEvent>&)>
+ PullResultReceiver(function<void(int32_t, bool, const vector<android::util::StatsEventParcel>&)>
pullFinishCallback);
~PullResultReceiver();
@@ -32,10 +32,11 @@
* Binder call for finishing a pull.
*/
binder::Status pullFinished(int32_t atomTag, bool success,
- const vector<android::util::StatsEvent>& output) override;
+ const vector<android::util::StatsEventParcel>& output) override;
private:
- function<void(int32_t, bool, const vector<android::util::StatsEvent>&)> pullFinishCallback;
+ function<void(int32_t, bool, const vector<android::util::StatsEventParcel>&)>
+ pullFinishCallback;
};
} // namespace statsd
diff --git a/cmds/statsd/src/external/StatsCallbackPuller.cpp b/cmds/statsd/src/external/StatsCallbackPuller.cpp
index 92db684..f5b1e7f 100644
--- a/cmds/statsd/src/external/StatsCallbackPuller.cpp
+++ b/cmds/statsd/src/external/StatsCallbackPuller.cpp
@@ -20,7 +20,7 @@
#include "StatsCallbackPuller.h"
#include <android/os/IPullAtomCallback.h>
-#include <android/util/StatsEvent.h>
+#include <android/util/StatsEventParcel.h>
#include "PullResultReceiver.h"
#include "StatsPullerManager.h"
@@ -57,13 +57,19 @@
sp<PullResultReceiver> resultReceiver = new PullResultReceiver(
[cv_mutex, cv, pullFinish, pullSuccess, sharedData](
- int32_t atomTag, bool success, const vector<StatsEvent>& output) {
+ int32_t atomTag, bool success, const vector<StatsEventParcel>& output) {
// This is the result of the pull, executing in a statsd binder thread.
// The pull could have taken a long time, and we should only modify
// data (the output param) if the pointer is in scope and the pull did not time out.
{
lock_guard<mutex> lk(*cv_mutex);
- // TODO: fill the shared vector of LogEvents once StatsEvent is complete.
+ for (const StatsEventParcel& parcel: output) {
+ shared_ptr<LogEvent> event =
+ make_shared<LogEvent>(const_cast<uint8_t*>(parcel.buffer.data()),
+ parcel.buffer.size(),
+ /*uid=*/ -1);
+ sharedData->push_back(event);
+ }
*pullSuccess = success;
*pullFinish = true;
}
diff --git a/core/java/android/app/StatsManager.java b/core/java/android/app/StatsManager.java
index 2ef0510..90cd51f 100644
--- a/core/java/android/app/StatsManager.java
+++ b/core/java/android/app/StatsManager.java
@@ -34,6 +34,7 @@
import android.util.AndroidException;
import android.util.Slog;
import android.util.StatsEvent;
+import android.util.StatsEventParcel;
import com.android.internal.annotations.GuardedBy;
@@ -540,10 +541,12 @@
mExecutor.execute(() -> {
List<StatsEvent> data = new ArrayList<>();
boolean success = mCallback.onPullAtom(atomTag, data);
- StatsEvent[] arr = new StatsEvent[data.size()];
- arr = data.toArray(arr);
+ StatsEventParcel[] parcels = new StatsEventParcel[data.size()];
+ for (int i = 0; i < data.size(); i++) {
+ parcels[i].buffer = data.get(i).getBytes();
+ }
try {
- resultReceiver.pullFinished(atomTag, success, arr);
+ resultReceiver.pullFinished(atomTag, success, parcels);
} catch (RemoteException e) {
Slog.w(TAG, "StatsPullResultReceiver failed for tag " + mAtomId);
}
diff --git a/core/java/android/util/StatsEvent.java b/core/java/android/util/StatsEvent.java
index 0a4069d..7e71640 100644
--- a/core/java/android/util/StatsEvent.java
+++ b/core/java/android/util/StatsEvent.java
@@ -20,8 +20,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
import android.os.SystemClock;
import com.android.internal.annotations.GuardedBy;
@@ -44,7 +42,7 @@
* </pre>
* @hide
**/
-public final class StatsEvent implements Parcelable {
+public final class StatsEvent {
// Type Ids.
/**
* @hide
@@ -265,39 +263,6 @@
}
/**
- * Boilerplate for Parcel.
- */
- public static final @NonNull Parcelable.Creator<StatsEvent> CREATOR =
- new Parcelable.Creator<StatsEvent>() {
- public StatsEvent createFromParcel(Parcel in) {
- // Purposefully leaving this method not implemented.
- throw new RuntimeException("Not implemented");
- }
-
- public StatsEvent[] newArray(int size) {
- // Purposefully leaving this method not implemented.
- throw new RuntimeException("Not implemented");
- }
- };
-
- /**
- * Boilerplate for Parcel.
- */
- public void writeToParcel(Parcel out, int flags) {
- out.writeInt(mAtomId);
- out.writeInt(getNumBytes());
- out.writeByteArray(getBytes());
- }
-
- /**
- * Boilerplate for Parcel.
- */
- public int describeContents() {
- return 0;
- }
-
-
- /**
* Builder for constructing a StatsEvent object.
*
* <p>This class defines and encapsulates the socket encoding for the buffer.