APK手动编译全过程

转载 2017年10月13日 08:59:03

身为一个Android工程师,你是否有考虑过一个Android项目工程如何经过编译压缩变成一个APK的呢? 
你又是否编写过打包工具完成多渠道打包呢?

下面我们来解密如何完成一个APK的打包。


这里写图片描述


1、使用Android SDK提供的aapt.exe生成R.java类文件 
2、使用Android SDK提供的aidl.exe把.aidl转成.java文件(如果没有aidl,则跳过这一步)
3、使用JDK提供的javac.exe编译.java类文件生成class文件
4、使用Android SDK提供的dx.bat命令行脚本生成classes.dex文件
5、使用Android SDK提供的aapt.exe生成资源包文件(包括res、assets、androidmanifest.xml等)
6、使用Android SDK提供的apkbuilder.bat生成未签名的apk安装文件
7、使用jdk的jarsigner.exe对未签名的包进行apk签名


完成一次APK打包一共有7步。从功能上来分,可以分成四步。

  1. 对R文件和Manifest进行编译,相当于产生一个目录,用于查阅代码和资源的位置。
  2. 对java代码的变成产生class文件然后压缩成dex文件,中间可能还有混淆的过程。
  3. 对资源文件的压缩。
  4. 最后签名。

然后我们再来看下分别对应的命令行

  1. 使用aapt命令编译资源文件 aapt package -f -m -J /home/tonywang/javaDemo/gen -S res -I /home/tonywang/sdk/platforms/android-23/android.jar -M AndroidManifest.xml

    其中 -f -m -J /home/tonywang/javaDemo/gen 
    代表按覆盖的形式在gen目录下生成带包路径的R.java,-S res指定资源文件 ,-I 
    /home/tonywang/sdk/platforms/android-23/android.jar 指定使用的android类,-M AndroidManifest.xml指定程序的配置文件

  2. 使用javac命令编译源文件 javac -target 1.7 -bootclasspath 
    /home/tonywang/sdk/platforms/android-23/android.jar -d bin 
    /home/tonywang/javaDemo/gen/com/tony/demo/*.java 
    /home/tonywang/javaDemo/src/com/tony/demo/*.java

    -target:表示编译之后的class文件运行的环境版本 
    -bootclasspath:表示编译需要用到的系统库 
    -d:表示编译之后的class文件存放的目录 这里需要把gen下和src下面的java都编译了。 
    然后还有一个问题就是如果java文件存在多个包名下,就需要一个个列出来,很是麻烦。这里我写了个shell脚本,把所有java名字都存在一个文本里,然后编译对应的文件名列表就好了。脚本贴在下面 
    然后使用这条命令 
    javac -target 1.7 -bootclasspath /home/tonywang/sdk/platforms/android-23/android.jar -d bin @names.txt

  3. 使用dx命令,将class文件转化成dex 
    dx –dex –output=/home/tonywang/javaDemo/bin/classes.dex /home/tonywang/javaDemo/bin/

  4. 使用aapt命令生成资源包文件(编码AndroidManifest.xml,resource.arsc等) 
    aapt package -f -A assets -S res -I /home/tonywang/sdk/platforms/android-23/android.jar -M AndroidManifest.xml -F /home/tonywang/javaDemo/bin/javaDemo

  5. 使用apkbuilder命令来编译 
    apk apkbuilder /home/tonywang/javaDemo/bin/javaDemo_unsigned.apk -v -u -z 
    /home/tonywang/javaDemo/bin/javaDemo -f 
    /home/tonywang/javaDemo/bin/javaDemo/classes.dex -rf 
    /home/tonywang/javaDemo/src

  6. 使用keytool来产生一个keystore文件 
    keytool -genkey -alias demo_test -keyalg RSA -validity 20000 -keystore demo.keystore

  7. 使用jarsigner签名apk文件 
    jarsigner -keystore /home/tonywang/javaDemo/demo.keystore -storepass 123456 -keypass 
    123456 -signedjar /home/tonywang/javaDemo/bin/javaDemo_signed.apk 
    /home/tonywang/javaDemo/bin/javaDemo_unsigned.apk

至此,我们就完成了一次APK的编译。 
如果你需要多个渠道打包,可以编写一个Ant脚本,或者gradle脚本。 
PS.以上所有命令都基于Linux系统

如何手动完成一次APK打包?----APK编译全过程

身为一个Android工程师,你是否有考虑过一个Android项目工程如何经过编译压缩变成一个APK的呢? 你又是否编写过打包工具完成多渠道打包呢?下面我们来解密如何完成一个APK的打包。 1、使用...

如何手动完成一次APK打包?----APK编译全过程

身为一个Android工程师,你是否有考虑过一个Android项目工程如何经过编译压缩变成一个APK的呢?  你又是否编写过打包工具完成多渠道打包呢? 下面我们来解密如何完成一个APK的打包。...
  • osle123
  • osle123
  • 2016年10月08日 16:36
  • 273

用gradle手动编译出android的简单的apk文件(gradle学习之路二)

随着gradle和AS占据了一大片江山,ADT和ant已经被排挤到角落了有木有,去github上搜索个开源代码都是清一色的xx.gradle,最头疼的是集成Google的功能的时候,还得先用AS下载编...

android APK手动编译流程

apk编译过程中的流程。 1、首先编译项目下的资源文件,生成R.java文件。因为资源文件相对独立,不会跟java文件存在依赖,相反java文件要以来资源文件,因为我们在java文件中通过R.s...
  • HTYBAY
  • HTYBAY
  • 2015年01月22日 20:48
  • 542

ant手动编译apk,其中包括第三方Library和so文件

现在有这么个需求,要手动编译apk,不用eclipse集成工具,用命令行直接编译。一开始直接拼凑命令行,后来发现命令行编译apk无法包含第三方Library和so库,很恶心啊。 调研了一下,用ant或...
  • jbb0403
  • jbb0403
  • 2015年04月28日 10:32
  • 1508

Android APK 手动命令编译、打包、签名步骤

Android APK 命令打包步骤   一、概述步骤 APK的生成需要经过以下几个步骤: 1、使用Android SDK提供的aapt.exe生成R.java类文件 2、使用Android...
  • xMobile
  • xMobile
  • 2012年09月14日 15:07
  • 7877

安卓apk反编译、修改、重新打包、签名全过程

首先明确,反编译别人apk是一件不厚道的事情。代码是程序员辛苦工作的成果,想通过这种手段不劳而获,是不对的。这也说明,代码混淆是非常重要的。本文抱着学习的态度,研究在一些特殊的情况下如果有需要,该怎么...

ubuntu中手动编译源码安装Xorg-server过程中依赖关系的解决

ubuntu中手动编译源码安装Xorg-server过程中依赖关系的解决在linux系统中手动编译源码安装软件包的过程是非常痛苦的,然而这一个多星期以来我是强忍住脾气体验了一把,虽然面对慢的令人发指的...
  • mountzf
  • mountzf
  • 2016年07月15日 18:33
  • 3453

Android 命令行手动编译打包过程图

Android 命令行手动编译打包过程图 【详细步骤】: Step1:使用aapt生成R.java类文件。  例: F:/explorer/android-...

解决fedora更新后没有无线连接问题,及无线网卡的手动安装全过程

最近dnf update更新系统不知道出了什么鬼,更新完之后设置-->网络里面居然没有了无线选项,以前的办法是把新的内核删除,继续试用旧内核,昨晚突然心血来潮想解决这个问题,各种搜索资料之后,这个问题...
  • jeizas
  • jeizas
  • 2015年06月27日 09:36
  • 4634
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:APK手动编译全过程
举报原因:
原因补充:

(最多只允许输入30个字)