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

Commit e55a64f1 authored by Orion Hodson's avatar Orion Hodson Committed by Gerrit Code Review
Browse files

Merge "SurfaceFlinger: remove DdmConnection"

parents 5805df43 fb996e9f
Loading
Loading
Loading
Loading
+0 −18
Original line number Original line Diff line number Diff line
@@ -199,24 +199,6 @@ cc_binary {
    },
    },
}
}


cc_library_shared {
    name: "libsurfaceflinger_ddmconnection",
    defaults: ["surfaceflinger_defaults"],
    srcs: ["DdmConnection.cpp"],
    shared_libs: [
        "libcutils",
        "libdl",
        "liblog",
        "libprocessgroup",
    ],
    product_variables: {
        // uses jni which may not be available in PDK
        pdk: {
            enabled: false,
        },
    },
}

subdirs = [
subdirs = [
    "layerproto",
    "layerproto",
    "TimeStats/timestatsproto",
    "TimeStats/timestatsproto",
+0 −119
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2011 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 <dlfcn.h>
#include <sys/types.h>
#include <unistd.h>

#include <log/log.h>

#include "jni.h"
#include "DdmConnection.h"

namespace android {

void DdmConnection_start(const char* name) {
    ALOGI("DdmConnection_start");
    DdmConnection::start(name);
}

void DdmConnection::start(const char* name) {
    JavaVM* vm;
    JNIEnv* env;

    // start a VM
    JavaVMInitArgs args;
    JavaVMOption opt;

    opt.optionString =
        "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";

    args.version = JNI_VERSION_1_4;
    args.options = &opt;
    args.nOptions = 1;
    args.ignoreUnrecognized = JNI_FALSE;


    // TODO: Should this just link against libnativehelper and use its
    // JNI_CreateJavaVM wrapper that essential does this dlopen/dlsym
    // work based on the current system default runtime?
    void* libart_dso = dlopen("libart.so", RTLD_NOW);
    ALOGE_IF(!libart_dso, "DdmConnection: %s", dlerror());

    void* libandroid_runtime_dso = dlopen("libandroid_runtime.so", RTLD_NOW);
    ALOGE_IF(!libandroid_runtime_dso, "DdmConnection: %s", dlerror());

    if (!libart_dso || !libandroid_runtime_dso) {
        goto error;
    }

    jint (*JNI_CreateJavaVM)(JavaVM** p_vm, JNIEnv** p_env, void* vm_args);
    JNI_CreateJavaVM = reinterpret_cast<decltype(JNI_CreateJavaVM)>(
            dlsym(libart_dso, "JNI_CreateJavaVM"));
    ALOGE_IF(!JNI_CreateJavaVM, "DdmConnection: %s", dlerror());

    jint (*registerNatives)(JNIEnv* env, jclass clazz);
    registerNatives = reinterpret_cast<decltype(registerNatives)>(
            dlsym(libandroid_runtime_dso,
                "Java_com_android_internal_util_WithFramework_registerNatives"));
    ALOGE_IF(!registerNatives, "DdmConnection: %s", dlerror());

    if (!JNI_CreateJavaVM || !registerNatives) {
        goto error;
    }

    if (JNI_CreateJavaVM(&vm, &env, &args) == 0) {
        jclass startClass;
        jmethodID startMeth;

        // register native code
        if (registerNatives(env, 0) == 0) {
            // set our name by calling DdmHandleAppName.setAppName()
            startClass = env->FindClass("android/ddm/DdmHandleAppName");
            if (startClass) {
                startMeth = env->GetStaticMethodID(startClass,
                        "setAppName", "(Ljava/lang/String;I)V");
                if (startMeth) {
                    jstring str = env->NewStringUTF(name);
                    env->CallStaticVoidMethod(startClass, startMeth, str, getuid());
                    env->DeleteLocalRef(str);
                }
            }

            // initialize DDMS communication by calling
            // DdmRegister.registerHandlers()
            startClass = env->FindClass("android/ddm/DdmRegister");
            if (startClass) {
                startMeth = env->GetStaticMethodID(startClass,
                        "registerHandlers", "()V");
                if (startMeth) {
                    env->CallStaticVoidMethod(startClass, startMeth);
                }
            }
        }
    }
    return;

error:
    if (libandroid_runtime_dso) {
        dlclose(libandroid_runtime_dso);
    }
    if (libart_dso) {
        dlclose(libart_dso);
    }
}

}; // namespace android
+0 −35
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2011 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.
 */

#ifndef ANDROID_SF_DDM_CONNECTION
#define ANDROID_SF_DDM_CONNECTION

namespace android {

// wrapper for dlsym
extern "C" void DdmConnection_start(const char* name);

class DdmConnection {
public:
    // Creates a JVM and registers all handlers to DDMS.
    // This allows tools relying on DDMS to find surfaceflinger
    // (e.g: Memory Leak finder, heap analyzer, ...)
    static void start(const char* name);
};

}; // namespace android

#endif /* ANDROID_SF_DDM_CONNECTION */
+5 −29
Original line number Original line Diff line number Diff line
@@ -67,7 +67,6 @@
#include "ColorLayer.h"
#include "ColorLayer.h"
#include "Colorizer.h"
#include "Colorizer.h"
#include "ContainerLayer.h"
#include "ContainerLayer.h"
#include "DdmConnection.h"
#include "DispSync.h"
#include "DispSync.h"
#include "DisplayDevice.h"
#include "DisplayDevice.h"
#include "EventControlThread.h"
#include "EventControlThread.h"
@@ -225,7 +224,6 @@ SurfaceFlinger::SurfaceFlinger(SurfaceFlinger::SkipInitializationTag)
        mAnimCompositionPending(false),
        mAnimCompositionPending(false),
        mBootStage(BootStage::BOOTLOADER),
        mBootStage(BootStage::BOOTLOADER),
        mDebugRegion(0),
        mDebugRegion(0),
        mDebugDDMS(0),
        mDebugDisableHWC(0),
        mDebugDisableHWC(0),
        mDebugDisableTransformHint(0),
        mDebugDisableTransformHint(0),
        mDebugInSwapBuffers(0),
        mDebugInSwapBuffers(0),
@@ -305,16 +303,12 @@ SurfaceFlinger::SurfaceFlinger() : SurfaceFlinger(SkipInitialization) {
    property_get("debug.sf.showupdates", value, "0");
    property_get("debug.sf.showupdates", value, "0");
    mDebugRegion = atoi(value);
    mDebugRegion = atoi(value);


    property_get("debug.sf.ddms", value, "0");
    mDebugDDMS = atoi(value);
    if (mDebugDDMS) {
        if (!startDdmConnection()) {
            // start failed, and DDMS debugging not enabled
            mDebugDDMS = 0;
        }
    }
    ALOGI_IF(mDebugRegion, "showupdates enabled");
    ALOGI_IF(mDebugRegion, "showupdates enabled");
    ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");

    // DDMS debugging deprecated (b/120782499)
    property_get("debug.sf.ddms", value, "0");
    int debugDdms = atoi(value);
    ALOGI_IF(debugDdms, "DDMS debugging not supported");


    property_get("debug.sf.disable_backpressure", value, "0");
    property_get("debug.sf.disable_backpressure", value, "0");
    mPropagateBackpressure = !atoi(value);
    mPropagateBackpressure = !atoi(value);
@@ -4495,24 +4489,6 @@ SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
    return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
    return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
}
}


bool SurfaceFlinger::startDdmConnection()
{
    void* libddmconnection_dso =
            dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
    if (!libddmconnection_dso) {
        return false;
    }
    void (*DdmConnection_start)(const char* name);
    DdmConnection_start =
            (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
    if (!DdmConnection_start) {
        dlclose(libddmconnection_dso);
        return false;
    }
    (*DdmConnection_start)(getServiceName());
    return true;
}

void SurfaceFlinger::updateColorMatrixLocked() {
void SurfaceFlinger::updateColorMatrixLocked() {
    mat4 colorMatrix;
    mat4 colorMatrix;
    if (mGlobalSaturationFactor != 1.0f) {
    if (mGlobalSaturationFactor != 1.0f) {
+0 −2
Original line number Original line Diff line number Diff line
@@ -731,7 +731,6 @@ private:
    void dumpStatsLocked(const Vector<String16>& args, size_t& index, String8& result) const;
    void dumpStatsLocked(const Vector<String16>& args, size_t& index, String8& result) const;
    void clearStatsLocked(const Vector<String16>& args, size_t& index, String8& result);
    void clearStatsLocked(const Vector<String16>& args, size_t& index, String8& result);
    void dumpAllLocked(const Vector<String16>& args, size_t& index, String8& result) const;
    void dumpAllLocked(const Vector<String16>& args, size_t& index, String8& result) const;
    bool startDdmConnection();
    void appendSfConfigString(String8& result) const;
    void appendSfConfigString(String8& result) const;
    void checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
    void checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
                         TraverseLayersFunction traverseLayers);
                         TraverseLayersFunction traverseLayers);
@@ -837,7 +836,6 @@ private:


    // don't use a lock for these, we don't care
    // don't use a lock for these, we don't care
    int mDebugRegion;
    int mDebugRegion;
    int mDebugDDMS;
    int mDebugDisableHWC;
    int mDebugDisableHWC;
    int mDebugDisableTransformHint;
    int mDebugDisableTransformHint;
    volatile nsecs_t mDebugInSwapBuffers;
    volatile nsecs_t mDebugInSwapBuffers;