欢迎光临
专注android技术,聚焦行业精粹,我们一直在努力

android apk build 过程

1、开发阶段APK生成流程

android 开发阶段如何将resource,java,.aidl等原文件如何转换为最终的可安装运行的apk呢?

 

2、重打包阶段APK生成过程

上面的apkbuild过程是我们在android开发过程中会经常遇到的,我们的IDE工具(例如:android studio)会帮助我们完成apk的生成过程,并安装到我们的手机上。

接下来介绍一种反向的APK构建过程:把一个已经生成的apk解开修改,增加一些资源后,如何再次打包,重新签名呢?以下是一个流程图:

关键点:

  1. jni合并:

jni合并的时候,不能对解开的apkCPU架构类型目录数量改动,因为这些目录的数量APK已经做了兼容。而我们要添加新的SO的时候也只能发在这些目录里面。拷贝时需要拷贝so到对应的CPU架构目录,如果aar里面没有对应的so,怎么办呢,我们只能将一些兼容性较好的so拷贝过去。

目前android支持如下7中CPU架构:

  • armeabi 第5代 ARM v5TE,使用软件浮点运算,兼容所有ARM设备,通用性强,速度慢(只支持armeabi)
  • armeabi-v7a 第7代 ARM v7,使用硬件浮点运算,具有高级扩展功能(支持 armeabi 和 armeabi-v7a,目前大部分手机都是这个架构
  • arm64-v8a 第8代,64位,包含AArch32、AArch64两个执行状态对应32、64bit(支持 armeabi-v7a、armeabi 和 arm64-v8a)
  • *x86 intel 32位,一般用于平板(支持 armeabi(性能有所损耗) 和 x86)
  • x86_64 intel 64位,一般用于平板(支持 x86 和 x86_64)
  • mips 基本没见过(支持 mips)
  • mips64 基本没见过(支持 mips 和 mips_64)

项目中如何适配

  • 如果适配不止一个cpu架构,比如armeabi、 armeabi-v7a 、arm64-v8a这三个,那么一定要确保三个目录中的so库数目一样;第三方库如果支持者提供这三个cpu架构的so库,那非常理想,对应放到目录就可以;

  • 如果适配的上面三个cpu架构,第三方库只提供了两个cpu(比如armeabi、 armeabi-v7a)的库,那也要提供的armeabi的so库,复制一份(armeabi或者armeabi-v7a的so库,因为arm64-v8a兼容armeabi 和 armeabi-v7a)到没有提供的arm64-v8a这个架构目录下;如果不这么做,当应用跑到arm64-v8a架构的手机上时,找不到对应的so库就会报错
  • 具体自己项目适配几种cpu架构,得看app性质,比如微信,主要考虑到兼容,让几乎所有手机都可以适配,另外也相对减少了apk的大小;而另外一个app,比如游戏或者一些对手机性能有要求的app,这种app就挑用户了,只适配到armeabi-v7a,因为目前主流手机都支持armeabi-v7a,就算app支持到只支持armeabi这种架构的手机,app也未必能运行的起来,体验也未必好,算是app放弃也这些用户吧,再说使用只支持armeabi这种架构的手机估计年纪也大了,也不会使用到这个app;
  • 如果只适配一种cpu架构,armeabi(都兼容,但性能有所损耗,如微信和qq)或者armeabi-v7a(目前大部分手机都支持这种cpu架构(王者荣耀));目前手头的app目前只支持armeabi,armeabi-v7a,但是现在apk包越来越大,后面也会考虑只支持一个cpu架构的方案(可以减少10M);
  • 如果app适配了armeabi、 armeabi-v7a 、arm64-v8a三种cpu架构,以我的手机mate9为例, mate9支持 armeabi、 armeabi-v7a 、arm64-v8a,那么app在找so文件时会从最新的一代的cpu 架构(arm64-v8a)找so文件,如果找不到会直接报错,不会再去armeabi-v7a 和armeabi里面找,一定要确保三个目录中的so库数目一样;如果适配armeabi、 armeabi-v7a,mate9手机上app在找so文件时会从armeabi-v7a找对应so,没有就报错;如果只适配一种,那么手机只要支持这种cpu架构,就会去这个文件夹下找对应的so,找不到就报错,如果手机不支持这种cpu架构就报错

大公司如何适配的

微信(只适配armeabi)、qq(只适配armeabi)、王者荣耀(只适配armeabi-v7a)、百度地图(只适配armeabi)、大众点评(只适配armeabi)等,详细见下面Native Libs Monitor的截图

 

2. R 文件

这里的解包和合包没有走标准的gradle打包流程,会导致aar里面的代码引用了R.java的地方会提示找不到类。这里没有提到的一个问题是需要为aar包生成一个对应R.java,具体做法可以根据aar包的manifest的packageName为生成R文件的包名和路径,然后copy一份apk的R文件的内容在里面。

 

 

 

 

 

赞(0) 打赏
未经允许不得转载:花花鞋 » android apk build 过程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

国内精品Android技术社区

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏