第1部分:构建过程概述

将Android项目编译并打包成apk文件,这个apk文件是二进制文件的容器,它里面包含了手机或虚拟机上运行应用程序所需的所有信息。

在手机或模拟器上运行程序的时候,通常会用debug或release模式运行程序,构建工具会用默认的密钥对应用进行签名,所以每次构建时都不用手动输入。但是发布到应用市场的时候必须用自己的私钥对应用进行签名。

第2部分:运行应用程序涉及的组件

apk生成步骤

  1. 项目文件
  2. 编译和打包
  3. 编译和打包后的apk文件
    1. dex:java文件编译成字节码后再编译为dalvik所需要的dex文件。
    2. resources.arsc:编译后的二进制资源文件
    3. uncompiled resources:不需要进行编译的资源文件,如png
    4. AndroidManifest.xml:工程清单文件
  4. 对应用进行签名
  5. 通过Android Debug Bridge安装到手机或虚拟机。

第3部分:整个构建过程

完整构建示例图

  • 首先aapt(Android Asset Packaging Tool)会将应用程序资源文件(AndroidManifest清单文件、Acttivity所需的xml文件等)进行编译。为了使你的java代码能够操作资源文件,R.java文件也会被打包进你的apk。
  • aidl工具会生成对应的应用接口文件。
  • Java编译器会将你的所有Java代码(包括R.java和.aidl文件)编译,并输出.class文件。
  • dex工具会将你代码生成的class文件和项目中引入的任何第3方的class文件转换成Android虚拟机所需要的.dex文件,以便将其打包到apk中。
  • 打包工具会将编译的资源、未编译的资源(如png文件)、之前编译好的dex文件打包成apk文件。
  • 签名工具对打包好的apk进行签名,这样才能安装到设备。
  • 最后,如果应用程序以release签名,必须用zipalign工具对其进行对齐。当应用程序在设备上运行时,会减少内存的使用量,并让应用程序运行更有效率。

第4部分:hook整个编译过程

// NDK验证
If you are using NDK, verify the ndk...

:app:copyNativeLibs
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:checkReleaseManifest
:app:preDebugBuild UP-TO-DATE

// 准备库文件
:app:prepareComAliyunAmsAlicloudAndroidHotfix315Library
:app:prepareComAndroidSupportAnimatedVectorDrawable2520Library
:app:prepareComAndroidSupportAppcompatV72520Library
:app:prepareComAndroidSupportConstraintConstraintLayout102Library
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:prepareComAndroidSupportMultidex101Library
:app:prepareComAndroidSupportRecyclerviewV72520Library
:app:prepareComAndroidSupportSupportCompat2600Alpha1Library
:app:prepareComAndroidSupportSupportCoreUi2600Alpha1Library
:app:prepareComAndroidSupportSupportCoreUtils2600Alpha1Library
:app:prepareComAndroidSupportSupportFragment2600Alpha1Library
:app:prepareComAndroidSupportSupportMediaCompat2600Alpha1Library
:app:prepareComAndroidSupportSupportV42600Alpha1Library
:app:prepareComAndroidSupportSupportVectorDrawable2520Library
:app:prepareComAndroidVolleyVolley100Library
:app:prepareComAndroidkunXversionupdate104Library
:app:prepareComBmPhotoviewLibrary141Library
:app:prepareComFacebookStethoStetho150Library
:app:prepareComFacebookStethoStethoOkhttp150Library
:app:prepareComGetuiSdk21110Library
:app:prepareComGithubGzuLiyujiangAndroidPickerCommon144Library
:app:prepareComGithubGzuLiyujiangAndroidPickerWheelPicker144Library
:app:prepareComGoogleAndroidFlexbox027Library
:app:prepareComJakewhartonButterknife851Library
:app:prepareComLwkandroidRTPermissionLib130Library
:app:prepareComMcxiaokePackerNgHelper200Library
:app:prepareComScwangSmartrefreshSmartRefreshLayout103Library
:app:prepareComTencentBuglyCrashreport1238Library
:app:prepareComYouthBannerBanner1410Library
:app:prepareComZhyBaseAdapter303Library
:app:prepareItSephirothAndroidLibraryHorizontallistviewLibrary121Library
:app:prepareReleaseDependencies

// 编译AIDL
:app:compileReleaseAidl

// 编译Release脚本
:app:compileReleaseRenderscript

// 生成Release构建配置
:app:generateReleaseBuildConfig

// 生成资源值
:app:generateReleaseResValues
// 生成资源
:app:generateReleaseResources
// 合并资源
:app:mergeReleaseResources

// 清单文件
:app:processReleaseManifest

// 处理资源文件
:app:processReleaseResources
:app:generateReleaseSources

// 安全加固
:app:incrementalReleaseJavaCompilationSafeguard

// 编译java代码
:app:javaPreCompileRelease
:app:compileReleaseJavaWithJavac

// 编译NDK
:app:compileReleaseNdk NO-SOURCE
:app:compileReleaseSources

// 对齐操作
:app:lintVitalRelease
// 合并着色器(开发期间将部分功能进行编译)
:app:mergeReleaseShaders
// 编译着色器
:app:compileReleaseShaders

// 资产文件相关操作
:app:generateReleaseAssets
:app:mergeReleaseAssets

// 将二进制文件软为android所需要的dex文件
:app:transformClassesWithJarMergingForRelease
:app:transformClassesWithMultidexlistForRelease
:app:transformClassesWithDexForRelease

// jni库操作
:app:mergeReleaseJniLibFolders
:app:transformNativeLibsWithMergeJniLibsForRelease

// 
:app:processReleaseJavaRes NO-SOURCE
:app:transformResourcesWithMergeJavaResForRelease

// 验证签名
:app:validateSigningRelease

// 打出Release包
:app:packageRelease
:app:uploadReleaseSymtabFile

// 集合包
:app:assembleRelease

以上是整个编译的过程,没有明白全部命令的具体操作,但是可以大致了解编译的时候干了些什么,也加深一些理解。

第5部分:AndroidStudio从电脑打包至手机所用命令

adb push /Users/hh/workspace/MyProject/app/build/outputs/apk/app-release.apk /data/local/tmp/com.tt.shop

adb shell pm install -r "/data/local/tmp/com.tt.shop" pkg: /data/local/tmp/com.tt.shop

adb shell am start -n "com.tt.shop/com.tt.shop.views.activity.IndexActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐