android 多渠道打包
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static final String PROJECT_PATH = "E:\\java\\PkgTest\\"; //工程路径
private static final String androidSDK_PATH = "D:\\java\\android-sdk\\"; //android SDK路径
private static final String apk_PATH = "E:\\java\\apks\\PkgTest_";// apk生成路径, 'duitangMain_'是apk的名称,后面会自动增加渠道名称,修改apk名称,只要修改duitangMain
private static final String channelFlag = "app_channel";
public static String[] channels = {"91","360"
// ,"QQ","jifeng","anzhuo","anzhi","youyi","appchina",
// "wangyi","baidu","souhu","3g","nduo","xiaomi","huawei","meizu","htc","lianxiang","aliyun","taobao"
};
public static void main(String[] args) {
try {
System.out.println("dx.bat start...");
Process process = Runtime.getRuntime().exec(androidSDK_PATH
+"platform-tools\\dx.bat --dex --output="
+PROJECT_PATH+"bin\\classes.dex "
+PROJECT_PATH+"bin\\classes "
+PROJECT_PATH+"libs\\*.jar");
new MyThread(process.getErrorStream()).start();
new MyThread(process.getInputStream()).start();
process.waitFor();
process.destroy();
System.out.println("dx.bat over...");
replaceChannel(); // 替换渠道号
System.out.println("execute finished!");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void replaceChannel() {
try {
String outPath = PROJECT_PATH + "res\\values\\strings.xml"; // 输出文件位置
// String content = read(outPath);
for(int channelid=0;channelid<channels.length;channelid++){
// String tmpContent = content;
// tmpContent = tmpContent.replaceFirst(channelFlag, channels[channelid]);
// write(tmpContent,outPath);
// System.out.println("replace channel name over...");
generatePackage(channelid); // 一次渠道号的更改完成。可以进行打包了。
}
// write(content,outPath); //完成后还原channel_name
} catch (Exception e) {
e.printStackTrace();
}
}
public static String read(String path) {
StringBuffer res = new StringBuffer();
String line = null;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),"UTF-8"));
while ((line = reader.readLine()) != null) {
res.append(line + "\n");
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return res.toString();
}
public static boolean write(String cont, String dist) {
try {
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(dist)),"utf-8");
writer.write(cont);
writer.flush();
writer.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public static void generatePackage(int channelid) {
try {
System.out.println(channels[channelid]+" aapt start...");
Process process = null;
process = Runtime
.getRuntime()
.exec( androidSDK_PATH
+ "platform-tools\\aapt.exe package -f " +
"-M " + PROJECT_PATH + "AndroidManifest.xml " + //-M 指定配置文件
"-S " + PROJECT_PATH + "res " + //-S 指定资源文件
"-A " + PROJECT_PATH + "assets " + //-A 指定assets
"-I " + androidSDK_PATH + "platforms\\android-16\\android.jar " + //-I 指定android类
"-F " + PROJECT_PATH + "bin\\resources.ap_"); // 将资源文件打包resources.ap_
new MyThread(process.getErrorStream()).start();
new MyThread(process.getInputStream()).start();
process.waitFor();
process.destroy();
System.out.println(channels[channelid]+" aapt over...");
process = Runtime.getRuntime().exec(
androidSDK_PATH+ "tools\\apkbuilder.bat "
+ PROJECT_PATH + "bin\\duitangMain.apk -u -z "
+ PROJECT_PATH + "bin\\resources.ap_ -f "
+ PROJECT_PATH + "bin\\classes.dex -rf "
+ PROJECT_PATH + "src -rj "
+ PROJECT_PATH + "\\libs"); // 生成未签名的apk
process.waitFor();
process.destroy();
process = Runtime
.getRuntime()
.exec("jarsigner -keystore D:\\android\\keystore\\android.keystore -storepass 123456 -keypass 123456 " +
"-signedjar "
+ apk_PATH
+ channels[channelid]
+ ".apk "
+ PROJECT_PATH
+ "bin\\PkgTest.apk android.keystore"); // 对apk进行签名
new MyThread(process.getErrorStream()).start();
new MyThread(process.getInputStream()).start();
process.waitFor();
process.destroy();
System.out.println(channels[channelid] + " finished..."); // 一条渠道的打包完成。文件会输出到指定目录
} catch (Exception e) {
e.printStackTrace();
}
}
public static class MyThread extends Thread{
BufferedReader bf;
public MyThread(InputStream input) {
bf = new BufferedReader(new InputStreamReader(input));
}
public void run() {
String line;
try {
line = bf.readLine();
while (line != null) {
System.out.println(line);
line = bf.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}