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

本文介绍了在Windows环境下,如何通过命令行打包apk的过程,包括理解apk与dex的区别,dex的优化,Zygote进程的作用,以及在切换不同jdk版本时的注意事项。还涉及到了apktool、d2j-dex2jar和jd-gui等反编译工具的使用,通过实践解决了命令行生成.dex文件时遇到的问题。

总结记录下这两天的主要学习成果,其中借鉴了网上很多资料,终于成功打包出测试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工具反编译原理实现



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;

2.
我们在eclipse中新建一个android项目,内容非常简单,只有一个MainActivity。(后来经过我们老大提示,测试时可以用最简单的例子,把项目中加载的V4包也去掉了)

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
运行截图如下:






齐活手工!

总结下这天遇到的坑:

1.

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

2.

命令行生成.dex文件时

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



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

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


主要参考:

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

                 Android如何用命令行进行打包



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值