break SF dependencies on libdvm and libandroid_runtime

these libraries are only needed for debugging and are now
linked at runtime if needed.

Change-Id: I03f138523c6de166a1e2700d4454d4a854aee145
This commit is contained in:
Mathias Agopian 2012-08-04 20:09:03 -07:00
parent 92efd84f37
commit c1d359d42b
3 changed files with 41 additions and 17 deletions

View File

@ -3,6 +3,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \ LOCAL_SRC_FILES:= \
Client.cpp \ Client.cpp \
DdmConnection.cpp \
DisplayDevice.cpp \ DisplayDevice.cpp \
EventThread.cpp \ EventThread.cpp \
Layer.cpp \ Layer.cpp \
@ -39,6 +40,7 @@ endif
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
libcutils \ libcutils \
libdl \
libhardware \ libhardware \
libutils \ libutils \
libEGL \ libEGL \
@ -47,13 +49,6 @@ LOCAL_SHARED_LIBRARIES := \
libui \ libui \
libgui libgui
# this is only needed for DDMS debugging
ifneq ($(TARGET_BUILD_PDK),true)
LOCAL_SHARED_LIBRARIES += libdvm libandroid_runtime
LOCAL_CFLAGS += -DDDMS_DEBUGGING
LOCAL_SRC_FILES += DdmConnection.cpp
endif
LOCAL_MODULE:= libsurfaceflinger LOCAL_MODULE:= libsurfaceflinger
include $(BUILD_SHARED_LIBRARY) include $(BUILD_SHARED_LIBRARY)

View File

@ -14,16 +14,16 @@
* limitations under the License. * limitations under the License.
*/ */
#include <dlfcn.h>
#include <android_runtime/AndroidRuntime.h> #include <android_runtime/AndroidRuntime.h>
#include "jni.h" #include "jni.h"
#include "DdmConnection.h" #include "DdmConnection.h"
extern "C" jint Java_com_android_internal_util_WithFramework_registerNatives(
JNIEnv* env, jclass clazz);
namespace android { namespace android {
void DdmConnection::start(const char* name) { void DdmConnection::start(const char* name) {
JavaVM* vm; JavaVM* vm;
JNIEnv* env; JNIEnv* env;
@ -40,12 +40,36 @@ void DdmConnection::start(const char* name) {
args.nOptions = 1; args.nOptions = 1;
args.ignoreUnrecognized = JNI_FALSE; args.ignoreUnrecognized = JNI_FALSE;
void* libdvm_dso = dlopen("libdvm.so", RTLD_NOW);
ALOGE_IF(!libdvm_dso, "DdmConnection: %s", dlerror());
void* libandroid_runtime_dso = dlopen("libandroid_runtime.so", RTLD_NOW);
ALOGE_IF(!libandroid_runtime_dso, "DdmConnection: %s", dlerror());
if (!libdvm_dso || !libandroid_runtime_dso) {
goto error;
}
jint (*JNI_CreateJavaVM)(JavaVM** p_vm, JNIEnv** p_env, void* vm_args);
JNI_CreateJavaVM = (typeof JNI_CreateJavaVM)dlsym(libdvm_dso, "JNI_CreateJavaVM");
ALOGE_IF(!JNI_CreateJavaVM, "DdmConnection: %s", dlerror());
jint (*registerNatives)(JNIEnv* env, jclass clazz);
registerNatives = (typeof 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) { if (JNI_CreateJavaVM(&vm, &env, &args) == 0) {
jclass startClass; jclass startClass;
jmethodID startMeth; jmethodID startMeth;
// register native code // register native code
if (Java_com_android_internal_util_WithFramework_registerNatives(env, 0) == 0) { if (registerNatives(env, 0) == 0) {
// set our name by calling DdmHandleAppName.setAppName() // set our name by calling DdmHandleAppName.setAppName()
startClass = env->FindClass("android/ddm/DdmHandleAppName"); startClass = env->FindClass("android/ddm/DdmHandleAppName");
if (startClass) { if (startClass) {
@ -70,6 +94,15 @@ void DdmConnection::start(const char* name) {
} }
} }
} }
return;
error:
if (libandroid_runtime_dso) {
dlclose(libandroid_runtime_dso);
}
if (libdvm_dso) {
dlclose(libdvm_dso);
}
} }
}; // namespace android }; // namespace android

View File

@ -105,18 +105,14 @@ SurfaceFlinger::SurfaceFlinger()
property_get("debug.sf.showupdates", value, "0"); property_get("debug.sf.showupdates", value, "0");
mDebugRegion = atoi(value); mDebugRegion = atoi(value);
#ifdef DDMS_DEBUGGING
property_get("debug.sf.ddms", value, "0"); property_get("debug.sf.ddms", value, "0");
mDebugDDMS = atoi(value); mDebugDDMS = atoi(value);
if (mDebugDDMS) { if (mDebugDDMS) {
DdmConnection::start(getServiceName()); DdmConnection::start(getServiceName());
} }
#else
#warning "DDMS_DEBUGGING disabled"
#endif
ALOGI_IF(mDebugRegion, "showupdates enabled"); ALOGI_IF(mDebugRegion, "showupdates enabled");
ALOGI_IF(mDebugDDMS, "DDMS debugging enabled"); ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
} }
void SurfaceFlinger::onFirstRef() void SurfaceFlinger::onFirstRef()