base: use _NSGetExecutablePath in GetExecutablePath

Bug: http://b/31240820
Change-Id: I0dbf95d3667c7ce7b474ddbb3f8e3ed69476d13e
Test: mma && adb kill-server && adb devices
diff --git a/base/file.cpp b/base/file.cpp
index 03ce4ea..721ab2f 100644
--- a/base/file.cpp
+++ b/base/file.cpp
@@ -22,6 +22,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -31,7 +32,7 @@
 #include "utils/Compat.h"
 
 #if defined(__APPLE__)
-#import <Carbon/Carbon.h>
+#include <mach-o/dyld.h>
 #endif
 #if defined(_WIN32)
 #include <windows.h>
@@ -210,15 +211,14 @@
   android::base::Readlink("/proc/self/exe", &path);
   return path;
 #elif defined(__APPLE__)
-  // TODO: use _NSGetExecutablePath instead (http://b/31240820)?
-  CFBundleRef mainBundle = CFBundleGetMainBundle();
-  CFURLRef executableURL = CFBundleCopyExecutableURL(mainBundle);
-  CFStringRef executablePathString = CFURLCopyFileSystemPath(executableURL, kCFURLPOSIXPathStyle);
-  CFRelease(executableURL);
-
   char path[PATH_MAX + 1];
-  CFStringGetFileSystemRepresentation(executablePathString, path, sizeof(PATH_MAX)-1);
-  CFRelease(executablePathString);
+  uint32_t path_len = sizeof(path);
+  int rc = _NSGetExecutablePath(path, &path_len);
+  if (rc < 0) {
+    std::unique_ptr<char> path_buf(new char[path_len]);
+    _NSGetExecutablePath(path_buf.get(), &path_len);
+    return path_buf.get();
+  }
   return path;
 #elif defined(_WIN32)
   char path[PATH_MAX + 1];