1. 程式人生 > >Android自動化編譯設定AndroidManifest.xml中package值(包名)

Android自動化編譯設定AndroidManifest.xml中package值(包名)

手動修改Android的AndroidManifest.xml中package值(包名)很簡單,手動修改即可。但是專案中需要把Android的專案原始碼放到伺服器端在客戶下載時候動態編譯生成,且生成的app簽名相同但包名不同(若此時包名相同就是相同的app),這種需求需要在伺服器端自動化編譯Android原始碼時候自動調整AndroidManifest.xml中package值才能實現。查閱相關資料,結合Java對XML檔案的讀寫技術,寫了一個方法,讓伺服器端在編譯之前預載入修改AndroidManifest.xml中的package值。

// 引數:
	// File file:AndroidManifest.xml檔案。
	// String packagename:新的包名。
	public static void operationAndroidManifestXML(File file, String packagename) {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setIgnoringElementContentWhitespace(true);
		DocumentBuilder db;
		try {
			db = factory.newDocumentBuilder();
			Document doc = db.parse(file);
			NodeList nl = doc.getChildNodes();

			// 只有一個node,即 manifest
			// item(0)即為 manifest。
			Node node = nl.item(0);

			// 獲得manifest的各個屬性
			NamedNodeMap map = node.getAttributes();

			// 重新設定package的值
			map.getNamedItem("package").setNodeValue(packagename);

			// 寫
			saveXml(file, doc);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 儲存到XML檔案
	private static void saveXml(File file, Document doc) {
		TransformerFactory transFactory = TransformerFactory.newInstance();
		try {
			Transformer transformer = transFactory.newTransformer();
			transformer.setOutputProperty("indent", "yes");
			DOMSource source = new DOMSource();
			source.setNode(doc);
			StreamResult result = new StreamResult();
			// 覆蓋原檔案
			result.setOutputStream(new FileOutputStream(file));
			transformer.transform(source, result);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}