Handle long process names correctly.

pthread_setname_np() expects 16 or fewer characters for the name argument. When the process name is longer, we should trim it.

Change-Id: I40be3a4212bdaab900c8eb30fa27aeeb7ed1b0d1
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 2093579..72a21e3 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -299,9 +299,7 @@
     }
 
     if (!niceName.isEmpty()) {
-        const char* procName = niceName.string();
-        pthread_setname_np(pthread_self(), procName);
-        runtime.setArgv0(procName);
+        runtime.setArgv0(niceName.string(), true /* setProcName */);
     }
 
     if (zygote) {
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 99cd2cf..0bacebd 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -269,7 +269,15 @@
     return jniRegisterNativeMethods(env, className, gMethods, numMethods);
 }
 
-void AndroidRuntime::setArgv0(const char* argv0) {
+void AndroidRuntime::setArgv0(const char* argv0, bool setProcName) {
+    if (setProcName) {
+        int len = strlen(argv0);
+        if (len < 15) {
+            pthread_setname_np(pthread_self(), argv0);
+        } else {
+            pthread_setname_np(pthread_self(), argv0 + len - 15);
+        }
+    }
     memset(mArgBlockStart, 0, mArgBlockLength);
     strlcpy(mArgBlockStart, argv0, mArgBlockLength);
 }
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 1c8eea7..2395ece 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -412,9 +412,7 @@
     }
 
     if (!name8.isEmpty()) {
-        const char* procName = name8.string();
-        pthread_setname_np(pthread_self(), procName);
-        AndroidRuntime::getRuntime()->setArgv0(procName);
+        AndroidRuntime::getRuntime()->setArgv0(name8.string(), true /* setProcName */);
     }
 }
 
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index 9a3b990..ed77d9a 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -44,7 +44,7 @@
         Tool,
     };
 
-    void setArgv0(const char* argv0);
+    void setArgv0(const char* argv0, bool setProcName = false);
     void addOption(const char* optionString, void* extra_info = NULL);
 
     /**