編輯:關於Android編程
以下是對一個已經打包的Android應用程序的apk文件根據渠道號再進行批量打包的程序示例。 config.bat文件 set outDir=out set rawDatadir=temp set apk=SignatureChecker.apk set channelName=A;B set channelNo=1;2;3;4 set projectName=r set versionCode=100 set stamp=%Date:~0,4%%Date:~5,2%%Date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2% echo %stamp%_ build.bat文件 @echo off call config.bat Setlocal enabledelayedexpansion set path=%path%;%cd%lib
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.Writer; import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;import javax.xml.transform.Result;import javax.xml.transform.Source;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.NodeList;import org.xml.sax.SAXException; public class AndroidManifestModifier { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String srcFilePath=AndroidManifest.xml; String outFilePath=AndroidManifest.xml; String metaDataName=youmi:channel; String metaDataNewValue=newValue+System.currentTimeMillis()%1000; if(args!=null&&args.length>=4){ srcFilePath=args[0]; outFilePath=args[1]; metaDataName=args[2]; metaDataNewValue=args[3]; } change(srcFilePath,outFilePath,metaDataName,metaDataNewValue); } public static void change(String srcfilePath,String outFilePath,String metaDataName,String metaDataNewValue) { File f = new File(srcfilePath); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; final String android_value=android:value; try { builder = factory.newDocumentBuilder(); Document doc = builder.parse(f); NodeList nl = doc.getElementsByTagName(meta-data); int len = nl.getLength(); org.w3c.dom.Node channelNode = null; for (int i = 0; i < len; i++) { org.w3c.dom.Node n = nl.item(i); System.out.println(n.getNodeName()); NamedNodeMap nm = n.getAttributes(); boolean c=false; for (int j = 0; j < nm.getLength(); j++) { org.w3c.dom.Node n2 = nm.item(j); System.out.println(n2.getNodeName() + | + n2.getNodeValue()); if (metaDataName.equals(n2.getNodeValue())) { c=true; break; } } if(c){ for (int j = 0; j < nm.getLength(); j++) { org.w3c.dom.Node n2 = nm.item(j); if (android_value.equals(n2.getNodeName())) { channelNode=n2; break; } } } } if (channelNode != null) { channelNode.setNodeValue(metaDataNewValue); writeXMLFile(doc, outFilePath); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void writeXMLFile(Document doc, String outfile) { try { FileOutputStream fos = new FileOutputStream(outfile); OutputStreamWriter outwriter = new OutputStreamWriter(fos); writeXmlFile(doc, outwriter, utf-8); outwriter.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } // 寫入xml文件 public static void writeXmlFile(Document doc, Writer w, String encoding) { try { Source source = new DOMSource(doc); Result result = new StreamResult(w); Transformer xformer = TransformerFactory.newInstance().newTransformer(); xformer.setOutputProperty(OutputKeys.ENCODING, encoding); xformer.transform(source, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } }}
getSubStr.bat文件 參考《getSubStr》 deleteDir.bat文件 參考《deleteDir》 apktool.bat文件 請參考《Android反編譯工具簡介》 robin.keystore文件的制作 請參考《Android應用程序簽名簡介 》 android應用程序的AndroidManifest.xml文件
結束!
在學習Android開發的過程你,你往往會去借鑒別人的應用是怎麼開發的,那些漂亮的動畫和精致的布局可能會讓你愛不釋手,作為一個開發者,你可能會很想知道這些效果界面是怎麼去
說到黑白,我就想起小時候家裡的黑白電視機,顯示效果比起現在的液晶顯示器不知道差到哪裡去了,但是一放假就看電視依然成為周末必做的是。那麼,在Android中要怎麼實現黑白濾
有些時候,自己要在布局文件中重復書寫大量的代碼來定義一個布局。這是最基本的使用,當然要掌握;但是有些場景都去對應的布局裡面寫對應的屬性,就顯得很無力。會發現,系統自帶的控
今天主要分析下ActivityManagerService(服務端) 與應用程序(客戶端)之間的通信模型,在介紹這個通信模型的基礎上,再簡單介紹實現這個模型所需要數據類型