Ant 打包安卓apk(1)-手动档

简介: Ant 打包安卓apk(1)-手动档

image.png

  1. 根据资源文件和 AndroidManifest.xml 生成 R.java 文件


 2. 处理 aidl,生成对应的 java文件,如果没有 aidl,则跳过


 3. 编译工程源码(主项目,库)src 目录下所有的源码,同时上边生成的R.java和aidl生成的java文件也会被编译生成相应的 class 文件


 4. 将第3步生成的class文件打包生成 .dex 文件


 5. 将资源文件打包,生成初始的apk


 6. 将第 4 步生成的 .dex 文件加入到apk中生成未签名的包


 7. apk 签名


1. aapt(Android Asset Packaging Tool) - Package the android resources得到R.java文件


命令build-tools/安卓某个版本/aapt.exe package

set path=%path%;D:\Android\android-sdk\build-tools\25.0.2
aapt package -f -m -M AndroidManifest.xml -I D:/Android/android-sdk/platforms/android-22/android.jar -S res -J gen


参数的含义如下:


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


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


  -M :  <AndroidManifest.xml目录>


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


  -S : res文件夹路径 resource-sources


  -J : R.java的输出目录


2. 编译aidl文件


没有则可以忽略


3. Javac编译(包含src和gen目录)java文件


javac -encoding UTF-8 -source 1.6 -target 1.6 -bootclasspath D:/Android/android-sdk/platforms/android-22/android.jar -sourcepath src -classpath .;libs/android-support-v4.jar;libs/SDMCommon-2.2.3.jar;libs/AnySignV2.0.0.Android.1.1.1.jar;libs/bjca_anysign_tool.jar;libs/DataVaultLib.jar;libs/httpmime-4.1.3.jar;libs/SDMConnectivity-2.2.3.jar;libs/SDMParser-2.2.3.jar;libs/SMPRestClient-2.2.3.jar;libs/sup-client-util.jar;libs/wsecx-android_package-v1.4.jar;libs/xstream-1.4.4.jar -d bin/classes gen/com/nci/insprotection/*.java src/com/nci/insprotection/*.java


  • 我安装的是1.8.0_91, 但我知道目标安卓5.1是基于JDK1.6, 所以指定-source-target都是1.6


  • -bootclasspath 覆盖引导类文件的位置, 我设置的编译版本是22


  • -sourcepath指定用以查找类或接口定义的源代码路径, 这是非常重要的一个小技巧, 填写src后从而不用列举出com.nci.insprotection下所有的包了


  • 使用-classpath/-cp标签需要列举出所用用到的jar包.;libs/android-support-v4.jar;xxx.jar;yyy.jar, 不能使用通配符, 否则会找不到符号。还要注意jar包的命名最好不带空格,否则得双引号引起来


  • -d 指定放置生成的类文件的位置


  • 最后一个参数是 <source files>, 列举出所有用到的源文件, 由于我指定了sourcepath, 我只列举了gen/com/nci/insprotection/*.java src/com/nci/insprotection/*.java


注意:


  • -d文件夹必须存在, 否则会javac: 找不到目录: bin/classes, 所以的手动mkdir


  • 提示找不到符号: 类 BuildConfig, 由于我是从Eclipse拷出的项目, 手动copy一个到genR.java的同级目录即可.

/** Automatically generated file. DO NOT MODIFY */
package com.nci.insprotection;
public final class BuildConfig {
    public final static boolean DEBUG = true;
}


4. 打包class文件和jar包为classes.dex;


命令build-tools/安卓某个版本/dx.bat


dx --dex --output=bin/classes.dex bin/classes libs/android-support-v4.jar libs/SDMCommon-2.2.3.jar libs/AnySignV2.0.0.Android.1.1.1.jar libs/bjca_anysign_tool.jar libs/DataVaultLib.jar libs/httpmime-4.1.3.jar libs/SDMConnectivity-2.2.3.jar libs/SDMParser-2.2.3.jar libs/SMPRestClient-2.2.3.jar libs/sup-client-util.jar libs/wsecx-android_package-v1.4.jar libs/xstream-1.4.4.jar


  • 如果用到了libs下的jar包, 需要依次列出


  • 在这过程中如果报错ERROR: No suitable Java found., 是因为我的JAVA_HOME设置在了用户变量, 而非系统变量, 看来以后得用系统变量才靠谱


5. 打包assets和res资源为资源压缩包(例如res.zip 或者 resources.ap_ 这样的名字都可以);


aapt package -f -M AndroidManifest.xml -I D:/Android/android-sdk/platforms/android-22/android.jar -A assets -S res -F bin/res.zip


  • -f 如果编译生成的文件已经存在,强制覆盖。


  • -M 使生成的包的目录存放在-J参数指定的目录


  • -I 指定某个版本平台的android.jar文件的路径


  • -A 指定assert文件夹的路径


  • -S 指定res文件夹的路径


  • -F 指定输出文件完整路径


6. 用sdklib.jar打包apk(组合classes.dex和res.zip生成未签名的APK)


老版本可以用apkbuild.bat的命令apkbuilder bin/unsigned.apk -v -u -z bin/res.zip -f bin/classes.dex


但是如果如果被移除的话, 可以在安卓sdk安装目录tools\lib下是否存在sdklib.jar, 如果存在还是可以打包的.

set classpath=%path%;D:\Android\android-sdk\tools\lib\sdklib.jar    
java com.android.sdklib.build.ApkBuilderMain bin/unsigned.apk -u -z bin/res.zip -f bin/classes.dex -rf src -rj libs -nf libs


java com.android.sdklib.build.ApkBuilderMain bin/aaa.apk -u -z bin/resources.ap_ -f bin/classes.dex -rf src -rj libs -nf libs


参数含义:


第一个参数是存放打包后的文件完整路径


  • -v 显示过程信息 Verbose


  • -u 创建一个无签名的包 Creates an unsigned package.


  • -z 指定apk资源路径 Followed by the path to a zip archive. Adds the content of the application package.


  • -f 指定dex文件路径 Followed by the path to a file. Adds the file to the application package.


  • -rf     引用的第三方jar以及其中的资源文件,按照一定的格式放置到apk文件夹中, 一般是src, Followed by the path to a source folder.             Adds the java resources found in that folder to the application package, while keeping their path relative to the source folder.


  • -rj     一般是/libs, Followed by the path to a jar file or a folder containing jar files. Adds the java resources found in the jar file(s) to the application package.


  • -nf     一般是/libs, 将主项目libs下面的so库打包 Followed by the root folder containing native libraries to include in the application package.


7. jarsigner生成签名包


jarsigner -verbose -keystore C:\Users\hp\Desktop\保全_其他文档\密钥\android.keystore -storepass android -keypass android -signedjar bin/signed.apk bin/unsigned.apk androiddebugkey


参数含义:


  • -verbose  签名/验证时输出详细信息


  • -keystore  密钥库路径


  • -storepass  用于密钥库完整性的口令(密码)


  • -keypass    专用密钥的口令(密码)


  • -signedjar   已签名的 apk 文件的名称 (第一个apk是签名之后的文件, 第二个apk是需要签名的文件)


8. 对签名包进行 zipalign 优化


zipalign可以使用 4 字节对齐的方式优化我们签名打包后的 apk 文件中的以二进制格式存放的文件(如资源图片),这样的话,当资源文件被映射到内存时,应用程序访问资源文件的速率就会被大大提升,同时节省应用占用的内存空间。


检测有没有4字节对齐

set path=%path%;D:\Android\android-sdk\build-tools\27.0.3
zipalign -c -v 4 bin/signed.apk


优化命令

zipalign -f -v 4 bin/signed.apk bin/signed_aligned.apk


然后通过了验证Verification succesful。


总结


这篇文章只是说明了一个通用的流程, 很多方面的优化还没有考虑, 比如资源压缩, 代码混淆, 很多地方都是从网上找的, 所以还是不建议这么做, 用 AS 的 gradle构建再发到应用市场才靠谱, 但是自己折腾还是有实验价值的。


参考


https://blog.csdn.net/javazejian/article/details/50563283


目录
相关文章
|
13天前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
22天前
|
存储 安全 小程序
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
|
13天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
30天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
4月前
|
Linux Android开发 iOS开发
使用Kivy创建“Hello World”应用并打包成APK
使用Kivy创建“Hello World”应用并打包成APK
|
5月前
|
Java Android开发 Windows
使用keytool查看Android APK签名
本文介绍了如何使用Windows命令行工具和keytool查看APK的签名信息,并提供了使用AOSP环境中的signapk.jar工具对APK进行系统签名的方法。
465 0
使用keytool查看Android APK签名
|
Java Android开发
安卓apk包反编译
拿到安卓的apk包如何,如何反编译呢。流程如下
490 0
安卓apk包反编译
|
安全 Java Android开发
安卓APK及framework代码反编译过程
本文仅是实验使用,并不支持商业用途! 最近想做一下反编译。
183 0
Android APK反编译就这么简单 详解(附图)
Android APK反编译就这么简单 详解(附图)
1227 0
Android APK反编译就这么简单 详解(附图)
|
XML Java Android开发
9.5.3 Android Apk 反编译 & 9.5.4 Android Apk 加密
首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到apk文件的这个过程,我们称之为“编译”;“反编译”的话,顾名思义,粗略地说就是与“编译”相反的过程咯,也就是从apk文件开始,经过一系列工具解压最后得到源码的过程。
1052 0

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
  • 3
    【03】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第三篇安卓APP上架华为商店后面的步骤-华为应用商店相对比较麻烦一些-华为商店安卓上架
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 6
    apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
  • 7
    【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
  • 8
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 9
    [Android1.5]DigitalClock自定义日期输出格式
  • 10
    [Android Pro] CPU占用计算方法