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

Commit 6a82727a authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add UID for graphicsstats" into main

parents 2ecedbdc 04b0d81c
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