Handle \r\n newlines. (#581)

diff --git a/mobly/controllers/android_device_lib/adb.py b/mobly/controllers/android_device_lib/adb.py
index de20822..81e8a46 100644
--- a/mobly/controllers/android_device_lib/adb.py
+++ b/mobly/controllers/android_device_lib/adb.py
@@ -286,7 +286,7 @@
         Returns:
             dict, name-value pairs of the properties.
         """
-        output = output.decode('utf-8', errors='ignore')
+        output = output.decode('utf-8', errors='ignore').replace('\r\n', '\n')
         results = {}
         for line in output.split(']\n'):
             if not line:
diff --git a/tests/mobly/controllers/android_device_lib/adb_test.py b/tests/mobly/controllers/android_device_lib/adb_test.py
index 9fda55d..25ebde9 100755
--- a/tests/mobly/controllers/android_device_lib/adb_test.py
+++ b/tests/mobly/controllers/android_device_lib/adb_test.py
@@ -496,6 +496,18 @@
         }
         self.assertEqual(parsed_props, expected_output)
 
+    def test__parse_getprop_output_special_line_separator(self):
+        mock_adb_output = (
+            b'[selinux.restorecon_recursive][/data/misc_ce/10]\r\n'  # Malformat
+            b'[persist.sys.boot.reason]: [reboot,adb,1558549857]\r\n'
+            b'[persist.something]: [haha]\r\n')
+        parsed_props = adb.AdbProxy()._parse_getprop_output(mock_adb_output)
+        expected_output = {
+            'persist.sys.boot.reason': 'reboot,adb,1558549857',
+            'persist.something': 'haha'
+        }
+        self.assertEqual(parsed_props, expected_output)
+
     def test_getprops(self):
         with mock.patch.object(adb.AdbProxy, '_exec_cmd') as mock_exec_cmd:
             mock_exec_cmd.return_value = (