通过命令行创建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();
}
}
}

原创粉丝点击