Android自動化編譯設定AndroidManifest.xml中package值(包名)
阿新 • • 發佈:2019-02-17
手動修改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(); } }