Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04b0d81c authored by Alec Mouri's avatar Alec Mouri
Browse files

Add UID for graphicsstats

Bug: 368606283
Flag: EXEMPT log only update
Test: statsd_testdrive
Change-Id: I9fbbcaa6e8bb49b7456bd13b94321298694e576f
parent bdbe57d5
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -62,6 +62,9 @@ message GraphicsStatsProto {

    // HWUI renders pipeline type: GL or Vulkan
    optional PipelineType pipeline = 8;

    // The UID of the app
    optional int32 uid = 9;
}

message GraphicsStatsJankSummaryProto {
+9 −7
Original line number Diff line number Diff line
@@ -311,7 +311,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub {
                Log.w(TAG, "Unable to create path: '" + parent.getAbsolutePath() + "'");
                return;
            }
            nSaveBuffer(path.getAbsolutePath(), buffer.mInfo.mPackageName,
            nSaveBuffer(path.getAbsolutePath(), buffer.mInfo.mUid, buffer.mInfo.mPackageName,
                    buffer.mInfo.mVersionCode, buffer.mInfo.mStartTime, buffer.mInfo.mEndTime,
                    buffer.mData);
        }
@@ -405,7 +405,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub {
            HistoricalBuffer buffer = buffers.get(i);
            File path = pathForApp(buffer.mInfo);
            skipFiles.add(path);
            nAddToDump(dump, path.getAbsolutePath(), buffer.mInfo.mPackageName,
            nAddToDump(dump, path.getAbsolutePath(), buffer.mInfo.mUid, buffer.mInfo.mPackageName,
                    buffer.mInfo.mVersionCode,  buffer.mInfo.mStartTime, buffer.mInfo.mEndTime,
                    buffer.mData);
        }
@@ -469,21 +469,23 @@ public class GraphicsStatsService extends IGraphicsStats.Stub {

    private static native int nGetAshmemSize();
    private static native long nCreateDump(int outFd, boolean isProto);
    private static native void nAddToDump(long dump, String path, String packageName,
    private static native void nAddToDump(long dump, String path, int uid, String packageName,
            long versionCode, long startTime, long endTime, byte[] data);
    private static native void nAddToDump(long dump, String path);
    private static native void nFinishDump(long dump);
    private static native void nFinishDumpInMemory(long dump, long pulledData, boolean lastFullDay);
    private static native void nSaveBuffer(String path, String packageName, long versionCode,
            long startTime, long endTime, byte[] data);
    private static native void nSaveBuffer(String path, int uid, String packageName,
            long versionCode, long startTime, long endTime, byte[] data);

    private final class BufferInfo {
        final int mUid;
        final String mPackageName;
        final long mVersionCode;
        long mStartTime;
        long mEndTime;

        BufferInfo(String packageName, long versionCode, long startTime) {
        BufferInfo(int uid, String packageName, long versionCode, long startTime) {
            this.mUid = uid;
            this.mPackageName = packageName;
            this.mVersionCode = versionCode;
            this.mStartTime = startTime;
@@ -502,7 +504,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub {
        ActiveBuffer(IGraphicsStatsCallback token, int uid, int pid, String packageName,
                long versionCode)
                throws RemoteException, IOException {
            mInfo = new BufferInfo(packageName, versionCode, System.currentTimeMillis());
            mInfo = new BufferInfo(uid, packageName, versionCode, System.currentTimeMillis());
            mUid = uid;
            mPid = pid;
            mCallback = token;
+18 −15
Original line number Diff line number Diff line
@@ -42,8 +42,9 @@ static jlong createDump(JNIEnv*, jobject, jint fd, jboolean isProto) {
    return reinterpret_cast<jlong>(dump);
}

static void addToDump(JNIEnv* env, jobject, jlong dumpPtr, jstring jpath, jstring jpackage,
                      jlong versionCode, jlong startTime, jlong endTime, jbyteArray jdata) {
static void addToDump(JNIEnv* env, jobject, jlong dumpPtr, jstring jpath, jint uid,
                      jstring jpackage, jlong versionCode, jlong startTime, jlong endTime,
                      jbyteArray jdata) {
    std::string path;
    const ProfileData* data = nullptr;
    LOG_ALWAYS_FATAL_IF(jdata == nullptr && jpath == nullptr, "Path and data can't both be null");
@@ -68,7 +69,8 @@ static void addToDump(JNIEnv* env, jobject, jlong dumpPtr, jstring jpath, jstrin
    LOG_ALWAYS_FATAL_IF(!dump, "null passed for dump pointer");

    const std::string package(packageChars.c_str(), packageChars.size());
    GraphicsStatsService::addToDump(dump, path, package, versionCode, startTime, endTime, data);
    GraphicsStatsService::addToDump(dump, path, static_cast<uid_t>(uid), package, versionCode,
                                    startTime, endTime, data);
}

static void addFileToDump(JNIEnv* env, jobject, jlong dumpPtr, jstring jpath) {
@@ -91,7 +93,7 @@ static void finishDumpInMemory(JNIEnv* env, jobject, jlong dumpPtr, jlong pulled
    GraphicsStatsService::finishDumpInMemory(dump, data, lastFullDay == JNI_TRUE);
}

static void saveBuffer(JNIEnv* env, jobject clazz, jstring jpath, jstring jpackage,
static void saveBuffer(JNIEnv* env, jobject clazz, jstring jpath, jint uid, jstring jpackage,
                       jlong versionCode, jlong startTime, jlong endTime, jbyteArray jdata) {
    ScopedByteArrayRO buffer(env, jdata);
    LOG_ALWAYS_FATAL_IF(buffer.size() != sizeof(ProfileData),
@@ -106,7 +108,8 @@ static void saveBuffer(JNIEnv* env, jobject clazz, jstring jpath, jstring jpacka
    const std::string path(pathChars.c_str(), pathChars.size());
    const std::string package(packageChars.c_str(), packageChars.size());
    const ProfileData* data = reinterpret_cast<const ProfileData*>(buffer.get());
    GraphicsStatsService::saveBuffer(path, package, versionCode, startTime, endTime, data);
    GraphicsStatsService::saveBuffer(path, static_cast<uid_t>(uid), package, versionCode, startTime,
                                     endTime, data);
}

static jobject gGraphicsStatsServiceObject = nullptr;
@@ -173,14 +176,14 @@ static void nativeDestructor(JNIEnv* env, jobject javaObject) {
} // namespace android
using namespace android;

static const JNINativeMethod sMethods[] =
        {{"nGetAshmemSize", "()I", (void*)getAshmemSize},
static const JNINativeMethod sMethods[] = {
        {"nGetAshmemSize", "()I", (void*)getAshmemSize},
        {"nCreateDump", "(IZ)J", (void*)createDump},
         {"nAddToDump", "(JLjava/lang/String;Ljava/lang/String;JJJ[B)V", (void*)addToDump},
        {"nAddToDump", "(JLjava/lang/String;ILjava/lang/String;JJJ[B)V", (void*)addToDump},
        {"nAddToDump", "(JLjava/lang/String;)V", (void*)addFileToDump},
        {"nFinishDump", "(J)V", (void*)finishDump},
        {"nFinishDumpInMemory", "(JJZ)V", (void*)finishDumpInMemory},
         {"nSaveBuffer", "(Ljava/lang/String;Ljava/lang/String;JJJ[B)V", (void*)saveBuffer},
        {"nSaveBuffer", "(Ljava/lang/String;ILjava/lang/String;JJJ[B)V", (void*)saveBuffer},
        {"nativeInit", "()V", (void*)nativeInit},
        {"nativeDestructor", "()V", (void*)nativeDestructor}};

+3 −0
Original line number Diff line number Diff line
@@ -58,6 +58,9 @@ message GraphicsStatsProto {

    // HWUI renders pipeline type: GL or Vulkan
    optional PipelineType pipeline = 8;

    // The UID of the app
    optional int32 uid = 9;
}

message GraphicsStatsJankSummaryProto {
+22 −15
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
#include <inttypes.h>
#include <log/log.h>
#include <stats_annotations.h>
#include <stats_event.h>
#include <statslog_hwui.h>
#include <sys/mman.h>
@@ -45,9 +46,9 @@ static_assert(sizeof(sCurrentFileVersion) == sHeaderSize, "Header size is wrong"
constexpr int sHistogramSize = ProfileData::HistogramSize();
constexpr int sGPUHistogramSize = ProfileData::GPUHistogramSize();

static bool mergeProfileDataIntoProto(protos::GraphicsStatsProto* proto, const std::string& package,
                                      int64_t versionCode, int64_t startTime, int64_t endTime,
                                      const ProfileData* data);
static bool mergeProfileDataIntoProto(protos::GraphicsStatsProto* proto, uid_t uid,
                                      const std::string& package, int64_t versionCode,
                                      int64_t startTime, int64_t endTime, const ProfileData* data);
static void dumpAsTextToFd(protos::GraphicsStatsProto* proto, int outFd);

class FileDescriptor {
@@ -159,15 +160,16 @@ bool GraphicsStatsService::parseFromFile(const std::string& path,
    return success;
}

bool mergeProfileDataIntoProto(protos::GraphicsStatsProto* proto, const std::string& package,
                               int64_t versionCode, int64_t startTime, int64_t endTime,
                               const ProfileData* data) {
bool mergeProfileDataIntoProto(protos::GraphicsStatsProto* proto, uid_t uid,
                               const std::string& package, int64_t versionCode, int64_t startTime,
                               int64_t endTime, const ProfileData* data) {
    if (proto->stats_start() == 0 || proto->stats_start() > startTime) {
        proto->set_stats_start(startTime);
    }
    if (proto->stats_end() == 0 || proto->stats_end() < endTime) {
        proto->set_stats_end(endTime);
    }
    proto->set_uid(static_cast<int32_t>(uid));
    proto->set_package_name(package);
    proto->set_version_code(versionCode);
    proto->set_pipeline(data->pipelineType() == RenderPipelineType::SkiaGL ?
@@ -286,6 +288,7 @@ void dumpAsTextToFd(protos::GraphicsStatsProto* proto, int fd) {
              proto->package_name().c_str(), proto->has_summary());
        return;
    }
    dprintf(fd, "\nUID: %d", proto->uid());
    dprintf(fd, "\nPackage: %s", proto->package_name().c_str());
    dprintf(fd, "\nVersion: %" PRId64, proto->version_code());
    dprintf(fd, "\nStats since: %" PRId64 "ns", proto->stats_start());
@@ -319,14 +322,15 @@ void dumpAsTextToFd(protos::GraphicsStatsProto* proto, int fd) {
    dprintf(fd, "\n");
}

void GraphicsStatsService::saveBuffer(const std::string& path, const std::string& package,
                                      int64_t versionCode, int64_t startTime, int64_t endTime,
                                      const ProfileData* data) {
void GraphicsStatsService::saveBuffer(const std::string& path, uid_t uid,
                                      const std::string& package, int64_t versionCode,
                                      int64_t startTime, int64_t endTime, const ProfileData* data) {
    protos::GraphicsStatsProto statsProto;
    if (!parseFromFile(path, &statsProto)) {
        statsProto.Clear();
    }
    if (!mergeProfileDataIntoProto(&statsProto, package, versionCode, startTime, endTime, data)) {
    if (!mergeProfileDataIntoProto(&statsProto, uid, package, versionCode, startTime, endTime,
                                   data)) {
        return;
    }
    // Although we might not have read any data from the file, merging the existing data
@@ -383,7 +387,7 @@ public:

private:
    // use package name and app version for a key
    typedef std::pair<std::string, int64_t> DumpKey;
    typedef std::tuple<uid_t, std::string, int64_t> DumpKey;

    std::map<DumpKey, protos::GraphicsStatsProto> mStats;
    int mFd;
@@ -392,7 +396,8 @@ private:
};

void GraphicsStatsService::Dump::mergeStat(const protos::GraphicsStatsProto& stat) {
    auto dumpKey = std::make_pair(stat.package_name(), stat.version_code());
    auto dumpKey = std::make_tuple(static_cast<uid_t>(stat.uid()), stat.package_name(),
                                   stat.version_code());
    auto findIt = mStats.find(dumpKey);
    if (findIt == mStats.end()) {
        mStats[dumpKey] = stat;
@@ -437,15 +442,15 @@ GraphicsStatsService::Dump* GraphicsStatsService::createDump(int outFd, DumpType
    return new Dump(outFd, type);
}

void GraphicsStatsService::addToDump(Dump* dump, const std::string& path,
void GraphicsStatsService::addToDump(Dump* dump, const std::string& path, uid_t uid,
                                     const std::string& package, int64_t versionCode,
                                     int64_t startTime, int64_t endTime, const ProfileData* data) {
    protos::GraphicsStatsProto statsProto;
    if (!path.empty() && !parseFromFile(path, &statsProto)) {
        statsProto.Clear();
    }
    if (data &&
        !mergeProfileDataIntoProto(&statsProto, package, versionCode, startTime, endTime, data)) {
    if (data && !mergeProfileDataIntoProto(&statsProto, uid, package, versionCode, startTime,
                                           endTime, data)) {
        return;
    }
    if (!statsProto.IsInitialized()) {
@@ -556,6 +561,8 @@ void GraphicsStatsService::finishDumpInMemory(Dump* dump, AStatsEventList* data,
        // TODO: fill in UI mainline module version, when the feature is available.
        AStatsEvent_writeInt64(event, (int64_t)0);
        AStatsEvent_writeBool(event, !lastFullDay);
        AStatsEvent_writeInt32(event, stat.uid());
        AStatsEvent_addBoolAnnotation(event, ASTATSLOG_ANNOTATION_ID_IS_UID, true);
        AStatsEvent_build(event);
    }
    delete dump;
Loading