Android编译和运行原理学习笔记
构建的过程将Android项目编译并打包成apk文件,这个apk文件是二进制文件的容器,它里面包含了手机或虚拟机上运行应用程序所需的所有信息。在手机或模拟器上运行程序的时候,通常会用debug或release模式运行程序,构建工具会用默认的密钥对应用进行签名,所以每次构建时都不用手动输入。但是发布到应用市场的时候必须用自己的私钥对应用进行签名。运行应用程序涉及的组件项目文件编
·
第1部分:构建过程概述
将Android项目编译并打包成apk文件,这个apk文件是二进制文件的容器,它里面包含了手机或虚拟机上运行应用程序所需的所有信息。
在手机或模拟器上运行程序的时候,通常会用debug或release模式运行程序,构建工具会用默认的密钥对应用进行签名,所以每次构建时都不用手动输入。但是发布到应用市场的时候必须用自己的私钥对应用进行签名。
第2部分:运行应用程序涉及的组件
- 项目文件
- 编译和打包
- 编译和打包后的apk文件
- dex:java文件编译成字节码后再编译为dalvik所需要的dex文件。
- resources.arsc:编译后的二进制资源文件
- uncompiled resources:不需要进行编译的资源文件,如png
- AndroidManifest.xml:工程清单文件
- 对应用进行签名
- 通过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
更多推荐
已为社区贡献7条内容
所有评论(0)