More updates to tools/android modules for compatibility with python 3.

RELNOTES: None.
PiperOrigin-RevId: 179577497
diff --git a/tools/android/aar_embedded_jars_extractor.py b/tools/android/aar_embedded_jars_extractor.py
index 393d3f4..2fa85b6 100644
--- a/tools/android/aar_embedded_jars_extractor.py
+++ b/tools/android/aar_embedded_jars_extractor.py
@@ -45,13 +45,14 @@
   if not output_dir_orig:
     output_dir_orig = output_dir
   jar_pattern = re.compile("^(classes|libs/.+)\\.jar$")
-  singlejar_param_file.write("--exclude_build_data\n")
+  singlejar_param_file.write(b"--exclude_build_data\n")
   for name in aar.namelist():
     if jar_pattern.match(name):
-      singlejar_param_file.write("--sources\n")
+      singlejar_param_file.write(b"--sources\n")
       # output_dir may be a temporary junction, so write the original
       # (unshortened) path to the params file
-      singlejar_param_file.write(output_dir_orig + "/" + name + "\n")
+      singlejar_param_file.write(
+          (output_dir_orig + "/" + name + "\n").encode("utf-8"))
       aar.extract(name, output_dir)
 
 
@@ -62,7 +63,7 @@
   if not output_dir_orig:
     output_dir_orig = output_dir
   with zipfile.ZipFile(input_aar, "r") as aar:
-    with open(output_singlejar_param_file, "w") as singlejar_param_file:
+    with open(output_singlejar_param_file, "wb") as singlejar_param_file:
       ExtractEmbeddedJars(aar, singlejar_param_file, output_dir,
                           output_dir_orig)
 
diff --git a/tools/android/aar_embedded_jars_extractor_test.py b/tools/android/aar_embedded_jars_extractor_test.py
index 30f150e..6b63520 100644
--- a/tools/android/aar_embedded_jars_extractor_test.py
+++ b/tools/android/aar_embedded_jars_extractor_test.py
@@ -14,9 +14,9 @@
 
 """Tests for aar_embedded_jars_extractor."""
 
+import io
 import os
 import shutil
-import StringIO
 import unittest
 import zipfile
 
@@ -26,6 +26,12 @@
 class AarEmbeddedJarsExtractor(unittest.TestCase):
   """Unit tests for aar_embedded_jars_extractor.py."""
 
+  # Python 2 alias
+  if not hasattr(unittest.TestCase, "assertCountEqual"):
+
+    def assertCountEqual(self, *args):
+      return self.assertItemsEqual(*args)
+
   def setUp(self):
     os.chdir(os.environ["TEST_TMPDIR"])
 
@@ -33,47 +39,47 @@
     shutil.rmtree("out_dir")
 
   def testNoJars(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
-    param_file = StringIO.StringIO()
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
+    param_file = io.BytesIO()
     os.makedirs("out_dir")
     aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir")
     self.assertEqual([], os.listdir("out_dir"))
     param_file.seek(0)
-    self.assertEqual("--exclude_build_data\n", param_file.read())
+    self.assertEqual(b"--exclude_build_data\n", param_file.read())
 
   def testClassesJarAndLibsJars(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
     aar.writestr("classes.jar", "")
     aar.writestr("libs/a.jar", "")
     aar.writestr("libs/b.jar", "")
-    param_file = StringIO.StringIO()
+    param_file = io.BytesIO()
     os.makedirs("out_dir")
     aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir")
-    self.assertItemsEqual(["classes.jar", "libs"], os.listdir("out_dir"))
-    self.assertItemsEqual(["a.jar", "b.jar"], os.listdir("out_dir/libs"))
+    self.assertCountEqual(["classes.jar", "libs"], os.listdir("out_dir"))
+    self.assertCountEqual(["a.jar", "b.jar"], os.listdir("out_dir/libs"))
     param_file.seek(0)
     self.assertEqual(
-        ["--exclude_build_data\n",
-         "--sources\n",
-         "out_dir/classes.jar\n",
-         "--sources\n",
-         "out_dir/libs/a.jar\n",
-         "--sources\n",
-         "out_dir/libs/b.jar\n"],
+        [b"--exclude_build_data\n",
+         b"--sources\n",
+         b"out_dir/classes.jar\n",
+         b"--sources\n",
+         b"out_dir/libs/a.jar\n",
+         b"--sources\n",
+         b"out_dir/libs/b.jar\n"],
         param_file.readlines())
 
   def testOnlyClassesJar(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
     aar.writestr("classes.jar", "")
-    param_file = StringIO.StringIO()
+    param_file = io.BytesIO()
     os.makedirs("out_dir")
     aar_embedded_jars_extractor.ExtractEmbeddedJars(aar, param_file, "out_dir")
     self.assertEqual(["classes.jar"], os.listdir("out_dir"))
     param_file.seek(0)
     self.assertEqual(
-        ["--exclude_build_data\n",
-         "--sources\n",
-         "out_dir/classes.jar\n"],
+        [b"--exclude_build_data\n",
+         b"--sources\n",
+         b"out_dir/classes.jar\n"],
         param_file.readlines())
 
 
diff --git a/tools/android/aar_native_libs_zip_creator.py b/tools/android/aar_native_libs_zip_creator.py
index 88b9db3..0348418 100644
--- a/tools/android/aar_native_libs_zip_creator.py
+++ b/tools/android/aar_native_libs_zip_creator.py
@@ -20,6 +20,8 @@
 directory structure of /lib/<cpu>/foo.so.
 """
 
+from __future__ import print_function
+
 import os
 import re
 import sys
@@ -63,8 +65,8 @@
       try:
         CreateNativeLibsZip(input_aar, cpu, native_libs_zip)
       except UnsupportedArchitectureException:
-        print(("AAR " + input_aar_path_for_error_msg +
-               " missing native libs for requested architecture: " + cpu))
+        print("AAR " + input_aar_path_for_error_msg +
+              " missing native libs for requested architecture: " + cpu)
         sys.exit(1)
 
 
diff --git a/tools/android/aar_native_libs_zip_creator_test.py b/tools/android/aar_native_libs_zip_creator_test.py
index 0e0210e..3ec71a6 100644
--- a/tools/android/aar_native_libs_zip_creator_test.py
+++ b/tools/android/aar_native_libs_zip_creator_test.py
@@ -14,7 +14,7 @@
 
 """Tests for aar_native_libs_zip_creator."""
 
-import StringIO
+import io
 import unittest
 import zipfile
 
@@ -25,25 +25,25 @@
   """Unit tests for aar_native_libs_zip_creator.py."""
 
   def testAarWithNoLibs(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
-    outzip = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
+    outzip = zipfile.ZipFile(io.BytesIO(), "w")
     aar_native_libs_zip_creator.CreateNativeLibsZip(aar, "x86", outzip)
     self.assertEquals([], outzip.namelist())
 
   def testAarWithMissingLibs(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
     aar.writestr("jni/armeabi/foo.so", "")
-    outzip = zipfile.ZipFile(StringIO.StringIO(), "w")
+    outzip = zipfile.ZipFile(io.BytesIO(), "w")
     self.assertRaises(
         aar_native_libs_zip_creator.UnsupportedArchitectureException,
         aar_native_libs_zip_creator.CreateNativeLibsZip,
         aar, "x86", outzip)
 
   def testAarWithAllLibs(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
     aar.writestr("jni/x86/foo.so", "")
     aar.writestr("jni/armeabi/foo.so", "")
-    outzip = zipfile.ZipFile(StringIO.StringIO(), "w")
+    outzip = zipfile.ZipFile(io.BytesIO(), "w")
     aar_native_libs_zip_creator.CreateNativeLibsZip(aar, "x86", outzip)
     self.assertIn("lib/x86/foo.so", outzip.namelist())
     self.assertNotIn("lib/armeabi/foo.so", outzip.namelist())
diff --git a/tools/android/aar_resources_extractor.py b/tools/android/aar_resources_extractor.py
index 61f9f4d..5d875fb 100644
--- a/tools/android/aar_resources_extractor.py
+++ b/tools/android/aar_resources_extractor.py
@@ -78,11 +78,11 @@
       with junction.TempJunction(os.path.dirname(empty_xml_filename)) as junc:
         xmlpath = os.path.join(junc, os.path.basename(empty_xml_filename))
         with open(xmlpath, "wb") as empty_xml:
-          empty_xml.write("<resources/>")
+          empty_xml.write(b"<resources/>")
     else:
       os.makedirs(os.path.dirname(empty_xml_filename))
       with open(empty_xml_filename, "wb") as empty_xml:
-        empty_xml.write("<resources/>")
+        empty_xml.write(b"<resources/>")
 
 
 def main():
diff --git a/tools/android/aar_resources_extractor_test.py b/tools/android/aar_resources_extractor_test.py
index d5f630b..ba93c32 100644
--- a/tools/android/aar_resources_extractor_test.py
+++ b/tools/android/aar_resources_extractor_test.py
@@ -14,9 +14,9 @@
 
 """Tests for aar_resources_extractor."""
 
+import io
 import os
 import shutil
-import StringIO
 import unittest
 import zipfile
 
@@ -30,6 +30,12 @@
 class AarResourcesExtractorTest(unittest.TestCase):
   """Unit tests for aar_resources_extractor.py."""
 
+  # Python 2 alias
+  if not hasattr(unittest.TestCase, "assertCountEqual"):
+
+    def assertCountEqual(self, *args):
+      return self.assertItemsEqual(*args)
+
   def setUp(self):
     os.chdir(os.environ["TEST_TMPDIR"])
 
@@ -43,7 +49,7 @@
     ]
 
   def testNoResources(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
     os.makedirs("out_dir")
     aar_resources_extractor.ExtractResources(aar, "out_dir")
     self.assertEqual([_HostPath("out_dir/res/values/empty.xml")],
@@ -52,7 +58,7 @@
       self.assertEqual("<resources/>", empty_xml.read())
 
   def testContainsResources(self):
-    aar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    aar = zipfile.ZipFile(io.BytesIO(), "w")
     aar.writestr("res/values/values.xml", "some values")
     aar.writestr("res/layouts/layout.xml", "some layout")
     os.makedirs("out_dir")
@@ -61,7 +67,7 @@
         _HostPath("out_dir/res/values/values.xml"),
         _HostPath("out_dir/res/layouts/layout.xml")
     ]
-    self.assertItemsEqual(expected_resources, self.DirContents("out_dir"))
+    self.assertCountEqual(expected_resources, self.DirContents("out_dir"))
     with open("out_dir/res/values/values.xml", "r") as values_xml:
       self.assertEqual("some values", values_xml.read())
     with open("out_dir/res/layouts/layout.xml", "r") as layout_xml:
diff --git a/tools/android/build_incremental_dexmanifest.py b/tools/android/build_incremental_dexmanifest.py
index 6c372656..e912d62 100644
--- a/tools/android/build_incremental_dexmanifest.py
+++ b/tools/android/build_incremental_dexmanifest.py
@@ -121,7 +121,7 @@
         self.AddDex(input_filename, None, input_filename)
 
     with open(argv[0], "wb") as manifest:
-      manifest.write("\n".join(self.manifest_lines))
+      manifest.write(("\n".join(self.manifest_lines)).encode("utf-8"))
 
 
 def main(argv):
diff --git a/tools/android/incremental_install.py b/tools/android/incremental_install.py
index bad2e29..254db27 100644
--- a/tools/android/incremental_install.py
+++ b/tools/android/incremental_install.py
@@ -221,7 +221,7 @@
     """Push a given string to a given path on the device in parallel."""
     local = self._CreateLocalFile()
     with open(local, "wb") as f:
-      f.write(contents)
+      f.write(contents.encode("utf-8"))
     return self.Push(local, remote)
 
   def Pull(self, remote):
@@ -237,7 +237,7 @@
     try:
       self._Exec(["pull", remote, local])
       with open(local, "rb") as f:
-        return f.read()
+        return f.read().decode("utf-8")
     except (AdbError, IOError):
       return None
 
@@ -339,7 +339,7 @@
 def GetAppPackage(stub_datafile):
   """Returns the app package specified in a stub data file."""
   with open(stub_datafile, "rb") as f:
-    return f.readlines()[1].strip()
+    return f.readlines()[1].decode("utf-8").strip()
 
 
 def UploadDexes(adb, execroot, app_dir, temp_dir, dexmanifest, full_install):
@@ -605,7 +605,7 @@
     f.result()
 
   install_manifest = [
-      name + " " + checksum for name, checksum in install_checksums.iteritems()]
+      name + " " + checksum for name, checksum in install_checksums.items()]
   adb.PushString("\n".join(install_manifest),
                  targetpath.join(app_dir, "native",
                                  "native_manifest")).result()
@@ -693,7 +693,7 @@
     adb.InstallMultiple(targetpath.join(execroot, apk), app_package)
 
   install_manifest = [
-      name + " " + checksum for name, checksum in install_checksums.iteritems()]
+      name + " " + checksum for name, checksum in install_checksums.items()]
   adb.PushString("\n".join(install_manifest),
                  targetpath.join(app_dir, "split_manifest")).result()
 
@@ -744,7 +744,7 @@
         VerifyInstallTimestamp(adb, app_package)
 
       with open(hostpath.join(execroot, dexmanifest), "rb") as f:
-        dexmanifest = f.read()
+        dexmanifest = f.read().decode("utf-8")
       UploadDexes(adb, execroot, app_dir, temp_dir, dexmanifest, bool(apk))
       # TODO(ahumesky): UploadDexes waits for all the dexes to be uploaded, and
       # then UploadResources is called. We could instead enqueue everything
@@ -776,16 +776,16 @@
     sys.exit("Error: Device unauthorized. Please check the confirmation "
              "dialog on your device.")
   except MultipleDevicesError as e:
-    sys.exit("Error: " + e.message + "\nTry specifying a device serial with "
+    sys.exit("Error: " + str(e) + "\nTry specifying a device serial with "
              "\"blaze mobile-install --adb_arg=-s --adb_arg=$ANDROID_SERIAL\"")
   except OldSdkException as e:
     sys.exit("Error: The device does not support the API level specified in "
              "the application's manifest. Check minSdkVersion in "
              "AndroidManifest.xml")
   except TimestampException as e:
-    sys.exit("Error:\n%s" % e.message)
+    sys.exit("Error:\n%s" % str(e))
   except AdbError as e:
-    sys.exit("Error:\n%s" % e.message)
+    sys.exit("Error:\n%s" % str(e))
   finally:
     shutil.rmtree(temp_dir, True)
 
diff --git a/tools/android/incremental_install_test.py b/tools/android/incremental_install_test.py
index 1181a59..5eee83f 100644
--- a/tools/android/incremental_install_test.py
+++ b/tools/android/incremental_install_test.py
@@ -49,7 +49,7 @@
     if cmd == "push":
       # "/test/adb push local remote"
       with open(args[2], "rb") as f:
-        content = f.read()
+        content = f.read().decode("utf-8")
       self.files[args[3]] = content
     elif cmd == "pull":
       # "/test/adb pull remote local"
@@ -58,7 +58,7 @@
       content = self.files.get(remote)
       if content is not None:
         with open(local, "wb") as f:
-          f.write(content)
+          f.write(content.encode("utf-8"))
       else:
         returncode = 1
         stderr = "remote object '%s' does not exist\n" % remote
@@ -69,7 +69,7 @@
     elif cmd == "install-multiple":
       if args[3] == "-p":
         with open(args[5], "rb") as f:
-          content = f.read()
+          content = f.read().decode("utf-8")
         self.split_apks.add(content)
       else:
         self.package_timestamp = self._last_package_timestamp
@@ -133,11 +133,12 @@
 
     # Write the stub datafile which contains the package name of the app.
     with open(self._STUB_DATAFILE, "wb") as f:
-      f.write("\n".join([self._OLD_APP_PACKGE, self._APP_PACKAGE]))
+      f.write(("\n".join([self._OLD_APP_PACKGE, self._APP_PACKAGE]))
+              .encode("utf-8"))
 
     # Write the local resource apk file.
     with open(self._RESOURCE_APK, "wb") as f:
-      f.write("resource apk")
+      f.write(b"resource apk")
 
     # Mock out subprocess.Popen to use our mock adb.
     self._popen_patch = mock.patch.object(incremental_install, "subprocess")
@@ -157,7 +158,7 @@
   def _CreateLocalManifest(self, *lines):
     content = "\n".join(lines)
     with open(self._DEXMANIFEST, "wb") as f:
-      f.write(content)
+      f.write(content.encode("utf-8"))
     return content
 
   def _CreateRemoteManifest(self, *lines):
@@ -205,7 +206,7 @@
     self._CreateZip()
 
     with open("dex1", "wb") as f:
-      f.write("content3")
+      f.write(b"content3")
 
     manifest = self._CreateLocalManifest(
         "zip1 zp1 ip1 0",
@@ -224,10 +225,10 @@
 
   def testSplitInstallToPristineDevice(self):
     with open("split1", "wb") as f:
-      f.write("split_content1")
+      f.write(b"split_content1")
 
     with open("main", "wb") as f:
-      f.write("main_Content")
+      f.write(b"main_Content")
 
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
@@ -235,10 +236,10 @@
 
   def testSplitInstallUnchanged(self):
     with open("split1", "wb") as f:
-      f.write("split_content1")
+      f.write(b"split_content1")
 
     with open("main", "wb") as f:
-      f.write("main_Content")
+      f.write(b"main_Content")
 
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
@@ -250,17 +251,17 @@
 
   def testSplitInstallChanges(self):
     with open("split1", "wb") as f:
-      f.write("split_content1")
+      f.write(b"split_content1")
 
     with open("main", "wb") as f:
-      f.write("main_Content")
+      f.write(b"main_Content")
 
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
     self.assertEqual(set(["split_content1"]), self._mock_adb.split_apks)
 
     with open("split1", "wb") as f:
-      f.write("split_content2")
+      f.write(b"split_content2")
     self._mock_adb.split_apks = set()
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
@@ -269,7 +270,7 @@
   def testMissingNativeManifestWithIncrementalInstall(self):
     self._CreateZip()
     with open("liba.so", "wb") as f:
-      f.write("liba_1")
+      f.write(b"liba_1")
 
     # Upload a library to the device.
     native_libs = ["armeabi-v7a:liba.so"]
@@ -285,7 +286,7 @@
   def testNonIncrementalInstallOverwritesNativeLibs(self):
     self._CreateZip()
     with open("liba.so", "wb") as f:
-      f.write("liba_1")
+      f.write(b"liba_1")
 
     # Upload a library to the device.
     native_libs = ["armeabi-v7a:liba.so"]
@@ -305,7 +306,7 @@
   def testNativeAbiCompatibility(self):
     self._CreateZip()
     with open("liba.so", "wb") as f:
-      f.write("liba")
+      f.write(b"liba")
 
     native_libs = ["armeabi:liba.so"]
     self._mock_adb.SetAbi("arm64-v8a")
@@ -315,9 +316,9 @@
   def testUploadNativeLibs(self):
     self._CreateZip()
     with open("liba.so", "wb") as f:
-      f.write("liba_1")
+      f.write(b"liba_1")
     with open("libb.so", "wb") as f:
-      f.write("libb_1")
+      f.write(b"libb_1")
 
     native_libs = ["armeabi-v7a:liba.so", "armeabi-v7a:libb.so"]
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
@@ -326,7 +327,7 @@
 
     # Change a library
     with open("libb.so", "wb") as f:
-      f.write("libb_2")
+      f.write(b"libb_2")
     self._CallIncrementalInstall(incremental=True, native_libs=native_libs)
     self.assertEqual("libb_2", self._GetDeviceFile("native/libb.so"))
 
@@ -520,7 +521,7 @@
     self._CreateZip()
 
     with open("dex1", "wb") as f:
-      f.write("content3")
+      f.write(b"content3")
 
     self._CreateLocalManifest(
         "zip1 zp1 ip1 0",
@@ -536,7 +537,7 @@
     self._CreateZip()
 
     with open("dex1", "wb") as f:
-      f.write("content3")
+      f.write(b"content3")
 
     self._CreateLocalManifest(
         "zip1 zp1 ip1 0",
diff --git a/tools/android/merge_manifests.py b/tools/android/merge_manifests.py
index a12e538..520b032 100644
--- a/tools/android/merge_manifests.py
+++ b/tools/android/merge_manifests.py
@@ -379,7 +379,7 @@
       self._MergeTopLevelNamespaces(mergee_dom)
 
       for destination, values in sorted(
-          self._NODES_TO_COPY_FROM_MERGEE.iteritems()):
+          self._NODES_TO_COPY_FROM_MERGEE.items()):
         for node_to_copy in values:
           for node in mergee_dom.getElementsByTagName(node_to_copy):
             if self._IsDuplicate(node_to_copy, node):
diff --git a/tools/android/resource_extractor_test.py b/tools/android/resource_extractor_test.py
index de5b6a8..ae7a5a6 100644
--- a/tools/android/resource_extractor_test.py
+++ b/tools/android/resource_extractor_test.py
@@ -14,7 +14,7 @@
 
 """Tests for resource_extractor."""
 
-import StringIO
+import io
 import unittest
 import zipfile
 
@@ -24,8 +24,14 @@
 class ResourceExtractorTest(unittest.TestCase):
   """Unit tests for resource_extractor.py."""
 
+  # Python 2 alias
+  if not hasattr(unittest.TestCase, "assertCountEqual"):
+
+    def assertCountEqual(self, *args):
+      return self.assertItemsEqual(*args)
+
   def testJarWithEverything(self):
-    input_jar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    input_jar = zipfile.ZipFile(io.BytesIO(), "w")
 
     for path in (
         # Should not be included
@@ -56,17 +62,17 @@
         "not_CVS/include",
         "META-INF/services/foo"):
       input_jar.writestr(path, "")
-    output_zip = zipfile.ZipFile(StringIO.StringIO(), "w")
+    output_zip = zipfile.ZipFile(io.BytesIO(), "w")
     resource_extractor.ExtractResources(input_jar, output_zip)
-    self.assertItemsEqual(("c", "a/b", "bar/a", "a/not_package.html",
+    self.assertCountEqual(("c", "a/b", "bar/a", "a/not_package.html",
                            "not_CVS/include", "META-INF/services/foo"),
                           output_zip.namelist())
 
   def testTimestampsAreTheSame(self):
-    input_jar = zipfile.ZipFile(StringIO.StringIO(), "w")
+    input_jar = zipfile.ZipFile(io.BytesIO(), "w")
     entry_info = zipfile.ZipInfo("a", (1982, 1, 1, 0, 0, 0))
     input_jar.writestr(entry_info, "")
-    output_zip = zipfile.ZipFile(StringIO.StringIO(), "w")
+    output_zip = zipfile.ZipFile(io.BytesIO(), "w")
     resource_extractor.ExtractResources(input_jar, output_zip)
     self.assertEqual((1982, 1, 1, 0, 0, 0), output_zip.getinfo("a").date_time)