纯命令行打APK实操全记录

介绍

  1. 本文基于ant命令创建工程使用android sdk提供的工具进行手动打包
  2. 打包基本流程
  3. 手动命令打包实操
  4. 后续学习gradle打包、python脚本打包及点击build As的工作过程等

图解打包过程

image

手动打包用的工具及环境配置

  1. android.bat

    • 位于sdk的tools目录下

    • 配置环境变量:

      在电脑 --> 属性 --> 高级 --> 环境变量 -->path中加入Android SDK目录中tools目录的路径。实质上就是配置android.bat的目录地址

      例如:我的SDK安装在:D:/AS_SDK/android-sdk-windows下,那就得在path中添加:D:/AS_SDK/android-sdk-windows/tools这样android中一些命令就可以用了。

    • 常用命令:

      配置成功之后可以在cmd中输入android -h 查看android命令支持的功能

      android list targets 查看所有的sdk版本信息

      android list device 查看所有的设备信息

      android create avd 创建一个新的虚拟机

      android
      创建一个Android工程

  2. aapt.exe

    • 位于Android SDK build-tools目录下不同版本中

    • 配置aapt命令环境:

      将某个版本下的aapt.exe的路径加到path中即可,例如:
      C:\Users\DELL\android-sdks\build-tools\26.0.2

  3. javac.exe

    • 位置D:\jdk1.8\bin
    • javac 类名.java将java文件编译成.class文件
  4. dx.bat

    • 位置:D:\AS_SDK\android-sdk-windows\build-tools\23.0.0
  5. keytool

    生成签名文件,进行签名等

  6. zipalign.exe

    • 位置:D:\AS_SDK\android-sdk-windows\build-tools\23.0.0

    • 对打的包进行压缩优化

打包步骤分解

  1. 生成应用的R.java文件

    资源文件被aapt(Android Asset Packaging Tool)处理为最终的resources.arsc,并生成R.java文件。以保证源码编写时可以方便的访问这些资源

    aapt工具路径为:你的sdk目录\build-tools\aidl.exe

    比如我的在这些工具所在地址:

    D:\AS_SDK\android-sdk-windows\build-tools\26.0.2\aapt.exe

  2. AIDL文件通过AIDL工具转换成编译器能处理的Java接口文件。

    编译AIDL文件的工具在:你的sdk目录\build-tools\aidl.exe。

  3. 编译所有的java文件(包含:编写的java类+R.java+源代码文件)为class文件

  4. 打包class文件和jar包为classes.dex(因为.class文件并不是Android系统所能识别的格式,要利用dex工具将它们转化成Davilk/ART字节码文件)

  5. 将编译后的资源和其他的资源(assets和res资源)打包为资源压缩包(例如res.zip ,名字可以自己定义)

  6. 组合classses.dex和res.zip生成未签名的APK,使用apkbuilder

  7. 生成有签名的APK

  8. 进行zipAlign优化


  1. 创建Android工程目录结构

     android create project -n test -t 1 -p ./CommandBuildApk -k com.thc -a MainActivity
    

    Options:

    -n --name 应用程序的名字
    -t --target SDK Target ID
    -p --path 应用程序的工作目录
    -k --package 应用程序的包名
    -a --activity 默认创建的Activity的名字

    提示:通过 tree 命令可以查看生成的Android工程目录结构

  2. 生成R.java文件

     aapt p -m -J ./gen -M AndroidManifest.xml -S res -I D:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar
    

    Options:

    -f 如果编译出来的文件已经存在,强制覆盖。

    -m 使生成的包的目录放在-J参数指定的目录。

    -J 指定生成的R.java的输出目录

    -S res文件夹路径

    -A assert文件夹的路径

    -M AndroidManifest.xml的路径

    -I 某个版本平台的android.jar的路径

    -F 具体指定apk文件的输出

  3. 编译所有的java文件为Java虚拟机认识的.class文件

    使用JDK提供的javac命令进行编译

     javac src/com/thc/apkbuild/*.java gen/com/thc/apkbuild/R.java -bootclasspath d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -d bin
     
     //命令解释如下:
     
     javac 
     //包下的java文件
     src/com/thc/apkbuild/*.java 
     //gen目录下的R.java文件
     gen/com/thc/apkbuild/*.java
     //引用android.jar 这个jar包,如果使用其他的jar包,在后面进行添加即可
     -bootclasspath d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar 
     //打出来的class文件所在目录
     -d bin
     //编码格式 
     -encoding GBK
     //添加jar包
     -classpath /.../xxx.jar
    
     //例如引用Gson的jar包
     javac src/com/thc/apkbuild/*.java gen/com/thc/apkbuild/R.java -d bin -bootclasspath d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -classpath libs/gson-2.2.jar
    

    **遇到的问题备注:**将java文件编译成class文件的时候一定要记得一起编译gen目录下的R.java文件,否则会报找不到R.java的错误

  4. 打包class文件和第三方jar包为dex文件

     dx --dex --output=bin\classes.dex bin
    
     命令释义:
    
     output=<dex文件输出地址,如上为当前目录的bin目录下>
     
     bin<是class文件和jar包所在的目录> 
    
  5. 编译资源文件生成resources文件

     aapt package -f -M AndroidManifest.xml -S res -A assets -I d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -F bin/resources
    
  6. 将编译后的资源和其他的资源(assets和res资源)打包为资源压缩包

    使用aapt工具,命令如下:

     aapt package -f -M AndroidManifest.xml -I d:/AS_SDK/android-sdk-windows/platforms/android-21/android.jar -S res -F my.apk
    

    参数释义在生成R文件的时候有说明。

    到这一步就在你当前目录生成了一个my.apk文件

  7. 将classes.dex和resources加入到生成的apk中

     java -claspath D:\AS_SDK\android-sdk-windows\tools\lib\sdklib.jar com.android.sdklib.build.ApkBuilderMain my.apk -v -u -z bin\resources -f bin\classes.dex -rf src
    

    **问题说明:**以前可以直接使用apkbuilder工具直接打包,但是目前sdk将该工具移除了。其实apkbuilder最终调用的是sdklib.jar中的com.android.sdklib.build.ApkBuilderMain类来做事情的,所以这里直接通过 java <class地址> 来使用ApkBuilderMain这个类,来把resources和classes.dex加入到apk文件中

  8. 生成有签名的APK

    1. 生成签名:

       keytool -genkey -alias <别名> -keyalg RSA -validity 20000 -keystore <签名.keystore>
      
    2. 给apk签名

       jarsigner -verbose -keystore <签名.keystore> -signedjar <签名ed.apk> <未签名.apk> <别名>  
      
    3. 注意: 在给apk签名的时候的命令是-signedjar

  9. 进行zipAlign优化

     zipalign -f 4 my_signed.apk my_signed_optimizated.apk
    
  10. 安装到手机

    adb install -r my_signed_optimizated.apk
    

关于apkbuilder

参考(mac版本)

参考1 知乎

参考2

参考3

关于android命令

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值