生成并运行apk流程

生成和运行apk文件相关的组件:

生成并运行apk流程_第1张图片

 

apk文件的编译流程图如下:

生成并运行apk流程_第2张图片

下面逐一说明:

项目的源文件结构如下:

[html] view plaincopy

  1. E:\Example\  

  2. │  AndroidManifest.xml  

  3. │    

  4. ├─assets  

  5. ├─res  

  6. │  ├─drawable-hdpi  

  7. │  │      icon.png  

  8. │  │        

  9. │  ├─drawable-ldpi  

  10. │  │      icon.png  

  11. │  │        

  12. │  ├─drawable-mdpi  

  13. │  │      icon.png  

  14. │  │        

  15. │  ├─layout  

  16. │  │      main.xml  

  17. │  │        

  18. │  └─values  

  19. │          strings.xml  

  20. │            

  21. └─src  

  22.     └─net  

  23.         └─claudxiao  

  24.             └─example  

  25.                     Example.java  


1、从res生成R.java

mkdir gen

aapt package -f -m -J gen -S res -I “E:\Program Files\Android\android-sdk-windows\platforms\android-7\android.jar” -M AndroidManifest.xml

其中,-f将覆盖已有结果,-m -J gen指定输出路径,-S指定资源文件目录,-I指定要包含的包,-M指定AndroidMenifest.xml文件。

2、将.java编译为.class

mkdir bin

javac -encoding GB18030 -target 1.6 -bootclasspath “E:\Program Files\Android\android-sdk-windows\platforms\android-7\android.jar” -d bin src\net\claudxiao\example\Example.java gen\net\claudxiao\Example\R.java

其中,-target指定类文件的虚拟机版本,-bootclasspath覆盖引导类文件的位置,-d指定输出路径。

3、将.class编译为classes.dex

dx.bat –dex –output=E:\Example\bin\classes.dex E:\Example\bin

注意这里必须用绝对路径。

4、将资源文件打包

aapt package -f -M AndroidManifest.xml -S res -A assets -I “E:\Program Files\Android\android-sdk-windows\platforms\android-7\android.jar” -F bin\resources.ap_

-F指定输出的apk文件。

5、打包成未签名apk文件

apkbuilder.bat E:\Example\bin\Example_unsigned.apk -u -z E:\Example\bin\resources.ap_ -f E:\Example\bin\classes.dex -rf E:\Example\src

这个命令的常用格式为:

apkbuilder ${output.apk.file} -u -z ${packagedresource.file} -f ${dex.file} -rf ${source.dir} -rj ${libraries.dir}

参数必须使用绝对路径。

此外,运行后提示这一工具即将被废弃,但我没有找到新的替代工具是什么。

6、生成一个签名

keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

当前目录下生成了一个android.keystore文件

7、对apk文件签名

jarsigner -keystore E:\Example\android.keystore -storepass claudxiao -keypass claudxiao -signedjar E:\Example\bin\Example.apk E:\Example\bin\Example_unsigned.apk android.keystore

这个命令的常用格式为:

jarsigner -keystore ${keystore} -storepass ${keystore.password} -keypass ${keypass} -signedjar ${signed.apkfile} ${unsigned.apkfile} ${keyalias}

至此,bin\Example.apk就是一个可以安装的apk文件了。作为对比,现在的目录结构如下:

[html] view plaincopy

  1. E:\Example\  

  2. │  android.keystore  

  3. │  AndroidManifest.xml  

  4. │    

  5. ├─assets  

  6. ├─bin  

  7. │  │  classes.dex  

  8. │  │  Example.apk  

  9. │  │  Example_unsigned.apk  

  10. │  │  resources.ap_  

  11. │  │    

  12. │  └─net  

  13. │      └─claudxiao  

  14. │          └─example  

  15. │                  Example.class  

  16. │                  R$attr.class  

  17. │                  R$drawable.class  

  18. │                  R$layout.class  

  19. │                  R$string.class  

  20. │                  R.class  

  21. │                    

  22. ├─gen  

  23. │  └─net  

  24. │      └─claudxiao  

  25. │          └─example  

  26. │                  R.java  

  27. │                    

  28. ├─res  

  29. │  ├─drawable-hdpi  

  30. │  │      icon.png  

  31. │  │        

  32. │  ├─drawable-ldpi  

  33. │  │      icon.png  

  34. │  │        

  35. │  ├─drawable-mdpi  

  36. │  │      icon.png  

  37. │  │        

  38. │  ├─layout  

  39. │  │      main.xml  

  40. │  │        

  41. │  └─values  

  42. │          strings.xml  

  43. │            

  44. └─src  

  45.     └─net  

  46.         └─claudxiao  

  47.             └─example  

  48.                     Example.java  

8. 对齐

     如果apk是Release模式,则必须使用zipalign工具进行对齐,对齐可减少内存使用。


你可能感兴趣的:(生成并运行apk流程)