Browse Source

Fix Android debug/run

- Prefix all __adb__ commands with device specification to avoid errors when multiple devices connected.
- Include Android release in device data collection.
- Force system user:.
    - Ability to enable/disable.
    - Apply only if OS release >= 17 (when multiuser was introduced.
    - Fix argument passing.
- Rename local variable `port` to `dbg_port` to better match its partner `fs_port`.
- Fix typo in error message.
Pedro J. Estébanez 8 years ago
parent
commit
c8d1457898
1 changed files with 21 additions and 6 deletions
  1. 21 6
      platform/android/export/export.cpp

+ 21 - 6
platform/android/export/export.cpp

@@ -2050,6 +2050,7 @@ class EditorExportAndroid : public EditorExportPlatform {
 		String id;
 		String id;
 		String name;
 		String name;
 		String description;
 		String description;
+		int release;
 	};
 	};
 
 
 	struct APKExportData {
 	struct APKExportData {
@@ -2123,6 +2124,7 @@ class EditorExportAndroid : public EditorExportPlatform {
 							if (ea->devices[j].id == ldevices[i]) {
 							if (ea->devices[j].id == ldevices[i]) {
 								d.description = ea->devices[j].description;
 								d.description = ea->devices[j].description;
 								d.name = ea->devices[j].name;
 								d.name = ea->devices[j].name;
+								d.release = ea->devices[j].release;
 							}
 							}
 						}
 						}
 
 
@@ -2143,6 +2145,7 @@ class EditorExportAndroid : public EditorExportPlatform {
 							String vendor;
 							String vendor;
 							String device;
 							String device;
 							d.description + "Device ID: " + d.id + "\n";
 							d.description + "Device ID: " + d.id + "\n";
+							d.release = 0;
 							for (int j = 0; j < props.size(); j++) {
 							for (int j = 0; j < props.size(); j++) {
 
 
 								String p = props[j];
 								String p = props[j];
@@ -2153,7 +2156,9 @@ class EditorExportAndroid : public EditorExportPlatform {
 								} else if (p.begins_with("ro.build.display.id=")) {
 								} else if (p.begins_with("ro.build.display.id=")) {
 									d.description += "Build: " + p.get_slice("=", 1).strip_edges() + "\n";
 									d.description += "Build: " + p.get_slice("=", 1).strip_edges() + "\n";
 								} else if (p.begins_with("ro.build.version.release=")) {
 								} else if (p.begins_with("ro.build.version.release=")) {
-									d.description += "Release: " + p.get_slice("=", 1).strip_edges() + "\n";
+									const String release_str = p.get_slice("=", 1).strip_edges();
+									d.description += "Release: " + release_str + "\n";
+									d.release = release_str.to_int();
 								} else if (p.begins_with("ro.product.cpu.abi=")) {
 								} else if (p.begins_with("ro.product.cpu.abi=")) {
 									d.description += "CPU: " + p.get_slice("=", 1).strip_edges() + "\n";
 									d.description += "CPU: " + p.get_slice("=", 1).strip_edges() + "\n";
 								} else if (p.begins_with("ro.product.manufacturer=")) {
 								} else if (p.begins_with("ro.product.manufacturer=")) {
@@ -3005,15 +3010,19 @@ public:
 		if (use_adb_over_usb) {
 		if (use_adb_over_usb) {
 
 
 			args.clear();
 			args.clear();
+			args.push_back("-s");
+			args.push_back(devices[p_device].id);
 			args.push_back("reverse");
 			args.push_back("reverse");
 			args.push_back("--remove-all");
 			args.push_back("--remove-all");
 			err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
 			err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
 
 
-			int port = (int)EditorSettings::get_singleton()->get("network/debug/remote_port");
+			int dbg_port = EditorSettings::get_singleton()->get("network/debug/remote_port");
 			args.clear();
 			args.clear();
+			args.push_back("-s");
+			args.push_back(devices[p_device].id);
 			args.push_back("reverse");
 			args.push_back("reverse");
-			args.push_back("tcp:" + itos(port));
-			args.push_back("tcp:" + itos(port));
+			args.push_back("tcp:" + itos(dbg_port));
+			args.push_back("tcp:" + itos(dbg_port));
 
 
 			err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
 			err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
 			print_line("Reverse result: " + itos(rv));
 			print_line("Reverse result: " + itos(rv));
@@ -3021,6 +3030,8 @@ public:
 			int fs_port = EditorSettings::get_singleton()->get("filesystem/file_server/port");
 			int fs_port = EditorSettings::get_singleton()->get("filesystem/file_server/port");
 
 
 			args.clear();
 			args.clear();
+			args.push_back("-s");
+			args.push_back(devices[p_device].id);
 			args.push_back("reverse");
 			args.push_back("reverse");
 			args.push_back("tcp:" + itos(fs_port));
 			args.push_back("tcp:" + itos(fs_port));
 			args.push_back("tcp:" + itos(fs_port));
 			args.push_back("tcp:" + itos(fs_port));
@@ -3036,7 +3047,10 @@ public:
 		args.push_back("shell");
 		args.push_back("shell");
 		args.push_back("am");
 		args.push_back("am");
 		args.push_back("start");
 		args.push_back("start");
-		args.push_back("--user 0");
+		if ((bool)EditorSettings::get_singleton()->get("export/android/force_system_user") && devices[p_device].release >= 17) { // Multi-user introduced in Android 17
+			args.push_back("--user");
+			args.push_back("0");
+		}
 		args.push_back("-a");
 		args.push_back("-a");
 		args.push_back("android.intent.action.MAIN");
 		args.push_back("android.intent.action.MAIN");
 		args.push_back("-n");
 		args.push_back("-n");
@@ -3044,7 +3058,7 @@ public:
 
 
 		err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
 		err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv);
 		if (err || rv != 0) {
 		if (err || rv != 0) {
-			EditorNode::add_io_error("Could not execute ondevice.");
+			EditorNode::add_io_error("Could not execute on device.");
 			device_lock->unlock();
 			device_lock->unlock();
 			return ERR_CANT_CREATE;
 			return ERR_CANT_CREATE;
 		}
 		}
@@ -3586,6 +3600,7 @@ void register_android_exporter() {
 	EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/debug_keystore", PROPERTY_HINT_GLOBAL_FILE, "keystore"));
 	EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "export/android/debug_keystore", PROPERTY_HINT_GLOBAL_FILE, "keystore"));
 	EDITOR_DEF("export/android/debug_keystore_user", "androiddebugkey");
 	EDITOR_DEF("export/android/debug_keystore_user", "androiddebugkey");
 	EDITOR_DEF("export/android/debug_keystore_pass", "android");
 	EDITOR_DEF("export/android/debug_keystore_pass", "android");
+	EDITOR_DEF("export/android/force_system_user", false);
 
 
 	EDITOR_DEF("export/android/timestamping_authority_url", "");
 	EDITOR_DEF("export/android/timestamping_authority_url", "");
 	EDITOR_DEF("export/android/use_remote_debug_over_adb", false);
 	EDITOR_DEF("export/android/use_remote_debug_over_adb", false);