Upload symbols when uploading artifacts.

R=ppi@chromium.org

Review URL: https://codereview.chromium.org/1230973004 .
diff --git a/.gitignore b/.gitignore
index ef538c9..1a5520c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,6 +31,8 @@
 /third_party/junit/src/
 /third_party/mockito/src/
 /third_party/mojo/src/mojo/public/
+/third_party/mojo_devtools/
+/third_party/pyelftools/
 /third_party/requests/src/
 /third_party/requests/src/
 /third_party/robolectric/lib/
diff --git a/DEPS b/DEPS
index 1da218b..338bb40 100644
--- a/DEPS
+++ b/DEPS
@@ -65,10 +65,16 @@
      Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '7c81740601355556e630da515b74d889ba2f8d08',
 
   'src/third_party/mojo/src/mojo/public':
-     Var('chromium_git') + '/external/github.com/domokit/mojo_sdk.git' + '@' + 'ca51a4809257c8518f224ef5af982e136db1dda0',
+     Var('chromium_git') + '/external/github.com/domokit/mojo_sdk.git' + '@' + '8502ec3f82fdb0c4068353b038410b49413616e5',
 
   'src/tools/grit':
     Var('chromium_git') + '/external/grit-i18n.git' + '@' + 'c1b1591a05209c1ad467e845ba8543c22f9072af', # from svn revision 189
+
+  'src/third_party/pyelftools':
+    Var('chromium_git') + '/chromiumos/third_party/pyelftools.git' + '@' + '19b3e610c86fcadb837d252c794cb5e8008826ae',
+
+  'src/third_party/mojo_devtools':
+    'https://github.com/domokit/devtools.git' + '@' + 'b979a23b899ea5e5ed933cc15ef445835787d9c6',
 }
 
 deps_os = {
diff --git a/claude.py b/claude.py
index 967baa6..e549742 100755
--- a/claude.py
+++ b/claude.py
@@ -119,7 +119,8 @@
   if args.dry_run:
     base_command.append('--dry-run')
   _logger.info('Uploading network service binary')
-  retcode = subprocess.call(base_command + ['network_service'])
+  retcode = subprocess.call(base_command + ['--upload-symbols',
+                                            'network_service'])
   if retcode != 0:
     return retcode
   _logger.info('Uploading network service apptests binary')
diff --git a/mojo/services/network/BUILD.gn b/mojo/services/network/BUILD.gn
index 1bdbd26..9976f8c 100644
--- a/mojo/services/network/BUILD.gn
+++ b/mojo/services/network/BUILD.gn
@@ -5,18 +5,8 @@
 import("//third_party/mojo/src/mojo/public/mojo_application.gni")
 
 if (is_android) {
-  import("//build/config/android/rules.gni")
-
-  java_library_path = "$target_out_dir/java_library.dex.jar"
-
   mojo_android_application("network") {
     output_name = "network_service"
-    input_so = "$root_out_dir/lib.stripped/libnetwork_service.so"
-    input_dex_jar = java_library_path
-  }
-
-  shared_library("native_library") {
-    output_name = "network_service"
 
     sources = [
       "android_hooks.cc",
@@ -27,12 +17,8 @@
       "//base",
       "//net",
     ]
-  }
 
-  android_standalone_library("java_library") {
-    dex_path = java_library_path
-
-    deps = [
+    java_deps = [
       "//net/android:net_java",
     ]
   }
diff --git a/tools/upload_service.py b/tools/upload_service.py
index 84aa0d2..91ab49b 100755
--- a/tools/upload_service.py
+++ b/tools/upload_service.py
@@ -4,7 +4,9 @@
 # found in the LICENSE file.
 
 import argparse
+import glob
 import imp
+import itertools
 import os
 import subprocess
 import sys
@@ -12,6 +14,14 @@
 import time
 import zipfile
 
+sys.path.append(os.path.join(os.path.dirname(__file__),
+                             os.pardir, 'third_party', 'pyelftools'))
+import elftools.elf.elffile as elffile
+
+sys.path.append(os.path.join(os.path.dirname(__file__),
+                             os.pardir, 'third_party', 'mojo_devtools'))
+import android_gdb.signatures as signatures
+
 SERVICES = ["network_service", "network_service_apptests"]
 
 # A service does not need to expose interfaces. Those that do expose interfaces
@@ -86,6 +96,17 @@
     gsutil_cp(mojom_zip_file.name, dest, dry_run)
 
 
+def upload_symbols(binary_dir, dry_run):
+  dest_dir = "gs://mojo/symbols/"
+  symbols_dir = os.path.join(binary_dir, "symbols")
+  for name in os.listdir(symbols_dir):
+    path = os.path.join(symbols_dir, name)
+    with open(path) as f:
+      signature = signatures.get_signature(f, elffile)
+      if signature is not None:
+        dest = dest_dir + signature
+        gsutil_cp(path, dest, dry_run)
+
 def upload_binary(version_name, service, binary_dir, platform, dry_run):
   dest_dir = "gs://mojo/" + service + "/" + version_name + "/" + platform + "/"
   should_zip = service in SERVICES_WITH_ZIPPED_BINARIES
@@ -140,6 +161,9 @@
       help="Indicates that this is a build with change that is not committed. "
            "The change must be uploaded to Rietveld. The script needs to be "
            "run from the branch associated with the change.")
+  parser.add_argument(
+      "--upload-symbols", action="store_true",
+      help="Indicates that this should also upload all symbols.")
   args = parser.parse_args()
 
   if args.service not in SERVICES:
@@ -164,10 +188,14 @@
   if args.linux_x64_binary_dir:
     upload_binary(version_name, args.service, args.linux_x64_binary_dir,
                   "linux-x64", args.dry_run)
+    if args.upload_symbols:
+      upload_symbols(args.linux_x64_binary_dir, args.dry_run)
 
   if args.android_arm_binary_dir:
     upload_binary(version_name, args.service, args.android_arm_binary_dir,
                   "android-arm", args.dry_run)
+    if args.upload_symbols:
+      upload_symbols(args.android_arm_binary_dir, args.dry_run)
 
   if not args.dry_run:
     print "Uploaded artifacts for version %s" % (version_name, )