通过命令行创建Android工程,并编译发布
来源:互联网 发布:淘宝自然搜索排名 编辑:程序博客网 时间:2024/06/06 12:41
1、利用命令行创建一个新的工程:
android create project --target 1 --name PROJECTNAME --path /PROJECT_PATH --package com.project --activity ActivityName
2、将对应的信息拷贝到刚才创建的工程中,如拷贝图片资源到/res/drawable-hdpi目录中,因为我们需要创建的是资源包,即在其他应用程序中需要访问这个应用程序的资源目录,在Activity中可以通过调用getPackageManager().getResourcesForApplication方法来访问指定包名的资源目录,而要获得包名,只需获得对应的ActivityInfo即可,可以通过getPackageManager().queryIntentActivities来获得指定action的ActivityInfo,ok,咱们只需要如修改AndroidManifest.xml文件中的内容,制定action和category即可。
3、编译APK,第一步自动生成空的工程后,也会自动生成ant的编译脚本,即我们可以利用ant来编译Android工程,编译命令为:ant release -f PROJECT_PATH/build.xml
4、签名命令:jarsigner -verbose -keystore KEY_PATH/*.keystore -storepass password -signedjar APK_PATH/apkname.apk PROJECT_PATH/bin/projectname-release-unsigned.apk *.keystore,
5、代码实现:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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.Element;
import org.xml.sax.SAXException;
public class CustomCreateApk {
private static String sApkName; //要创建的apk名称
private static String sResourceSourcePath; //存放您需要生成APK的资源路径
private static String sApkDesPath; //生成APK的目标路径
private static final String sKeyFilePath = "/home/keyfiledir/"; //签名路径
private static final String sApkProjectPath = "/home/temp/";//中间文件存放路径
public static void main(String[] args) throws IOException,
InterruptedException {
if (args.length != 3)
return;
sApkName = args[0];
sResourceSourcePath = args[1];
sApkDesPath = args[2];
/*
* 利用命令行创建一个新的工程:
android create project --target 1 --name PROJECTNAME --path /PROJECT_PATH --package com.project --activity ActivityName
*/
File apkSource = new File(sApkProjectPath);
if (!apkSource.exists()) {
apkSource.mkdirs();
}
File dest = new File(sApkDesPath);
if (!dest.exists()) {
dest.mkdirs();
}
//封装命令行创建的字符串
StringBuilder sb = new StringBuilder();
sb.append("android create project --target 1 --name ");
sb.append(sApkName);
sb.append(" --path ");
sb.append(sApkProjectPath);
sb.append(sApkName);
sb.append(" --package com.");
sb.append(sApkName);
sb.append(" --activity ");
sb.append("MainActivity");
//创建shell脚本,该脚本用来创建一个空的工程,主ACTIVITY是SkinActivity
File createpoj = new File(sApkProjectPath + "createProject.sh");
if (!createpoj.exists()) {
createpoj.createNewFile();
createpoj.setExecutable(true);
}
FileWriter fw = new FileWriter(createpoj);
fw.write(sb.toString());
fw.flush();
fw.close();
//执行该shell脚本
Process process = Runtime.getRuntime().exec(
sApkProjectPath + "createProject.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (process.waitFor() != 0) {
process.destroy();
return;
} else {
process.destroy();
prepareResources(sApkName);
}
}
//准备资源信息
public static void prepareResources(String apkName) throws IOException {
//prepare drawable-hdpi目录
File file = new File(sApkProjectPath + apkName + "/res/drawable-hdpi");
if (!file.exists()) {
file.mkdir();
}
//raw目录
file = new File(sApkProjectPath + apkName + "/res/raw");
if (!file.exists()) {
file.mkdir();
}
file = new File(sResourceSourcePath);
File[] files = file.listFiles();
for (File f : files) {
String name = f.getName();
File des;
//图片拷贝至drawable目录,其余文件拷贝到对应的目录即可
if (name.endsWith("png")) {
des = new File(sApkProjectPath + apkName + "/res/drawable-hdpi/"
+ name);
if (!des.exists()) {
des.createNewFile();
des.setExecutable(true);
}
} else {
//以raw目录为例
des = new File(sApkProjectPath + apkName + "/res/raw/" + name);
if (!des.exists()) {
des.createNewFile();
des.setExecutable(true);
}
}
FileOutputStream fos = new FileOutputStream(des);
FileInputStream fis = new FileInputStream(f);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes)) > 0) {
fos.write(bytes, 0, len);
}
fos.flush();
fis.close();
fos.close();
}
try {
//在此处修改AndroidManifest.xml文件,也可以修改其他资源文件,比如strings.xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
file = new File(sApkProjectPath + apkName + "/AndroidManifest.xml");
Document doc = builder.parse(file);
Element element = (Element) doc.getElementsByTagName("action").item(0);
//设置action name
element.setAttribute("android:name", "com.action.name");
//设置category name
element = (Element) doc.getElementsByTagName("category").item(0);
element.setAttribute("android:name", "android.intent.category.DEFAULT");
//还可以设置其他信息,if you want
element = (Element) doc.getElementsByTagName("application").item(0);
element.setAttribute("android:icon", "@drawable/star_h");
TransformerFactory tfFac = TransformerFactory.newInstance();
Transformer tf = tfFac.newTransformer();
tf = tfFac.newTransformer();
StreamResult result = new StreamResult(file);
DOMSource source = new DOMSource(doc);
result = new StreamResult(file);
source = new DOMSource(doc);
tf.transform(source, result);
//ok, 资源准备好,开始编译
buildapk(apkName);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void buildapk(String apkName) throws IOException,
InterruptedException {
//创建编译脚本
StringBuilder sb = new StringBuilder();
sb.append("ant release -f " + sApkProjectPath + apkName + "/build.xml");
File ant = new File(sApkProjectPath + "build.sh");
ant.setExecutable(true);
FileWriter fw = new FileWriter(ant);
fw.write(sb.toString());
fw.flush();
fw.close();
Process process = Runtime.getRuntime().exec(
sApkProjectPath + "build.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (process.waitFor() != 0) {
process.destroy();
return;
} else {
process.destroy();
sigin(apkName);
}
}
//签名
public static void sigin(String apkName) throws IOException,
InterruptedException {
StringBuilder sb = new StringBuilder();
sb.append("jarsigner -verbose -keystore ");
sb.append(sKeyFilePath);
sb.append("sign.keystore ");
sb.append("-storepass bohaojingling -signedjar ");
sb.append(sApkDesPath);
sb.append("/");
sb.append(apkName + ".apk ");
sb.append(sApkProjectPath + apkName + "/bin/" + apkName
+ "-release-unsigned.apk sign.keystore");
File f = new File(sApkProjectPath + "jarsigner.sh");
f.setExecutable(true);
FileWriter fw = new FileWriter(f);
fw.write(sb.toString());
fw.flush();
fw.close();
Process p3 = Runtime.getRuntime().exec(sApkProjectPath + "jarsigner.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
p3.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (p3.waitFor() != 0) {
p3.destroy();
} else {
p3.destroy();
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
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.Element;
import org.xml.sax.SAXException;
public class CustomCreateApk {
private static String sApkName; //要创建的apk名称
private static String sResourceSourcePath; //存放您需要生成APK的资源路径
private static String sApkDesPath; //生成APK的目标路径
private static final String sKeyFilePath = "/home/keyfiledir/"; //签名路径
private static final String sApkProjectPath = "/home/temp/";//中间文件存放路径
public static void main(String[] args) throws IOException,
InterruptedException {
if (args.length != 3)
return;
sApkName = args[0];
sResourceSourcePath = args[1];
sApkDesPath = args[2];
/*
* 利用命令行创建一个新的工程:
android create project --target 1 --name PROJECTNAME --path /PROJECT_PATH --package com.project --activity ActivityName
*/
File apkSource = new File(sApkProjectPath);
if (!apkSource.exists()) {
apkSource.mkdirs();
}
File dest = new File(sApkDesPath);
if (!dest.exists()) {
dest.mkdirs();
}
//封装命令行创建的字符串
StringBuilder sb = new StringBuilder();
sb.append("android create project --target 1 --name ");
sb.append(sApkName);
sb.append(" --path ");
sb.append(sApkProjectPath);
sb.append(sApkName);
sb.append(" --package com.");
sb.append(sApkName);
sb.append(" --activity ");
sb.append("MainActivity");
//创建shell脚本,该脚本用来创建一个空的工程,主ACTIVITY是SkinActivity
File createpoj = new File(sApkProjectPath + "createProject.sh");
if (!createpoj.exists()) {
createpoj.createNewFile();
createpoj.setExecutable(true);
}
FileWriter fw = new FileWriter(createpoj);
fw.write(sb.toString());
fw.flush();
fw.close();
//执行该shell脚本
Process process = Runtime.getRuntime().exec(
sApkProjectPath + "createProject.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (process.waitFor() != 0) {
process.destroy();
return;
} else {
process.destroy();
prepareResources(sApkName);
}
}
//准备资源信息
public static void prepareResources(String apkName) throws IOException {
//prepare drawable-hdpi目录
File file = new File(sApkProjectPath + apkName + "/res/drawable-hdpi");
if (!file.exists()) {
file.mkdir();
}
//raw目录
file = new File(sApkProjectPath + apkName + "/res/raw");
if (!file.exists()) {
file.mkdir();
}
file = new File(sResourceSourcePath);
File[] files = file.listFiles();
for (File f : files) {
String name = f.getName();
File des;
//图片拷贝至drawable目录,其余文件拷贝到对应的目录即可
if (name.endsWith("png")) {
des = new File(sApkProjectPath + apkName + "/res/drawable-hdpi/"
+ name);
if (!des.exists()) {
des.createNewFile();
des.setExecutable(true);
}
} else {
//以raw目录为例
des = new File(sApkProjectPath + apkName + "/res/raw/" + name);
if (!des.exists()) {
des.createNewFile();
des.setExecutable(true);
}
}
FileOutputStream fos = new FileOutputStream(des);
FileInputStream fis = new FileInputStream(f);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes)) > 0) {
fos.write(bytes, 0, len);
}
fos.flush();
fis.close();
fos.close();
}
try {
//在此处修改AndroidManifest.xml文件,也可以修改其他资源文件,比如strings.xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
file = new File(sApkProjectPath + apkName + "/AndroidManifest.xml");
Document doc = builder.parse(file);
Element element = (Element) doc.getElementsByTagName("action").item(0);
//设置action name
element.setAttribute("android:name", "com.action.name");
//设置category name
element = (Element) doc.getElementsByTagName("category").item(0);
element.setAttribute("android:name", "android.intent.category.DEFAULT");
//还可以设置其他信息,if you want
element = (Element) doc.getElementsByTagName("application").item(0);
element.setAttribute("android:icon", "@drawable/star_h");
TransformerFactory tfFac = TransformerFactory.newInstance();
Transformer tf = tfFac.newTransformer();
tf = tfFac.newTransformer();
StreamResult result = new StreamResult(file);
DOMSource source = new DOMSource(doc);
result = new StreamResult(file);
source = new DOMSource(doc);
tf.transform(source, result);
//ok, 资源准备好,开始编译
buildapk(apkName);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void buildapk(String apkName) throws IOException,
InterruptedException {
//创建编译脚本
StringBuilder sb = new StringBuilder();
sb.append("ant release -f " + sApkProjectPath + apkName + "/build.xml");
File ant = new File(sApkProjectPath + "build.sh");
ant.setExecutable(true);
FileWriter fw = new FileWriter(ant);
fw.write(sb.toString());
fw.flush();
fw.close();
Process process = Runtime.getRuntime().exec(
sApkProjectPath + "build.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (process.waitFor() != 0) {
process.destroy();
return;
} else {
process.destroy();
sigin(apkName);
}
}
//签名
public static void sigin(String apkName) throws IOException,
InterruptedException {
StringBuilder sb = new StringBuilder();
sb.append("jarsigner -verbose -keystore ");
sb.append(sKeyFilePath);
sb.append("sign.keystore ");
sb.append("-storepass bohaojingling -signedjar ");
sb.append(sApkDesPath);
sb.append("/");
sb.append(apkName + ".apk ");
sb.append(sApkProjectPath + apkName + "/bin/" + apkName
+ "-release-unsigned.apk sign.keystore");
File f = new File(sApkProjectPath + "jarsigner.sh");
f.setExecutable(true);
FileWriter fw = new FileWriter(f);
fw.write(sb.toString());
fw.flush();
fw.close();
Process p3 = Runtime.getRuntime().exec(sApkProjectPath + "jarsigner.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
p3.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (p3.waitFor() != 0) {
p3.destroy();
} else {
p3.destroy();
}
}
}
- 通过命令行创建Android工程,并编译发布
- android命令行创建工程
- Android 命令行创建工程
- 命令行下创建 Android 工程,用 Ant 进行编译部署
- 命令行下创建Android工程,用Ant部署编译
- 命令行下的android工程的创建、编译与打包
- 命令行下创建 Android 工程,用 Ant 进行编译部署
- 命令行下创建 Android 工程,用 Ant 进行编译部署
- MAVEN通过命令行创建多项目工程
- Android工程的自动创建,编译并生成apk
- 通过命令行创建Android项目
- 解决通过命令行 xcodebuild 编译工程,命令行挂起问题
- eclipse 创建javaweb工程 发布并运行
- [转]命令行下创建 Android 工程,用 Ant 进行编译部署
- 使用 ANT 命令行编译 Android 工程
- Android Studio 在命令行编译工程
- ant: 创建编译 android 工程
- ant: 创建编译 android 工程
- 怎么计算两个经纬度之间的距离
- 数据库查询规范
- 关于把button加到UIImageView上后button无法响应单击事件的方法
- Spring JMS应用
- Android makefile 组织结构
- 通过命令行创建Android工程,并编译发布
- Linux下忽略大小写查找的方法
- python_调用c,c++模块
- Objective-C语法快速参考(语法速成)
- uva 10167 Birthday Cake
- Qt 5.x设置透明背景
- RHEL 6系统启动时盘符漂移、竞争
- QT动画介绍
- .net日历控件 Calendar选择多个日期