身为一个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系统


附上查找所有java文件的脚本
findJava.sh:

function findjava (){//友情提示,这里不是单引号,是反引号。Esc键下面那个按键//表示shell执行命令for file int `ls $1`doif[ -d $1"/"$file ]; thenfindjava $1"/"$fileelseecho $1"/"$file >> /home/tonywang/javafile.txtfidone
}dir='/home/tonywang/javaDemo/src'
findjava $dir

--------------------- 本文来自 TonyW92 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/wz249863091/article/details/52551629?utm_source=copy

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

  1. unity 5 打包apk 手动升级android sdk 5.0 api 21

    unity5 打包apk需要将安装SDK升级到android sdk 5.0 api 21. 国内使用SDK Manager.exe更新不了,于是下载sdk包手动更新到sdk 5.0. 下载下面几个包 ...

  2. cocos2d-x3.0rc打包apk遇到的一些问题记录

    下载cocos2d-x3.0rc后根据官方教程进行环境配置等等一系列过程没有遇到什么问题 打包apk时出现一些问题: 按照官方教程cmd下运行cocos run -p android -m relea ...

  3. 【Egret】Wing3发布移动APP功能,打包APK流程以及会遇到的问题

    流程:1.安装好wing 3,然后 插件--Egret项目工具--发布移动APP--Build android native project 2.配置发布环境: Android 1.egret eng ...

  4. Android APK 打包过程 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 安卓逆向_1 --- 逆向环境配置、APK 文件结构、APK 打包流程

    哔哩哔哩:https://www.bilibili.com/video/BV1UE411A7rW?p=1 Android 逆向工程师系统培训‹第九期›( 课程目录 ):https://ke.yijin ...

  6. Android Apk 打包

    这里重点介绍的是利用jdk中的两个工具对Android的应用程序包apk文件进行签名. 主要分为3个步骤:第一步生成签名文件,第二步对apk文件签名,第三步验证签名. 以下是执行命令,注意此段命令所生 ...

  7. Android多渠道打包APK

    在网上看到一篇多渠道打包APK的,思路是没问题的,原文地址:http://www.cnblogs.com/yyyyy5101/archive/2012/10/23/2735912.html 下面是具体 ...

  8. Flutter打包apk中的一些巨坑

    许多人在使用Flutter打包apk时都会参照文档的做法,但是按照文档基本上是百分之百失败的[手动狗头],官网的做法是这样的(可以不用看) 官网做法 但是方法基本不可行. 下面介绍一下正确的打包姿势 ...

  9. Meteor android apk打包两种方式

    Meteor apk 打包 首先进入你的所要打包的meteor工程 一.生成apk  meteor build ~/build-output-directory --server=guoyoujinl ...

最新文章

  1. nodejs安装、配置及开发工具
  2. 与AMD合并后,赛灵思与英特尔、英伟达在数据中心市场呈“三足鼎立”之势
  3. [PHP] debug_backtrace()可以获取到代码的调用路径追踪
  4. topcoder srm 360 div1
  5. matlab 比例谐振控制器,比例谐振控制的一种实现(含代码)
  6. 利用ListView实现新闻客户端的新闻内容图文混排
  7. linux 定时器中断 imx,NXP iMX8 存储性能测试
  8. 高仿真的类-BeanDefinitionReader
  9. 感谢Adobe,用上了Silverlight RC0版本
  10. 区块链100讲:区块链的TPS性能
  11. Merry Christmas!看甜点海报如何庆祝圣诞
  12. 在Linux Ubuntu 18.04.x上安装和配置ActiveMQ-Artemis
  13. 技巧:macOS 在 Finder(访达)中查看文件夹大小
  14. 店铺淘宝双十一活动利润的快速量化。
  15. 层次分析法AHP及Python实现
  16. php redis入门指南,redis入门指南(四)—— redis如何节省空间
  17. win10系统无打印机服务器,Print Spooler服务未在Windows 10中运行
  18. 分布式共识算法——Gossip协议(图解)
  19. Docker系列 利用RSShub搭建个人RSS源 从此万物皆RSS
  20. 退出计算机控制如何恢复,在您退出大势至U盘禁用软件、电脑U口屏蔽软件之后如何取消U盘写保护功能、恢复向U盘复制文件的功能?...

热门文章

  1. 关于VS AddIn的注册
  2. 20个优秀的JavaScript 键盘事件处理库
  3. 浅析C++利器之——引用
  4. mysql 的自动启动 使用配置文件 /etc/my.cnf
  5. 吴恩达 coursera AI 专项四第一课总结+作业答案
  6. Python进阶_wxpy学习:机器人对象
  7. C/C++调用Fortran的使用说明
  8. mssql 计划怎每隔n秒_前端:调你一个接口6秒还配资深工程师?后端:有24部分需要处理!...
  9. python内置函数源码_如何查看python内置函数源码
  10. 3DSlicer26:Add Extension/Module filepath,no module named ...