第一步 抽取资源id,生成R.java
aapt p[ackage] -f [-A <assets>] -S <res> -M <AndroidManifest.xml> -J <package> -I <android.jar>
参数-JPF决定aapt的输出: -J 输出R.java -P 输出公共资源索引public.xml -F 输出无字节码文件的apk
eg:
D:PersonalDocumentsGitHubLoginsrc>aapt p -f -M .AndroidManifest.xml -S .res -J .srccnlogin -I E:Androidandroid-sdkplatformsandroid-15android.jar
第二步 生成.class,尽量指定javac版本
javac -target 6 -source 6 *.java
凡是有java源码的目录都要执行一下,包括R.java(尽量把R.java放到包对应的目录下)
eg:
D:PersonalDocumentsGitHubLoginsrcsrccnlogin>javac -target 6 -source 6 *.java
第三步 生成.dex,需要使用dx.jar,可将其加入环境变量classpath中,不建议使用dx.bat脚本
java com.android.dx.command.Main --dex --output=<classes.dex> <dir> <!--将dir及其子目录下所有class文件打包为dex字节码文件-->
eg:
D:PersonalDocumentsGitHubLoginsrcsrc>java com.android.dx.command.Main --dex --output=..inclasses.dex .
经过以上步骤,得到classes.dex文件,这是最终版本,会被打包进入apk.
第四步 整合资源(AndroidManifest.xml及res目录下相关xml资源被加密,values目录下的索引资源被加密打包为resources.arsc)
aapt p[ackage] -f -M <AndroidManifest.xml> -S <res> -F <init.apk> -I <android.jar>
eg:
D:PersonalDocumentsGitHubLoginsrc>aapt package -f -M .AndroidManifest.xml -S . es -F .ininit.apk -I E:Androidandroid-sdkplatformsandroid-15android.jar
得到init.apk,这是一个仅缺少classesl.dex和签名的apk
第五步 添加classes.dex,这是一个简单的zip任务,命令apkbuilder使用到sdklib.jar的类com.android.sdklib.build.ApkBuilderMain.
java com.android.sdklib.build.ApkBuilderMain <out.apk> -v -u -z <init.apk> -f <classes.dex>
eg:
D:PersonalDocumentsGitHubLoginsrc>java com.android.sdklib.build.ApkBuilderMain .inout.apk -v -u -z .ininit.apk -f .inclasses.dex
第六步 签名,使用jdk工具jartool和jarsigner.
生成签名文件:
keytool -genkey -alias <user> -keyalg RSA -validity 36500 -keystore <android.keystore> <!--alias指定别名,是用户的标识-->
eg:
keytool -genkey -alias develon -keyalg RSA -validity 36500 -keystore .inandroid.keystore
--此时会提示输入一些必要信息,确认时输入Y即可
签名:
jarsigner -verbose -keystore <android.keystore> -signedjar <signed.apk> <out.apk> <user>
eg:
D:PersonalDocumentsGitHubLoginsrc>jarsigner -verbose -keystore .inandroid.keystore -signedjar .insigned.apk .inout.apk develon
--此时需要输入密钥库口令和用户口令
现在,apk已经可以安装使用了
例子中的项目结构如下
D:PersonalDocumentsGitHubLoginsrc bin
-init.apk
-classes.dex
-out.apk
-android.keystore
-signed.apk src |--cn |--login -R.java -LoginAct.java
-*.class res
|--drawable
-ic_launcher.png
|--layout
-login_view.xml
|--values
-strings.xml
AndroidManifest.xml
build.bat
现在我们完全可以写一个批处理程序,来一步生成我们的apk文件,需要注意的是不要把各种目录混淆了.
build.bat的内容如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@echo off %关闭回显% D: cd %~dp0 %进入项目根目录% %定义android.jar路径% set ajar=E:Androidandroid-sdkplatformsandroid-15android.jar %定义项目包名% set pkg=cnlogin echo 生成R.java文件 aapt p -M .AndroidManifest.xml -A .assets -S . es -J .src%pkg% -I %ajar% pause echo 生成JVM字节码文件 javac -target 6 -source 6 .srccnlogin*.java pause echo 生成DalvikVM字节码文件并归档为classes.dex-^>需手动创建bin目录 java com.android.dx.command.Main --dex --output=.inclasses.dex .src pause echo 生成init.apk 不含字节码 未签名 不能安装 aapt p -f -M .AndroidManifest.xml -A .assets -S . es -F .ininit.apk -I %ajar% pause echo 添加字节码classes.dex-^>需将sdklib.jar添加到环境变量classpath中 java com.android.sdklib.build.ApkBuilderMain %cd%inout.apk -v -d -u -z %cd%ininit.apk -f %cd% inclasses.dex pause echo 签名out.apk-^>binsigned.apk %签名密钥库android.keystore放到bin下% jarsigner -verbose -keystore .inandroid.keystore -signedjar .insigned.apk .inout.apk ** pause echo 任务完成 pause
效果大概就是这个样子
以上.