# DroidBuild **Repository Path**: h128/DroidBuild ## Basic Information - **Project Name**: DroidBuild - **Description**: 测测看吧,有问题大家提交issues - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-08-31 - **Last Updated**: 2022-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Application Application是一个集成开发环境(IDE),直接在Android设备上开发真正的Android应用程序,Application是我在2年前使用Java开发的一款开发安卓应用程序的App。至于为什么叫Application,是因为我想了好几天也没想出一个合适的名字,哈哈哈,所以就叫Application了,Application意为应用程序的意思。 Application中所使用的Soft语言其实本质是也是Java,只是对Java的代码进行了封装。开源这个应用程序的原因,主要因为我个人之前一直没有时间开发新版本,所以这个软件只开发了当前这一个版本;其次也是因为我有了更新的想法,在未来将开发一个全新的Application,使用H5(Vue3、Vant,JavaScript等)的开发方式来开发安卓软件,同时后期面向全平台,就像微信小程序、Uni-App一样,一套代码打包多端平台的应用程序(欢迎大家加群交流);再接下来的原因当然就是开源精神了,因为圈子里很多朋友想让我开源,有很多的朋友想要研究如何编译安卓应用程序,所以借此,也就给大家开源了,希望对大家有所帮助! 开发者:王华 联系QQ:422584084 联系邮箱:wwwanghua@outlook.com Application官方QQ交流群:737444923 大家觉得有用的话,麻烦点个Start收藏一下,感谢!!! ![image](https://user-images.githubusercontent.com/86884357/167345237-5b9c96ba-b0a9-4829-a5a0-83f9f6f4576c.png) **一、编译原理** ```java 1.第一步,使用aapt编译资源文件 2.第二步,使用ecj编译java源代码 3.第三步,使用dx生成dex文件 4.第四步,使用sdklib打包生成未签名的apk 5.第五步,使用zipsigner签名apk 6.完成 ``` **二、示例** ***1.aapt*** ```java public static boolean aapt(String res,String gen,String assets,String androidmanifest,String android_jar,String ap_) { String[] args = { //aapt文件路径 "data/data/com.application.developer/files/aapt", //执行aapt编译资源 "package","-v","-f","-m", //res文件夹路径 "-S",res, //gen文件夹路径 "-J",gen, //assets文件夹路径,如果没有会导致编译失败 "-A",assets, //AndroidManifest.xml文件路径 "-M",androidmanifest, //android.jar文件路径 "-I",android_jar, //输出.ap_文件路径 "-F",ap_ }; try { Process process = Runtime.getRuntime().exec(args); int code = process.waitFor(); /* //如果失败请打印此信息 InputStream input=process.getInputStream(); //获得执行信息 InputStream input=process.getErrorStream(); //获得错误信息 */ if (code!=0) return false; } catch (IOException e) { e.printStackTrace(); return false; } catch (InterruptedException e) { e.printStackTrace(); return false; } return true; } ``` ***2.ecj*** ```java public static boolean ecj(String libs,String android_jar,String java,String r_java,String classs,String mainactivity) { //编译信息 ByteArrayOutputStream baos1 = new ByteArrayOutputStream(); //错误信息 ByteArrayOutputStream baos2 = new ByteArrayOutputStream(); Main main = new Main(new PrintWriter(baos1),new PrintWriter(baos2),false,null,null); //像下面这样可以直接打印信息 //Main main=new Main(new PrintWriter(System.out),new PrintWriter(System.err),false,null,null); String[] args = { "-verbose", //第三方jar文件存放路径 "-extdirs",libs, //android.jar文件路径 "-bootclasspath",android_jar, //java文件存放路径 "-classpath",java+":"+ //r.java文件存放路径 r_java+":"+ //第三方jar文件存放路径,如果没有使用第三方jar那就不用添加,它们之间用冒号隔开 libs, "-1.6", "-target","1.6", "-proc:none", //class文件存放路径 "-d",classs, //第一个被执行的java文件 mainactivity }; //执行编译并返回结果 boolean b = main.compile(args); //如果失败请打印此信息 //获得编译信息字符串 String s1 = baos1.toString(); //获得错误信息字符串 String s2 = baos2.toString(); Log.e("ecj",s2); return b; } ``` ***3.dx*** ```java public static boolean dex(String dex,String classs,String libs) { String[] args = { "--verbose", //核心数 "--num-threads="+Runtime.getRuntime().availableProcessors(), //classes.dex文件输出路径 "--output="+dex, //class文件存放路径 classs, //如果使用了第三方jar请添加存放路径 libs }; com.android.dx.command.dexer.Main.Arguments arguments = new com.android.dx.command.dexer.Main.Arguments(); arguments.parse(args); try { int code = com.android.dx.command.dexer.Main.run(arguments); if (code!=0) return false; return true; } catch (IOException e) { e.printStackTrace(); return false; } } ``` ***4.sdklib*** ```java public static boolean sdklib(String ap_,String resources,String dex) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { ApkBuilder builder = new ApkBuilder( //未签名的apk输出路径 new File(ap_), //aapt生成的文件路径 new File(resources), //dx生成的文件 new File(dex), null, new PrintStream(baos) ); builder.sealApk(); //如果失败请打印此信息 String s = baos.toString(); } catch (ApkCreationException e) { e.printStackTrace(); return false; } catch (SealedApkException e) { e.printStackTrace(); return false; } return true; } ``` ***5.zipsigner*** ```java public static boolean zipSigner(String key,String ap_,String apk) { try { ZipSigner zipSigner = new ZipSigner(); zipSigner.setKeymode(key); zipSigner.signZip( //未签名的apk文件 ap_, //签名输出apk文件 apk ); } catch (ClassNotFoundException e) { e.printStackTrace(); return false; } catch (IllegalAccessException e) { e.printStackTrace(); return false; } catch (InstantiationException e) { e.printStackTrace(); return false; } catch (GeneralSecurityException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } return true; } ``` **三、软件截图** ![image](https://user-images.githubusercontent.com/86884357/167344439-074da40b-fe98-4061-816a-26d267d86e3f.png) ![image](https://user-images.githubusercontent.com/86884357/167344459-02f74b8a-8a42-4d6d-a1f5-2256012472c5.png) ![image](https://user-images.githubusercontent.com/86884357/167344490-7052f6ed-bddc-45b6-897e-af18173686dc.png) ![image](https://user-images.githubusercontent.com/86884357/167344504-dec65c1a-8b0e-4fb8-845e-53db671857c1.png) ![image](https://user-images.githubusercontent.com/86884357/167344519-795a2539-f68b-4cd2-85cb-db16ab48274d.png)