手動修改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();
}
}