Android,tools: open all files in binary mode

Always open files in binary mode to avoid
automatic conversion between LF and CRLF on
Windows, which is particularly problematic when a
file is written on Windows but consumed on Android
or when a binary file is opened for reading in
text mode and if it happens to have an LF byte it
would be converted to CRLF.

See https://github.com/bazelbuild/bazel/issues/3264

Change-Id: I4d9d885a488b9693eeb3f6d929e3396ef8406d62
PiperOrigin-RevId: 164826587
diff --git a/tools/android/aar_embedded_jars_extractor.py b/tools/android/aar_embedded_jars_extractor.py
index e631c48..305d38a 100644
--- a/tools/android/aar_embedded_jars_extractor.py
+++ b/tools/android/aar_embedded_jars_extractor.py
@@ -1,3 +1,4 @@
+# pylint: disable=g-direct-third-party-import
 # Copyright 2016 The Bazel Authors. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -46,8 +47,8 @@
 
 
 def main():
-  with zipfile.ZipFile(FLAGS.input_aar, "r") as aar:
-    with open(FLAGS.output_singlejar_param_file, "w") as singlejar_param_file:
+  with zipfile.ZipFile(FLAGS.input_aar, "rb") as aar:
+    with open(FLAGS.output_singlejar_param_file, "wb") as singlejar_param_file:
       ExtractEmbeddedJars(aar, singlejar_param_file, FLAGS.output_dir)
 
 if __name__ == "__main__":
diff --git a/tools/android/build_incremental_dexmanifest.py b/tools/android/build_incremental_dexmanifest.py
index 2fe4bfa..6c372656 100644
--- a/tools/android/build_incremental_dexmanifest.py
+++ b/tools/android/build_incremental_dexmanifest.py
@@ -58,7 +58,7 @@
   def Checksum(self, filename):
     """Compute the SHA-256 checksum of a file."""
     h = hashlib.sha256()
-    with file(filename, "r") as f:
+    with open(filename, "rb") as f:
       while True:
         data = f.read(65536)
         if not data:
@@ -99,7 +99,7 @@
     if argv[0][0] == "@":
       if len(argv) != 1:
         raise IOError("A parameter file should be the only argument")
-      with file(argv[0][1:]) as param_file:
+      with open(argv[0][1:]) as param_file:
         argv = [a.strip() for a in param_file.readlines()]
 
     for input_filename in argv[1:]:
@@ -120,7 +120,7 @@
       elif input_filename.endswith(".dex"):
         self.AddDex(input_filename, None, input_filename)
 
-    with file(argv[0], "w") as manifest:
+    with open(argv[0], "wb") as manifest:
       manifest.write("\n".join(self.manifest_lines))
 
 
diff --git a/tools/android/build_split_manifest.py b/tools/android/build_split_manifest.py
index c791e3a..8c4529d 100644
--- a/tools/android/build_split_manifest.py
+++ b/tools/android/build_split_manifest.py
@@ -1,3 +1,4 @@
+# pylint: disable=g-direct-third-party-import
 # Copyright 2015 The Bazel Authors. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -92,12 +93,10 @@
 
 def main():
   split_manifest = BuildSplitManifest(
-      file(FLAGS.main_manifest).read(),
-      FLAGS.override_package,
-      FLAGS.split,
-      FLAGS.hascode)
+      open(FLAGS.main_manifest, "rb").read(), FLAGS.override_package,
+      FLAGS.split, FLAGS.hascode)
 
-  with file(FLAGS.split_manifest, "w") as output_xml:
+  with open(FLAGS.split_manifest, "wb") as output_xml:
     output_xml.write(split_manifest)
 
 
diff --git a/tools/android/incremental_install.py b/tools/android/incremental_install.py
index b1b91c9..12a2c7e 100644
--- a/tools/android/incremental_install.py
+++ b/tools/android/incremental_install.py
@@ -218,7 +218,7 @@
   def PushString(self, contents, remote):
     """Push a given string to a given path on the device in parallel."""
     local = self._CreateLocalFile()
-    with file(local, "w") as f:
+    with open(local, "wb") as f:
       f.write(contents)
     return self.Push(local, remote)
 
@@ -234,7 +234,7 @@
     local = self._CreateLocalFile()
     try:
       self._Exec(["pull", remote, local])
-      with file(local) as f:
+      with open(local, "rb") as f:
         return f.read()
     except (AdbError, IOError):
       return None
@@ -336,7 +336,7 @@
 
 def GetAppPackage(stub_datafile):
   """Returns the app package specified in a stub data file."""
-  with file(stub_datafile) as f:
+  with open(stub_datafile, "rb") as f:
     return f.readlines()[1].strip()
 
 
@@ -455,7 +455,7 @@
 def Checksum(filename):
   """Compute the SHA-256 checksum of a file."""
   h = hashlib.sha256()
-  with file(filename, "r") as f:
+  with open(filename, "rb") as f:
     while True:
       data = f.read(65536)
       if not data:
@@ -731,7 +731,7 @@
       if not apk:
         VerifyInstallTimestamp(adb, app_package)
 
-      with file(hostpath.join(execroot, dexmanifest)) as f:
+      with open(hostpath.join(execroot, dexmanifest), "rb") as f:
         dexmanifest = f.read()
       UploadDexes(adb, execroot, app_dir, temp_dir, dexmanifest, bool(apk))
       # TODO(ahumesky): UploadDexes waits for all the dexes to be uploaded, and
@@ -756,7 +756,7 @@
       logging.info("Starting application %s", app_package)
       adb.StartApp(app_package, start_type)
 
-    with file(output_marker, "w") as _:
+    with open(output_marker, "wb") as _:
       pass
   except DeviceNotFoundError:
     sys.exit("Error: Device not found")
@@ -811,7 +811,7 @@
   FLAGS(sys.argv)
   # process any additional flags in --flagfile
   if FLAGS.flagfile:
-    with open(FLAGS.flagfile) as flagsfile:
+    with open(FLAGS.flagfile, "rb") as flagsfile:
       FLAGS.Reset()
       FLAGS(sys.argv + [line.strip() for line in flagsfile.readlines()])
 
diff --git a/tools/android/incremental_install_test.py b/tools/android/incremental_install_test.py
index 46ceb3e..1181a59 100644
--- a/tools/android/incremental_install_test.py
+++ b/tools/android/incremental_install_test.py
@@ -1,3 +1,4 @@
+# pylint: disable=g-direct-third-party-import
 # Copyright 2015 The Bazel Authors. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -47,7 +48,7 @@
     cmd = args[1]
     if cmd == "push":
       # "/test/adb push local remote"
-      with open(args[2]) as f:
+      with open(args[2], "rb") as f:
         content = f.read()
       self.files[args[3]] = content
     elif cmd == "pull":
@@ -56,7 +57,7 @@
       local = args[3]
       content = self.files.get(remote)
       if content is not None:
-        with open(local, "w") as f:
+        with open(local, "wb") as f:
           f.write(content)
       else:
         returncode = 1
@@ -67,7 +68,7 @@
       return self._CreatePopenMock(0, "Success", "")
     elif cmd == "install-multiple":
       if args[3] == "-p":
-        with open(args[5]) as f:
+        with open(args[5], "rb") as f:
           content = f.read()
         self.split_apks.add(content)
       else:
@@ -131,11 +132,11 @@
     self._mock_adb = MockAdb()
 
     # Write the stub datafile which contains the package name of the app.
-    with open(self._STUB_DATAFILE, "w") as f:
+    with open(self._STUB_DATAFILE, "wb") as f:
       f.write("\n".join([self._OLD_APP_PACKGE, self._APP_PACKAGE]))
 
     # Write the local resource apk file.
-    with open(self._RESOURCE_APK, "w") as f:
+    with open(self._RESOURCE_APK, "wb") as f:
       f.write("resource apk")
 
     # Mock out subprocess.Popen to use our mock adb.
@@ -155,7 +156,7 @@
 
   def _CreateLocalManifest(self, *lines):
     content = "\n".join(lines)
-    with open(self._DEXMANIFEST, "w") as f:
+    with open(self._DEXMANIFEST, "wb") as f:
       f.write(content)
     return content
 
@@ -203,7 +204,7 @@
   def testUploadToPristineDevice(self):
     self._CreateZip()
 
-    with open("dex1", "w") as f:
+    with open("dex1", "wb") as f:
       f.write("content3")
 
     manifest = self._CreateLocalManifest(
@@ -215,119 +216,119 @@
 
     resources_checksum_path = self._GetDeviceAppPath("resources_checksum")
     self.assertTrue(resources_checksum_path in self._mock_adb.files)
-    self.assertEquals(manifest, self._GetDeviceFile("dex/manifest"))
-    self.assertEquals("content1", self._GetDeviceFile("dex/ip1"))
-    self.assertEquals("content2", self._GetDeviceFile("dex/ip2"))
-    self.assertEquals("content3", self._GetDeviceFile("dex/ip3"))
-    self.assertEquals("resource apk", self._GetDeviceFile("resources.ap_"))
+    self.assertEqual(manifest, self._GetDeviceFile("dex/manifest"))
+    self.assertEqual("content1", self._GetDeviceFile("dex/ip1"))
+    self.assertEqual("content2", self._GetDeviceFile("dex/ip2"))
+    self.assertEqual("content3", self._GetDeviceFile("dex/ip3"))
+    self.assertEqual("resource apk", self._GetDeviceFile("resources.ap_"))
 
   def testSplitInstallToPristineDevice(self):
-    with open("split1", "w") as f:
+    with open("split1", "wb") as f:
       f.write("split_content1")
 
-    with open("main", "w") as f:
+    with open("main", "wb") as f:
       f.write("main_Content")
 
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
-    self.assertEquals(set(["split_content1"]), self._mock_adb.split_apks)
+    self.assertEqual(set(["split_content1"]), self._mock_adb.split_apks)
 
   def testSplitInstallUnchanged(self):
-    with open("split1", "w") as f:
+    with open("split1", "wb") as f:
       f.write("split_content1")
 
-    with open("main", "w") as f:
+    with open("main", "wb") as f:
       f.write("main_Content")
 
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
-    self.assertEquals(set(["split_content1"]), self._mock_adb.split_apks)
+    self.assertEqual(set(["split_content1"]), self._mock_adb.split_apks)
     self._mock_adb.split_apks = set()
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
-    self.assertEquals(set([]), self._mock_adb.split_apks)
+    self.assertEqual(set([]), self._mock_adb.split_apks)
 
   def testSplitInstallChanges(self):
-    with open("split1", "w") as f:
+    with open("split1", "wb") as f:
       f.write("split_content1")
 
-    with open("main", "w") as f:
+    with open("main", "wb") as f:
       f.write("main_Content")
 
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
-    self.assertEquals(set(["split_content1"]), self._mock_adb.split_apks)
+    self.assertEqual(set(["split_content1"]), self._mock_adb.split_apks)
 
-    with open("split1", "w") as f:
+    with open("split1", "wb") as f:
       f.write("split_content2")
     self._mock_adb.split_apks = set()
     self._CallIncrementalInstall(
         incremental=False, split_main_apk="main", split_apks=["split1"])
-    self.assertEquals(set(["split_content2"]), self._mock_adb.split_apks)
+    self.assertEqual(set(["split_content2"]), self._mock_adb.split_apks)
 
   def testMissingNativeManifestWithIncrementalInstall(self):
     self._CreateZip()
-    with open("liba.so", "w") as f:
+    with open("liba.so", "wb") as f:
       f.write("liba_1")
 
     # Upload a library to the device.
     native_libs = ["armeabi-v7a:liba.so"]
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
-    self.assertEquals("liba_1", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("liba_1", self._GetDeviceFile("native/liba.so"))
 
     # Delete the manifest, overwrite the library and check that even an
     # incremental install straightens things out.
     self._PutDeviceFile("native/liba.so", "GARBAGE")
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
-    self.assertEquals("liba_1", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("liba_1", self._GetDeviceFile("native/liba.so"))
 
   def testNonIncrementalInstallOverwritesNativeLibs(self):
     self._CreateZip()
-    with open("liba.so", "w") as f:
+    with open("liba.so", "wb") as f:
       f.write("liba_1")
 
     # Upload a library to the device.
     native_libs = ["armeabi-v7a:liba.so"]
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
-    self.assertEquals("liba_1", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("liba_1", self._GetDeviceFile("native/liba.so"))
 
     # Change a library on the device. Incremental install should not replace the
     # changed file, because it only checks the manifest.
     self._PutDeviceFile("native/liba.so", "GARBAGE")
     self._CallIncrementalInstall(incremental=True, native_libs=native_libs)
-    self.assertEquals("GARBAGE", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("GARBAGE", self._GetDeviceFile("native/liba.so"))
 
     # However, a full install should overwrite it.
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
-    self.assertEquals("liba_1", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("liba_1", self._GetDeviceFile("native/liba.so"))
 
   def testNativeAbiCompatibility(self):
     self._CreateZip()
-    with open("liba.so", "w") as f:
+    with open("liba.so", "wb") as f:
       f.write("liba")
 
     native_libs = ["armeabi:liba.so"]
     self._mock_adb.SetAbi("arm64-v8a")
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
-    self.assertEquals("liba", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("liba", self._GetDeviceFile("native/liba.so"))
 
   def testUploadNativeLibs(self):
     self._CreateZip()
-    with open("liba.so", "w") as f:
+    with open("liba.so", "wb") as f:
       f.write("liba_1")
-    with open("libb.so", "w") as f:
+    with open("libb.so", "wb") as f:
       f.write("libb_1")
 
     native_libs = ["armeabi-v7a:liba.so", "armeabi-v7a:libb.so"]
     self._CallIncrementalInstall(incremental=False, native_libs=native_libs)
-    self.assertEquals("liba_1", self._GetDeviceFile("native/liba.so"))
-    self.assertEquals("libb_1", self._GetDeviceFile("native/libb.so"))
+    self.assertEqual("liba_1", self._GetDeviceFile("native/liba.so"))
+    self.assertEqual("libb_1", self._GetDeviceFile("native/libb.so"))
 
     # Change a library
-    with open("libb.so", "w") as f:
+    with open("libb.so", "wb") as f:
       f.write("libb_2")
     self._CallIncrementalInstall(incremental=True, native_libs=native_libs)
-    self.assertEquals("libb_2", self._GetDeviceFile("native/libb.so"))
+    self.assertEqual("libb_2", self._GetDeviceFile("native/libb.so"))
 
     # Delete a library
     self._CallIncrementalInstall(
@@ -337,7 +338,7 @@
 
     # Add the deleted library back
     self._CallIncrementalInstall(incremental=True, native_libs=native_libs)
-    self.assertEquals("libb_2", self._GetDeviceFile("native/libb.so"))
+    self.assertEqual("libb_2", self._GetDeviceFile("native/libb.so"))
 
   def testUploadWithOneChangedFile(self):
     # Existing manifest from a previous install.
@@ -366,8 +367,8 @@
     # We just want to make sure that only one file was updated, so to
     # distinguish that we force the local and remote content to be different but
     # keep the checksum the same.
-    self.assertEquals("old content1", self._GetDeviceFile("dex/ip1"))
-    self.assertEquals("content2", self._GetDeviceFile("dex/ip2"))
+    self.assertEqual("old content1", self._GetDeviceFile("dex/ip1"))
+    self.assertEqual("content2", self._GetDeviceFile("dex/ip2"))
 
   def testFullUploadWithOneChangedFile(self):
 
@@ -392,8 +393,8 @@
     # Even though the checksums for ip1 were the same, the file still got
     # updated. This is a bit of a dishonest test because the local and remote
     # content for ip1 were different, but their checksums were the same.
-    self.assertEquals("content1", self._GetDeviceFile("dex/ip1"))
-    self.assertEquals("content2", self._GetDeviceFile("dex/ip2"))
+    self.assertEqual("content1", self._GetDeviceFile("dex/ip1"))
+    self.assertEqual("content2", self._GetDeviceFile("dex/ip2"))
 
   def testUploadWithNewFile(self):
 
@@ -410,8 +411,8 @@
 
     self._CallIncrementalInstall(incremental=True)
 
-    self.assertEquals("content1", self._GetDeviceFile("dex/ip1"))
-    self.assertEquals("content2", self._GetDeviceFile("dex/ip2"))
+    self.assertEqual("content1", self._GetDeviceFile("dex/ip1"))
+    self.assertEqual("content2", self._GetDeviceFile("dex/ip2"))
 
   def testDeletesFile(self):
 
@@ -448,9 +449,9 @@
         "dex1 - ip3 0")
 
     self._CallIncrementalInstall(incremental=True)
-    self.assertEquals("content1", self._GetDeviceFile("dex/ip1"))
-    self.assertEquals("content2", self._GetDeviceFile("dex/ip2"))
-    self.assertEquals("content3", self._GetDeviceFile("dex/ip3"))
+    self.assertEqual("content1", self._GetDeviceFile("dex/ip1"))
+    self.assertEqual("content2", self._GetDeviceFile("dex/ip2"))
+    self.assertEqual("content3", self._GetDeviceFile("dex/ip3"))
 
   def testNoResourcesToUpdate(self):
     self._CreateRemoteManifest("zip1 zp1 ip1 0")
@@ -468,7 +469,7 @@
     self._CreateLocalManifest("zip1 zp1 ip1 0")
 
     self._CallIncrementalInstall(incremental=True)
-    self.assertEquals("resources", self._GetDeviceFile("resources.ap_"))
+    self.assertEqual("resources", self._GetDeviceFile("resources.ap_"))
 
   def testUpdateResources(self):
     self._CreateRemoteManifest("zip1 zp1 ip1 0")
@@ -482,7 +483,7 @@
     self._CreateLocalManifest("zip1 zp1 ip1 0")
 
     self._CallIncrementalInstall(incremental=True)
-    self.assertEquals("resource apk", self._GetDeviceFile("resources.ap_"))
+    self.assertEqual("resource apk", self._GetDeviceFile("resources.ap_"))
 
   def testNoDevice(self):
     self._mock_adb.SetError(1, "", "device not found")
@@ -518,7 +519,7 @@
     # Based on testUploadToPristineDevice
     self._CreateZip()
 
-    with open("dex1", "w") as f:
+    with open("dex1", "wb") as f:
       f.write("content3")
 
     self._CreateLocalManifest(
@@ -534,7 +535,7 @@
   def testDebugStart(self):
     self._CreateZip()
 
-    with open("dex1", "w") as f:
+    with open("dex1", "wb") as f:
       f.write("content3")
 
     self._CreateLocalManifest(
diff --git a/tools/android/merge_manifests.py b/tools/android/merge_manifests.py
index e5b093a..880c55f 100644
--- a/tools/android/merge_manifests.py
+++ b/tools/android/merge_manifests.py
@@ -1,3 +1,4 @@
+# pylint: disable=g-direct-third-party-import
 # Copyright 2015 The Bazel Authors. All rights reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -121,7 +122,7 @@
     if self._exclude_permissions:
       exclude_all_permissions = EXCLUDE_ALL_ARG in self._exclude_permissions
       for element in (dom.getElementsByTagName(self._USES_PERMISSION) +
-       dom.getElementsByTagName(self._USES_PERMISSION_SDK_23)):
+                      dom.getElementsByTagName(self._USES_PERMISSION_SDK_23)):
         if element.hasAttribute(self._ANDROID_NAME):
           attrib = element.getAttribute(self._ANDROID_NAME)
           if exclude_all_permissions or attrib in self._exclude_permissions:
@@ -424,7 +425,7 @@
 
 
 def _ReadFile(file_name):
-  with open(file_name, 'r') as my_file:
+  with open(file_name, 'rb') as my_file:
     return (my_file.read(), file_name,)
 
 
@@ -455,7 +456,7 @@
                                     FLAGS.exclude_permission
                                    ).Merge()
 
-  with open(FLAGS.output, 'w') as out_file:
+  with open(FLAGS.output, 'wb') as out_file:
     for line in merged_manifests.split('\n'):
       if not line.strip():
         continue
diff --git a/tools/android/stubify_manifest.py b/tools/android/stubify_manifest.py
index 7e48d84..f415774 100644
--- a/tools/android/stubify_manifest.py
+++ b/tools/android/stubify_manifest.py
@@ -138,24 +138,24 @@
 
 def main():
   if FLAGS.mode == "mobile_install":
-    with file(FLAGS.input_manifest) as input_manifest:
+    with open(FLAGS.input_manifest, "rb") as input_manifest:
       new_manifest, old_application, app_package = (
           StubifyMobileInstall(input_manifest.read()))
 
     if FLAGS.override_package:
       app_package = FLAGS.override_package
 
-    with file(FLAGS.output_manifest, "w") as output_xml:
+    with open(FLAGS.output_manifest, "wb") as output_xml:
       output_xml.write(new_manifest)
 
-    with file(FLAGS.output_datafile, "wb") as output_file:
+    with open(FLAGS.output_datafile, "wb") as output_file:
       output_file.write("\n".join([old_application, app_package]))
 
   elif FLAGS.mode == "instant_run":
-    with file(FLAGS.input_manifest) as input_manifest:
+    with open(FLAGS.input_manifest, "rb") as input_manifest:
       new_manifest = StubifyInstantRun(input_manifest.read())
 
-    with file(FLAGS.output_manifest, "w") as output_xml:
+    with open(FLAGS.output_manifest, "wb") as output_xml:
       output_xml.write(new_manifest)