• 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();
                }
            }
        }
    }

  • 相关阅读:
    【译】x86程序员手册30-8.2 I/O指令
    【译】x86程序员手册29-第8章 输入输出
    【译】x86程序员手册28-7.7任务地址空间
    【译】x86程序员手册27-7.6任务链
    【译】x86程序员手册26-7.5任务切换
    【译】x86程序员手册25-7.1任务状态段
    【译】x86程序员手册23-6.5组合页与段保护
    【译】x86程序员手册24-第7章 多任务
    【译】x86程序员手册22-6.4页级保护
    WPF Blend Grid 布局
  • 原文地址:https://www.cnblogs.com/jiezzy/p/2817069.html
Copyright © 2020-2023  润新知