Android编译和运行原理学习笔记

来源:互联网 发布:潍坊知行学校 编辑:程序博客网 时间:2024/05/22 01:32

第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.shopadb shell pm install -r "/data/local/tmp/com.tt.shop" pkg: /data/local/tmp/com.tt.shopadb shell am start -n "com.tt.shop/com.tt.shop.views.activity.IndexActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER