C#实现APK自动打包
2013-11-22 13:50
441 查看
C#实现APK自动打包
最近做了一个安卓项目,其中有一个自动打包的功能,要把供应商id写入APK后打包。
一、思路
在AndroidMinifest.xml中加入一个标识字段,如下配置<meta-dataandroid:name="Vendorid"android:value="xx"/>,把每个供应商的Id值写到android:value这里,然后用命令行打包。
二、准备工作
用到的工具有1,安装JDK1.7(默认安装在C:\ProgramFiles\Java)。安装完成后,添加环境变量JAVA_HOME,值就是Java\jdk1.7.0_25\的实际路径(如果是默认安装的话,那就是C:\ProgramFiles\Java\jdk1.7.0_25\)。
2,建一个文件夹(本文中是建在D盘,D:\apktools),然后把AndroidSDK目录下的platforms、platform-tools、tools这三个文件夹,以及解压后的Apacheant拷贝到D:\apktools。
3,APK源代码我是放在D:\src目录下。
三、测试-用命令行打包
做这一步是为了测试之前的准备工作是否做对了。1,cd/dD:\src,cd到源代码的文件夹
2,D:\apktools\tools\android.batupdateproject-nButtonDemo-tandroid-17-pd:\src,这个批处理可以生成一个工程,工程里配置build.xml脚本。其中,-nButtonDemo:项目名称、-tandroid-17:我这里使用android-17这个版本、-p
d:\src:输出到代码目录下。
3,D:\apktools\apache-ant-1.9.1\bin\ant.batdebug
4,D:\apktools\apache-ant-1.9.1\bin\ant.batrelease,编译成功后命令行会显示BUILDSUCCESSFUL。
四、代码实现
最初的代码如下:privatevoidPackage()
{
Processpcmd=newProcess();
pcmd.StartInfo.FileName="cmd.exe";
pcmd.StartInfo.UseShellExecute=false;
pcmd.StartInfo.RedirectStandardInput=true;
pcmd.StartInfo.RedirectStandardOutput=true;
pcmd.StartInfo.CreateNoWindow=true;
pcmd.Start();
pcmd.StandardInput.Write("cd/dD:\src");
pcmd.StandardInput.WriteLine("");
pcmd.StandardInput.Write("D:\apktools\tools\android.batupdateproject-nButtonDemo-tandroid-17-pd:\src");
pcmd.StandardInput.WriteLine("");
pcmd.StandardInput.Write("D:\apktools\apache-ant-1.9.1\bin\ant.batdebug");
pcmd.StandardInput.WriteLine("");
pcmd.StandardInput.Write("D:\apktools\apache-ant-1.9.1\bin\ant.batrelease");
pcmd.StandardInput.WriteLine("");
pcmd.StandardInput.WriteLine("exit");
stringstroutput=pcmd.StandardOutput.ReadToEnd();
}
调试时发现,ant.batdebug这一步出错,说是JAVA_HOME配置的不对,提示的路径和我实际配置的不一样。必应了一把,看到
调整了下思路,把这几个命令写成一个批处理,然后Process执行这个批处理就可以了。
cd/dD:\src
callD:\apktools\tools\android.batupdateproject-nButtonDemo-tandroid-17-p
d:\src>{log}
callD:\apktools\apache-ant-1.9.1\bin\ant.bat
debug>>{log}
callD:\apktools\apache-ant-1.9.1\bin\ant.batrelease>>{log}
由于不能用RedirectStandardOutput=true来获取输出信息,所以这里我用了dos命令>>{log}来输出。
最终的打包代码如下:
privateboolPackage()
{
//先删除编译后的文件,执行完批处理后,通过判断文件存在与否来确定打包是否成功
stringreleaseFile="d:\src\ButtonDemo-release.apk";
if(File.Exists(releaseFile))
{
File.Delete(releaseFile);
}
//生成批处理命令D:\package.bat
CreateBatFile();
ProcessStartInfopi=newProcessStartInfo();
pi.FileName="D:\package.bat";
pi.UseShellExecute=true;
pi.CreateNoWindow=true;
Processpcmd=Process.Start(pi);
//等待进程结束
while(pcmd.HasExited==false)
{
pcmd.WaitForExit(1000);
}
pcmd.Close();
pcmd.Dispose();
if(!File.Exists(releaseFile))
{
//打包失败
returnfalse;
}
//打包成功
returntrue;
}
AndroidManifest.xml中添加meta-data节点的代码
privatevoidInsertVendorXmlElememnt()
{
List<string>androidnames=newList<string>();
stringxmlfile=@"AndroidManifest.xml";
XmlDocumentxmldoc=newXmlDocument();
xmldoc.Load(_androidSourcePath+xmlfile);
XmlNodexmlApp=xmldoc.SelectSingleNode("//application");
XmlNodeListxmlnodes=xmlApp.SelectNodes("//meta-data");
foreach(XmlNodeiteminxmlnodes)
{
if(!androidnames.Contains(item.Attributes["android:name"].Value))
{
androidnames.Add(item.Attributes["android:name"].Value);
}
}
if(!androidnames.Contains("vendorid"))
{
XmlElementxmlelemember=xmldoc.CreateElement("meta-data");
XmlAttributememAttr=xmldoc.CreateAttribute("android","name","http://schemas.android.com/apk/res/android");
memAttr.Value="vendorid";
xmlelemember.SetAttributeNode(memAttr);
XmlAttributememValue=xmldoc.CreateAttribute("android","value","http://schemas.android.com/apk/res/android");
memValue.Value="";
xmlelemember.SetAttributeNode(memValue);
xmlApp.AppendChild(xmlelemember);
}
xmldoc.Save("d:\src\AndroidManifest.xml");
}
相关文章推荐
- c# web gridview checkbox 应用
- C# ListView的用法
- C#模拟键盘鼠标之一
- C#内获取泛型方法及扩展
- C#实现QQ群成员列表导出及邮件群发之模拟QQ登陆
- C#制作高仿360安全卫士窗体<二>
- C#版二维码生成器附皮肤下载
- c#委托使用
- c#代码自动修改解决方案下任意文件
- C# 获取每年春节对应的公历日期
- c# 以类名为参创建父类相同的类的实例
- C#用天气预报的WebServices
- C# 各种相对路径
- Socket 通讯 接受到多条命令混合到一块问题
- C#多线程与异步的区别
- c#使用多线程动态在多张图上画图和写字
- C# 4.0四大新特性代码示例与解读
- C# 序列化
- c#write和 writeline read和 readline 的区别
- C#性能优化实践