diff options
| -rw-r--r-- | api/system-current.txt | 4 | ||||
| -rw-r--r-- | core/java/android/util/StatsLog.java | 12 | ||||
| -rw-r--r-- | core/jni/Android.bp | 9 | ||||
| -rw-r--r-- | core/jni/AndroidRuntime.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android_util_StatsLog.cpp | 69 | ||||
| -rw-r--r-- | tools/stats_log_api_gen/main.cpp | 4 |
6 files changed, 94 insertions, 6 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 71dcdac2d0bc..3b4a8680bf44 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7777,6 +7777,10 @@ package android.util { method public int getUid(); } + public final class StatsLog { + method public static void writeRaw(@NonNull byte[], int); + } + } package android.view { diff --git a/core/java/android/util/StatsLog.java b/core/java/android/util/StatsLog.java index e3de30713652..020205fea181 100644 --- a/core/java/android/util/StatsLog.java +++ b/core/java/android/util/StatsLog.java @@ -16,6 +16,8 @@ package android.util; +import android.annotation.NonNull; +import android.annotation.SystemApi; import android.os.IStatsManager; import android.os.RemoteException; import android.os.ServiceManager; @@ -113,4 +115,14 @@ public final class StatsLog extends StatsLogInternal { sService = IStatsManager.Stub.asInterface(ServiceManager.getService("stats")); return sService; } + + /** + * Write an event to stats log using the raw format. + * + * @param buffer The encoded buffer of data to write.. + * @param size The number of bytes from the buffer to write. + * @hide + */ + @SystemApi + public static native void writeRaw(@NonNull byte[] buffer, int size); } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index e508b02a7dba..6fcb78be05dc 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -1,10 +1,10 @@ genrule { - name: "android_util_StatsLog.cpp", + name: "android_util_StatsLogInternal.cpp", tools: ["stats-log-api-gen"], - cmd: "$(location stats-log-api-gen) --jni $(genDir)/android_util_StatsLog.cpp", + cmd: "$(location stats-log-api-gen) --jni $(genDir)/android_util_StatsLogInternal.cpp", out: [ - "android_util_StatsLog.cpp", + "android_util_StatsLogInternal.cpp", ], } @@ -112,6 +112,7 @@ cc_library_shared { "android_util_Binder.cpp", "android_util_EventLog.cpp", "android_util_Log.cpp", + "android_util_StatsLog.cpp", "android_util_MemoryIntArray.cpp", "android_util_PathParser.cpp", "android_util_Process.cpp", @@ -292,7 +293,7 @@ cc_library_shared { "server_configurable_flags", ], - generated_sources: ["android_util_StatsLog.cpp"], + generated_sources: ["android_util_StatsLogInternal.cpp"], local_include_dirs: ["android/graphics"], export_include_dirs: [ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index a4be784ce4e4..1854ea940379 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -120,6 +120,7 @@ extern int register_android_app_admin_SecurityLog(JNIEnv* env); extern int register_android_content_AssetManager(JNIEnv* env); extern int register_android_util_EventLog(JNIEnv* env); extern int register_android_util_StatsLog(JNIEnv* env); +extern int register_android_util_StatsLogInternal(JNIEnv* env); extern int register_android_util_Log(JNIEnv* env); extern int register_android_util_MemoryIntArray(JNIEnv* env); extern int register_android_util_PathParser(JNIEnv* env); @@ -1396,6 +1397,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_util_MemoryIntArray), REG_JNI(register_android_util_PathParser), REG_JNI(register_android_util_StatsLog), + REG_JNI(register_android_util_StatsLogInternal), REG_JNI(register_android_app_admin_SecurityLog), REG_JNI(register_android_content_AssetManager), REG_JNI(register_android_content_StringBlock), diff --git a/core/jni/android_util_StatsLog.cpp b/core/jni/android_util_StatsLog.cpp new file mode 100644 index 000000000000..e749d34035dd --- /dev/null +++ b/core/jni/android_util_StatsLog.cpp @@ -0,0 +1,69 @@ +/* + * 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. + */ + +#define LOG_NAMESPACE "StatsLog.tag." +#define LOG_TAG "StatsLog_println" + +#include <assert.h> +#include <cutils/properties.h> + +#include "jni.h" +#include <nativehelper/JNIHelp.h> +#include "utils/misc.h" +#include "core_jni_helpers.h" +#include "stats_event_list.h" + +namespace android { + +static void android_util_StatsLog_writeRaw(JNIEnv* env, jobject clazz, jbyteArray buf, jint size) +{ + if (buf == NULL) { + return; + } + jint actualSize = env->GetArrayLength(buf); + if (actualSize < size) { + return; + } + + jbyte* bufferArray = env->GetByteArrayElements(buf, NULL); + if (bufferArray == NULL) { + return; + } + const uint32_t statsEventTag = 1937006964; + struct iovec vec[2]; + vec[0].iov_base = (void*) &statsEventTag; + vec[0].iov_len = sizeof(statsEventTag); + vec[1].iov_base = (void*) bufferArray; + vec[1].iov_len = size; + write_to_statsd(vec, 2); + + env->ReleaseByteArrayElements(buf, bufferArray, 0); +} + +/* + * JNI registration. + */ +static const JNINativeMethod gMethods[] = { + /* name, signature, funcPtr */ + { "writeRaw", "([BI)V", (void*) android_util_StatsLog_writeRaw }, +}; + +int register_android_util_StatsLog(JNIEnv* env) +{ + return RegisterMethodsOrDie(env, "android/util/StatsLog", gMethods, NELEM(gMethods)); +} + +}; // namespace android diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp index 73a0fe186181..2d9b9885c5ba 100644 --- a/tools/stats_log_api_gen/main.cpp +++ b/tools/stats_log_api_gen/main.cpp @@ -1319,10 +1319,10 @@ write_stats_log_jni(FILE* out, const Atoms& atoms, const AtomDecl &attributionDe fprintf(out, "\n"); // Print registration function - fprintf(out, "int register_android_util_StatsLog(JNIEnv* env) {\n"); + fprintf(out, "int register_android_util_StatsLogInternal(JNIEnv* env) {\n"); fprintf(out, " return RegisterMethodsOrDie(\n"); fprintf(out, " env,\n"); - fprintf(out, " \"android/util/StatsLog\",\n"); + fprintf(out, " \"android/util/StatsLogInternal\",\n"); fprintf(out, " gRegisterMethods, NELEM(gRegisterMethods));\n"); fprintf(out, "}\n"); |