apk编译流程学习之Windows下命令行打包apk

总结记录下这两天的主要学习成果,其中借鉴了网上很多资料,终于成功打包出测试apk文件并运行。

准备知识挺多的(也是自己太菜了):

1.Android中apk与dex的区别

1. *.apk文件

APK是Android Package的缩写,即Android安装包。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。

使用Android打包工具(aapt)将DEX文件,资源文件以及AndroidManifest.xml文件组合成一个应用程序包(APK)。Dex是Dalvik VM executes的全称,即Android Dalvik执行程序。

  • META-INF\ Jar文件
  • res\ 存放资源文件
  • AndroidManifest.xml 应用全局配置文件
  • *.dex Dalvik虚拟机字节码(应用程序)
  • resources.arsc 编译后的二进制资源文件

     Android在运行程序时首先需要解压apk文件,然后获取编译后的androidmanifest.xml文件中配置信息,执行dex程序。

2..dex文件

Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,通常执行时都进行优化 。优化后的文件大小会有所增加。 优化发生的时机有两个:对于预置应用,可以在系统编译后,生成优化文件,以ODEX结尾。这样在发布时除APK文件(不包含DEX)以外,还有一个相应的Android DEX文件;对于非预置应用,包含在APK文件里的DEX文件会在运行时被优化,优化后的文件将被保存在缓存中。

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器,每当系统要求执行一个 Android应用程序,Zygote就会FORK出一个子进程来执行该应用程序。这样做的好处显而易见:Zygote进程是在系统启动时产生的,它会完成虚拟机的初始化,库的加载,预置类库的加载和初始化等等操作,而在系统需要一个新的虚拟机实例时。

Zygote通过复制自身,最快速的提供个系统。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域,大大节省了内存开销。

2.工程目录打包时各个文件的作用:Eclipse项目和Android Studio工程(自行查找吧)

3.Windows环境下多个jdk来回切换

4.apktool d2j-dex2jar jd-gui反编译工具的使用(用来比较自己命令行生成的dex和apk是否与eclipse生成的apk一致)

等等

首先上图:apk的打包流程(在这篇文章上拿的图片:Android安全防护之旅---应用防dex2jar工具反编译原理实现 )

apk编译流程学习之Windows下命令行打包apk_第1张图片



1.
把android命令行工具所在的路径添加到path环境变量中,主要包括:
D:\adt-bundle-windows-x86_64-20131115\sdk\tools;
D:\adt-bundle-windows-x86_64-20131115\sdk\platform-tools;
D:\adt-bundle-windows-x86_64-20131115\sdk\build-tools\21.1.1;
apk编译流程学习之Windows下命令行打包apk_第2张图片
2.
我们在eclipse中新建一个android项目,内容非常简单,只有一个MainActivity。(后来经过我们老大提示,测试时可以用最简单的例子,把项目中加载的V4包也去掉了)
apk编译流程学习之Windows下命令行打包apk_第3张图片
Android如何用命令行进行打包
3
下面我们把这个项目的源码拷贝到其他的路径,然后用命令行进行打包,比如本文是拷贝到D:\命令行打包apk\t4\
4
(1)生成R文件。在命令行输入:
aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I E:\sdk\sdk\platforms\android-21\android.jar
5
(2)生成class文件。在命令行输入:
javac -bootclasspath E:\sdk\sdk\platforms\android-21\android.jar -d bin src\com\example\apktest\*.java gen\com\example\apktest\R.java
6
使用Android SDK提供的dx.bat命令行脚本生成classes.dex文件
将工程bin目录下的class文件编译成classes.dex,Android虚拟机只能执行dex文件
dx --dex --output=D:\命令行打包apk\t4\ApkTest\bin\classes.dex D:\命令行打包apk\t4\ApkTest\bin
7
打包资源:
aapt package -f -M AndroidManifest.xml -S res -I E:\sdk\sdk\platforms\android-21\android.jar -A assets -F D:\命令行打包apk\t4\ApkTest\bin\Test.ap_
8
生成未签名的apk
注:1.如果需要将so文件打包进apk,一定要加上-nf参数
2.如果第三方jar包里含有图片资源,一定要加上-rj参数,不然jar包里资源文件解不出来,程序会因为无法引用资源而报错
java -cp E:\sdk\sdk\tools\lib\sdklib.jar com.android.sdklib.build.ApkBuilderMain  D:\命令行打包apk\t4\ApkTest\bin\ApkTest.apk -v -u -z D:\命令行打包apk\t4\ApkTest\bin\Test.ap_ -f D:\命令行打包apk\t4\ApkTest\bin\classes.dex -rf D:\命令行打包apk\t4\ApkTest\src -nf D:\命令行打包apk\t4\ApkTest\libs -rj D:\命令行打包apk\t4\ApkTest\libs
9
签名:
jarsigner -verbose -keystore emm3.keystore -signedjar Test_Sign.apk ApkTest.apk emmservice3
运行截图如下:
apk编译流程学习之Windows下命令行打包apk_第4张图片


apk编译流程学习之Windows下命令行打包apk_第5张图片


apk编译流程学习之Windows下命令行打包apk_第6张图片


apk编译流程学习之Windows下命令行打包apk_第7张图片


齐活手工!

总结下这天遇到的坑:

1.

apk编译流程学习之Windows下命令行打包apk_第8张图片

jdk版本过高 我之前的是jdk1.8  换成jdk1.6就好使了

2.

命令行生成.dex文件时

只走到bin目录下面就行了  走进去会报1那个错,不明觉厉。亲测的坑,虽然不知道为什么。


apk编译流程学习之Windows下命令行打包apk_第9张图片


虽然文件路径是这样的 但是把class文件打包成.dex时 命令行还是得写到bin目录路径:

dx --dex --output=D:\命令行打包apk\t4\ApkTest\bin\classes.dex D:\命令行打包apk\t4\ApkTest\bin


主要参考:

                 命令行开发、编译、打包Android应用程序

                 Android如何用命令行进行打包



你可能感兴趣的:(学习笔记)