众所周知,安卓手机是现人不可缺少的一部分,那么自己怎么写一款自己的打包器呢?首先我们来了解源码是如何打包成apk的。
APK构建流程图
我们通过图片可以看到,首先使用了AAPT和AIDL两兄弟,但我们这一期的主角很明显不是AIDL。那怎么办呢?凉拌....
AAPT是谷歌的第一代将资源文件打包为二进制文件的工具,具有大量的实用的命令。
熟悉Linux的小伙伴都知道AAPT运行的命令,先给予AAPT可执行命令,然后AAPT所在文件夹+AAPT文件然后在后面加上命令就行,这和Android有什么关系呢?Android有Linux那么我们必然也可以在安卓上进行AAPT运行。
既然理论存在那么我们开始实践:
我使用ndk编译了aapt放在jniLibs中
安卓开发
public String aapt(String resPath,String genPath,String assetsPath,String androidXmlPath,String androidJar,String outPath){
String aapt = getApplicationInfo().nativeLibraryDir + "/libaapt.so";
Process pr = null;
ArrayList<String> cmd = new ArrayList<String>();
cmd.add(aapt);
cmd.add("package");
cmd.add("-v");
cmd.add("-f");
cmd.add("-m");
cmd.add("-S");
cmd.add(resPath);
cmd.add("-J");
cmd.add(genPath);
cmd.add("-A");
cmd.add(assetsPath);
cmd.add("-M");
cmd.add(androidXmlPath);
cmd.add("-I");
cmd.add(androidJar);
cmd.add("-F");
cmd.add(new File(outPath,"resources.ap_").getAbsolutePath());
try {
pr = Runtime.getRuntime().exec(cmd.toArray(new String[0]));
} catch (IOException e) {
e.printStackTrace();
}
String log = readInputStreem(pr.getErrorStream());
return log;
}
private String readInputStreem(InputStream in) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
sb.append('\n');
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString().trim();
}
AndroLua:
local function aapt(path,androidJar)
import "com.android.builder.Compiler"
local aapt = activity.getApplicationInfo().nativeLibraryDir.."/libaapt.so";
local pr = null;
local cmd = ArrayList();
cmd.add(aapt);
cmd.add("package");
cmd.add("-v");
cmd.add("-f");
cmd.add("-m");
cmd.add("-S");
cmd.add(File(path,"app/src/main/res").getAbsolutePath());
cmd.add("-J");
cmd.add(File(path,"app/build/gen").getAbsolutePath());
cmd.add("-A");
cmd.add(File(path,"app/src/main/assets").getAbsolutePath());
cmd.add("-M");
cmd.add(File(path,"app/src/main/AndroidManifest.xml").getAbsolutePath());
cmd.add("-I");
cmd.add(androidJar.getAbsolutePath());
cmd.add("-F");
cmd.add(File(path,"app/build/bin/resources.ap_").getAbsolutePath());
pr = Runtime.getRuntime().exec(cmd.toArray(String[0]));
log = Compiler.readInputStreem(pr.getErrorStream());
text.setText(log);
end
--aapt("/storage/emulated/0/JavaIDE/MyApp/",File("/storage/emulated/0/JavaIDE/android.jar"));local function aapt(path,androidJar)
打印出来,很好很完美。