2
0
Эх сурвалжийг харах

Merge pull request #20082 from hpvb/fix-android-export-2.1

Write new permissions to the AndroidManifest.xml (2.1 version)
Rémi Verschelde 7 жил өмнө
parent
commit
241ca9624e

+ 0 - 165
platform/android/AndroidManifest.xml.template

@@ -35,171 +35,6 @@ $$ADD_APPLICATION_CHUNKS$$
     <uses-feature android:glEsVersion="0x00020000"/>
 
 $$ADD_PERMISSION_CHUNKS$$
-<uses-permission android:name="godot.ACCESS_CHECKIN_PROPERTIES"/>
-<uses-permission android:name="godot.ACCESS_COARSE_LOCATION"/>
-<uses-permission android:name="godot.ACCESS_FINE_LOCATION"/>
-<uses-permission android:name="godot.ACCESS_LOCATION_EXTRA_COMMANDS"/>
-<uses-permission android:name="godot.ACCESS_MOCK_LOCATION"/>
-<uses-permission android:name="godot.ACCESS_NETWORK_STATE"/>
-<uses-permission android:name="godot.ACCESS_SURFACE_FLINGER"/>
-<uses-permission android:name="godot.ACCESS_WIFI_STATE"/>
-<uses-permission android:name="godot.ACCOUNT_MANAGER"/>
-<uses-permission android:name="godot.ADD_VOICEMAIL"/>
-<uses-permission android:name="godot.AUTHENTICATE_ACCOUNTS"/>
-<uses-permission android:name="godot.BATTERY_STATS"/>
-<uses-permission android:name="godot.BIND_ACCESSIBILITY_SERVICE"/>
-<uses-permission android:name="godot.BIND_APPWIDGET"/>
-<uses-permission android:name="godot.BIND_DEVICE_ADMIN"/>
-<uses-permission android:name="godot.BIND_INPUT_METHOD"/>
-<uses-permission android:name="godot.BIND_NFC_SERVICE"/>
-<uses-permission android:name="godot.BIND_NOTIFICATION_LISTENER_SERVICE"/>
-<uses-permission android:name="godot.BIND_PRINT_SERVICE"/>
-<uses-permission android:name="godot.BIND_REMOTEVIEWS"/>
-<uses-permission android:name="godot.BIND_TEXT_SERVICE"/>
-<uses-permission android:name="godot.BIND_VPN_SERVICE"/>
-<uses-permission android:name="godot.BIND_WALLPAPER"/>
-<uses-permission android:name="godot.BLUETOOTH"/>
-<uses-permission android:name="godot.BLUETOOTH_ADMIN"/>
-<uses-permission android:name="godot.BLUETOOTH_PRIVILEGED"/>
-<uses-permission android:name="godot.BRICK"/>
-<uses-permission android:name="godot.BROADCAST_PACKAGE_REMOVED"/>
-<uses-permission android:name="godot.BROADCAST_SMS"/>
-<uses-permission android:name="godot.BROADCAST_STICKY"/>
-<uses-permission android:name="godot.BROADCAST_WAP_PUSH"/>
-<uses-permission android:name="godot.CALL_PHONE"/>
-<uses-permission android:name="godot.CALL_PRIVILEGED"/>
-<uses-permission android:name="godot.CAMERA"/>
-<uses-permission android:name="godot.CAPTURE_AUDIO_OUTPUT"/>
-<uses-permission android:name="godot.CAPTURE_SECURE_VIDEO_OUTPUT"/>
-<uses-permission android:name="godot.CAPTURE_VIDEO_OUTPUT"/>
-<uses-permission android:name="godot.CHANGE_COMPONENT_ENABLED_STATE"/>
-<uses-permission android:name="godot.CHANGE_CONFIGURATION"/>
-<uses-permission android:name="godot.CHANGE_NETWORK_STATE"/>
-<uses-permission android:name="godot.CHANGE_WIFI_MULTICAST_STATE"/>
-<uses-permission android:name="godot.CHANGE_WIFI_STATE"/>
-<uses-permission android:name="godot.CLEAR_APP_CACHE"/>
-<uses-permission android:name="godot.CLEAR_APP_USER_DATA"/>
-<uses-permission android:name="godot.CONTROL_LOCATION_UPDATES"/>
-<uses-permission android:name="godot.DELETE_CACHE_FILES"/>
-<uses-permission android:name="godot.DELETE_PACKAGES"/>
-<uses-permission android:name="godot.DEVICE_POWER"/>
-<uses-permission android:name="godot.DIAGNOSTIC"/>
-<uses-permission android:name="godot.DISABLE_KEYGUARD"/>
-<uses-permission android:name="godot.DUMP"/>
-<uses-permission android:name="godot.EXPAND_STATUS_BAR"/>
-<uses-permission android:name="godot.FACTORY_TEST"/>
-<uses-permission android:name="godot.FLASHLIGHT"/>
-<uses-permission android:name="godot.FORCE_BACK"/>
-<uses-permission android:name="godot.GET_ACCOUNTS"/>
-<uses-permission android:name="godot.GET_PACKAGE_SIZE"/>
-<uses-permission android:name="godot.GET_TASKS"/>
-<uses-permission android:name="godot.GET_TOP_ACTIVITY_INFO"/>
-<uses-permission android:name="godot.GLOBAL_SEARCH"/>
-<uses-permission android:name="godot.HARDWARE_TEST"/>
-<uses-permission android:name="godot.INJECT_EVENTS"/>
-<uses-permission android:name="godot.INSTALL_LOCATION_PROVIDER"/>
-<uses-permission android:name="godot.INSTALL_PACKAGES"/>
-<uses-permission android:name="godot.INSTALL_SHORTCUT"/>
-<uses-permission android:name="godot.INTERNAL_SYSTEM_WINDOW"/>
-<uses-permission android:name="godot.INTERNET"/>
-<uses-permission android:name="godot.KILL_BACKGROUND_PROCESSES"/>
-<uses-permission android:name="godot.LOCATION_HARDWARE"/>
-<uses-permission android:name="godot.MANAGE_ACCOUNTS"/>
-<uses-permission android:name="godot.MANAGE_APP_TOKENS"/>
-<uses-permission android:name="godot.MANAGE_DOCUMENTS"/>
-<uses-permission android:name="godot.MASTER_CLEAR"/>
-<uses-permission android:name="godot.MEDIA_CONTENT_CONTROL"/>
-<uses-permission android:name="godot.MODIFY_AUDIO_SETTINGS"/>
-<uses-permission android:name="godot.MODIFY_PHONE_STATE"/>
-<uses-permission android:name="godot.MOUNT_FORMAT_FILESYSTEMS"/>
-<uses-permission android:name="godot.MOUNT_UNMOUNT_FILESYSTEMS"/>
-<uses-permission android:name="godot.NFC"/>
-<uses-permission android:name="godot.PERSISTENT_ACTIVITY"/>
-<uses-permission android:name="godot.PROCESS_OUTGOING_CALLS"/>
-<uses-permission android:name="godot.READ_CALENDAR"/>
-<uses-permission android:name="godot.READ_CALL_LOG"/>
-<uses-permission android:name="godot.READ_CONTACTS"/>
-<uses-permission android:name="godot.READ_EXTERNAL_STORAGE"/>
-<uses-permission android:name="godot.READ_FRAME_BUFFER"/>
-<uses-permission android:name="godot.READ_HISTORY_BOOKMARKS"/>
-<uses-permission android:name="godot.READ_INPUT_STATE"/>
-<uses-permission android:name="godot.READ_LOGS"/>
-<uses-permission android:name="godot.READ_PHONE_STATE"/>
-<uses-permission android:name="godot.READ_PROFILE"/>
-<uses-permission android:name="godot.READ_SMS"/>
-<uses-permission android:name="godot.READ_SOCIAL_STREAM"/>
-<uses-permission android:name="godot.READ_SYNC_SETTINGS"/>
-<uses-permission android:name="godot.READ_SYNC_STATS"/>
-<uses-permission android:name="godot.READ_USER_DICTIONARY"/>
-<uses-permission android:name="godot.REBOOT"/>
-<uses-permission android:name="godot.RECEIVE_BOOT_COMPLETED"/>
-<uses-permission android:name="godot.RECEIVE_MMS"/>
-<uses-permission android:name="godot.RECEIVE_SMS"/>
-<uses-permission android:name="godot.RECEIVE_WAP_PUSH"/>
-<uses-permission android:name="godot.RECORD_AUDIO"/>
-<uses-permission android:name="godot.REORDER_TASKS"/>
-<uses-permission android:name="godot.RESTART_PACKAGES"/>
-<uses-permission android:name="godot.SEND_RESPOND_VIA_MESSAGE"/>
-<uses-permission android:name="godot.SEND_SMS"/>
-<uses-permission android:name="godot.SET_ACTIVITY_WATCHER"/>
-<uses-permission android:name="godot.SET_ALARM"/>
-<uses-permission android:name="godot.SET_ALWAYS_FINISH"/>
-<uses-permission android:name="godot.SET_ANIMATION_SCALE"/>
-<uses-permission android:name="godot.SET_DEBUG_APP"/>
-<uses-permission android:name="godot.SET_ORIENTATION"/>
-<uses-permission android:name="godot.SET_POINTER_SPEED"/>
-<uses-permission android:name="godot.SET_PREFERRED_APPLICATIONS"/>
-<uses-permission android:name="godot.SET_PROCESS_LIMIT"/>
-<uses-permission android:name="godot.SET_TIME"/>
-<uses-permission android:name="godot.SET_TIME_ZONE"/>
-<uses-permission android:name="godot.SET_WALLPAPER"/>
-<uses-permission android:name="godot.SET_WALLPAPER_HINTS"/>
-<uses-permission android:name="godot.SIGNAL_PERSISTENT_PROCESSES"/>
-<uses-permission android:name="godot.STATUS_BAR"/>
-<uses-permission android:name="godot.SUBSCRIBED_FEEDS_READ"/>
-<uses-permission android:name="godot.SUBSCRIBED_FEEDS_WRITE"/>
-<uses-permission android:name="godot.SYSTEM_ALERT_WINDOW"/>
-<uses-permission android:name="godot.TRANSMIT_IR"/>
-<uses-permission android:name="godot.UNINSTALL_SHORTCUT"/>
-<uses-permission android:name="godot.UPDATE_DEVICE_STATS"/>
-<uses-permission android:name="godot.USE_CREDENTIALS"/>
-<uses-permission android:name="godot.USE_SIP"/>
-<uses-permission android:name="godot.VIBRATE"/>
-<uses-permission android:name="godot.WAKE_LOCK"/>
-<uses-permission android:name="godot.WRITE_APN_SETTINGS"/>
-<uses-permission android:name="godot.WRITE_CALENDAR"/>
-<uses-permission android:name="godot.WRITE_CALL_LOG"/>
-<uses-permission android:name="godot.WRITE_CONTACTS"/>
-<uses-permission android:name="godot.WRITE_EXTERNAL_STORAGE"/>
-<uses-permission android:name="godot.WRITE_GSERVICES"/>
-<uses-permission android:name="godot.WRITE_HISTORY_BOOKMARKS"/>
-<uses-permission android:name="godot.WRITE_PROFILE"/>
-<uses-permission android:name="godot.WRITE_SECURE_SETTINGS"/>
-<uses-permission android:name="godot.WRITE_SETTINGS"/>
-<uses-permission android:name="godot.WRITE_SMS"/>
-<uses-permission android:name="godot.WRITE_SOCIAL_STREAM"/>
-<uses-permission android:name="godot.WRITE_SYNC_SETTINGS"/>
-<uses-permission android:name="godot.WRITE_USER_DICTIONARY"/>
-<uses-permission android:name="godot.custom.0"/>
-<uses-permission android:name="godot.custom.1"/>
-<uses-permission android:name="godot.custom.2"/>
-<uses-permission android:name="godot.custom.3"/>
-<uses-permission android:name="godot.custom.4"/>
-<uses-permission android:name="godot.custom.5"/>
-<uses-permission android:name="godot.custom.6"/>
-<uses-permission android:name="godot.custom.7"/>
-<uses-permission android:name="godot.custom.8"/>
-<uses-permission android:name="godot.custom.9"/>
-<uses-permission android:name="godot.custom.10"/>
-<uses-permission android:name="godot.custom.11"/>
-<uses-permission android:name="godot.custom.12"/>
-<uses-permission android:name="godot.custom.13"/>
-<uses-permission android:name="godot.custom.14"/>
-<uses-permission android:name="godot.custom.15"/>
-<uses-permission android:name="godot.custom.16"/>
-<uses-permission android:name="godot.custom.17"/>
-<uses-permission android:name="godot.custom.18"/>
-<uses-permission android:name="godot.custom.19"/>
 
 <uses-sdk android:minSdkVersion="18" android:targetSdkVersion="27"/>
          

+ 111 - 26
platform/android/export/export.cpp

@@ -805,27 +805,6 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t> &p_manifest, boo
 						}*/
 					}
 
-					if (tname == "uses-permission" && /*nspace=="android" &&*/ attrname == "name") {
-
-						if (value.begins_with("godot.custom")) {
-
-							int which = value.get_slice(".", 2).to_int();
-							if (which >= 0 && which < MAX_USER_PERMISSIONS && user_perms[which].strip_edges() != "") {
-
-								string_table[attr_value] = user_perms[which].strip_edges();
-							}
-
-						} else if (value.begins_with("godot.")) {
-							String perm = value.get_slice(".", 1);
-
-							if (perms.has(perm) || (p_give_internet && perm == "INTERNET")) {
-
-								print_line("PERM: " + perm);
-								string_table[attr_value] = "android.permission." + perm;
-							}
-						}
-					}
-
 					if (tname == "supports-screens") {
 
 						if (attrname == "smallScreens") {
@@ -850,6 +829,110 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t> &p_manifest, boo
 				}
 
 			} break;
+			case CHUNK_XML_END_TAG: {
+				int iofs = ofs + 8;
+				uint32_t name = decode_uint32(&p_manifest[iofs + 12]);
+				String tname = string_table[name];
+
+				if (tname == "manifest") {
+					print_line("Found manifest end");
+
+					// save manifest ending so we can restore it
+					Vector<uint8_t> manifest_end;
+					uint32_t manifest_cur_size = p_manifest.size();
+					uint32_t node_size = size;
+
+					manifest_end.resize(p_manifest.size() - ofs);
+					memcpy(manifest_end.ptr(), &p_manifest[ofs], manifest_end.size());
+
+					int32_t attr_name_string = string_table.find("name");
+					ERR_EXPLAIN("Template does not have 'name' attribute");
+					ERR_FAIL_COND(attr_name_string == -1);
+
+					int32_t ns_android_string = string_table.find("android");
+					ERR_EXPLAIN("Template does not have 'android' namespace");
+					ERR_FAIL_COND(ns_android_string == -1);
+
+					int32_t attr_uses_permission_string = string_table.find("uses-permission");
+					if (attr_uses_permission_string == -1) {
+						string_table.push_back("uses-permission");
+						attr_uses_permission_string = string_table.size() - 1;
+					}
+
+					Vector<String> apk_perms;
+					const char **aperms = android_perms;
+					while (*aperms) {
+						if (perms.has(*aperms)) {
+							apk_perms.push_back("android.permission." + String(*aperms));
+						}
+						aperms++;
+					}
+
+					for (int i = 0; i < MAX_USER_PERMISSIONS; i++) {
+						if (user_perms[i].strip_edges() != "" && user_perms[i].strip_edges() != "False")
+							apk_perms.push_back(user_perms[i].strip_edges());
+					}
+
+					if (p_give_internet) {
+						if (apk_perms.find("android.permission.INTERNET") == -1)
+							apk_perms.push_back("android.permission.INTERNET");
+					}
+
+					for (int i = 0; i < apk_perms.size(); ++i) {
+						print_line("Adding permission " + apk_perms[i]);
+
+						manifest_cur_size += 56 + 24; // node + end node
+						p_manifest.resize(manifest_cur_size);
+
+						// Add permission to the string pool
+						int32_t perm_string = string_table.find(apk_perms[i]);
+						if (perm_string == -1) {
+							string_table.push_back(apk_perms[i]);
+							perm_string = string_table.size() - 1;
+						}
+
+						// start tag
+						encode_uint16(0x102, &p_manifest[ofs]); // type
+						encode_uint16(16, &p_manifest[ofs + 2]); // headersize
+						encode_uint32(56, &p_manifest[ofs + 4]); // size
+						encode_uint32(0, &p_manifest[ofs + 8]); // lineno
+						encode_uint32(-1, &p_manifest[ofs + 12]); // comment
+						encode_uint32(-1, &p_manifest[ofs + 16]); // ns
+						encode_uint32(attr_uses_permission_string, &p_manifest[ofs + 20]); // name
+						encode_uint16(20, &p_manifest[ofs + 24]); // attr_start
+						encode_uint16(20, &p_manifest[ofs + 26]); // attr_size
+						encode_uint16(1, &p_manifest[ofs + 28]); // num_attrs
+						encode_uint16(0, &p_manifest[ofs + 30]); // id_index
+						encode_uint16(0, &p_manifest[ofs + 32]); // class_index
+						encode_uint16(0, &p_manifest[ofs + 34]); // style_index
+
+						// attribute
+						encode_uint32(ns_android_string, &p_manifest[ofs + 36]); // ns
+						encode_uint32(attr_name_string, &p_manifest[ofs + 40]); // 'name'
+						encode_uint32(perm_string, &p_manifest[ofs + 44]); // raw_value
+						encode_uint16(8, &p_manifest[ofs + 48]); // typedvalue_size
+						p_manifest[ofs + 50] = 0; // typedvalue_always0
+						p_manifest[ofs + 51] = 0x03; // typedvalue_type (string)
+						encode_uint32(perm_string, &p_manifest[ofs + 52]); // typedvalue reference
+
+						ofs += 56;
+
+						// end tag
+						encode_uint16(0x103, &p_manifest[ofs]); // type
+						encode_uint16(16, &p_manifest[ofs + 2]); // headersize
+						encode_uint32(24, &p_manifest[ofs + 4]); // size
+						encode_uint32(0, &p_manifest[ofs + 8]); // lineno
+						encode_uint32(-1, &p_manifest[ofs + 12]); // comment
+						encode_uint32(-1, &p_manifest[ofs + 16]); // ns
+						encode_uint32(attr_uses_permission_string, &p_manifest[ofs + 20]); // name
+
+						ofs += 24;
+					}
+
+					// copy footer back in
+					memcpy(&p_manifest[ofs], manifest_end.ptr(), manifest_end.size());
+				}
+			} break;
 		}
 		//printf("chunk %x: size: %d\n",chunk,size);
 
@@ -873,17 +956,17 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t> &p_manifest, boo
 
 		encode_uint32(ofs, &ret[string_table_begins + i * 4]);
 		ofs += string_table[i].length() * 2 + 2 + 2;
-		//print_line("ofs: "+itos(i)+": "+itos(ofs));
 	}
+
 	ret.resize(ret.size() + ofs);
-	uint8_t *chars = &ret[ret.size() - ofs];
+	string_data_offset = ret.size() - ofs;
+	uint8_t *chars = &ret[string_data_offset];
 	for (int i = 0; i < string_table.size(); i++) {
 
 		String s = string_table[i];
-		//print_line("savint string :"+s);
 		encode_uint16(s.length(), chars);
 		chars += 2;
-		for (int j = 0; j < s.length(); j++) { //include zero?
+		for (int j = 0; j < s.length(); j++) {
 			encode_uint16(s[j], chars);
 			chars += 2;
 		}
@@ -895,6 +978,7 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t> &p_manifest, boo
 		ret.push_back(stable_extra[i]);
 	}
 
+	//pad
 	while (ret.size() % 4)
 		ret.push_back(0);
 
@@ -910,7 +994,8 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t> &p_manifest, boo
 	encode_uint32(ret.size(), &ret[4]); //update new file size
 
 	encode_uint32(new_stable_end - 8, &ret[12]); //update new string table size
-
+	encode_uint32(string_table.size(), &ret[16]); //update new number of strings
+	encode_uint32(string_data_offset - 8, &ret[28]); //update new string data offset
 	//print_line("file size: "+itos(ret.size()));
 
 	p_manifest = ret;