当前位置:首页 » 安卓系统 » android流程

android流程

发布时间: 2022-12-26 10:30:38

Ⅰ Android 打包流程

打包后的apk是一个压缩包,解压之后,内容如下:

详细可参考 apk签名原理

无论我们怎么配置gradle文件去自定义打包,但是都是要走上图所画的七个流程。七个深绿色的椭圆代表了七个不可或缺的打包步骤,并且每一个步骤都一个打包工具

所用到的工具:

zipalign 字节对齐:

为什么要以4字节整数倍为起始偏移?

在文件对齐后, 就可以使用mmap来直接读写apk文件

mmap映射

上面涉及到的Android打包流程是以gradle task链的形式串联起来的。
下面看一下常见的task



我可以想到的:

Transform API

https://www.jianshu.com/p/a134d00e81ab

https://www.jianshu.com/p/fffb81688dc5

Ⅱ Android的编译打包流程详解

下图的是官网对于Android编译打包流程的介绍。

官方的介绍非常笼统,简而言之,其大致流程就是:
编译-->DEX-->打包-->签名和对齐

(好像什么都没Get到,有一种意犹未尽的感觉……)

来一张外国大神的图片(注:这张图少了签名的步骤)

用文字解释一下上图的流程:

首先,我们整理一下编译的输入部分是什么(图中黄色部分):

接下来的步骤:

好了,编译打包的详细流程说完了,接下来我们看看是否能回答开篇的那些问题。

答:aapt工具对于每个资源文件生成了唯一的ID,这些ID保存在R.java文件中。如下是R.java文件的内容:

资源ID是一个4字节的无符号整数,在R.java文件中用16进制表示。其中,最高的1字节表示Package ID,次高1个字节表示Type ID,最低2字节表示Entry ID。

只有一个ID如何能引用到实际资源呢?实际上aapt工具还生成了一个文件resources.arsc,相当于一个资源索引表,或者你理解成一个map也行,map的key是资源ID,value是资源在apk文件中的路径。resources.arsc里面还有其他信息,这个就不多说了。

通过R.java文件和resources.arsc配合,就能引用到实际的资源文件。

答:第7步已经阐述了对齐所做的工作,为什么要进行对齐,这是为了加快资源的访问速度。如果每个资源的开始位置都是上一个资源之后的 4*n字节,那么访问下一个资源就不用遍历,直接跳到4*n字节处判断是不是一个新的资源即可。

如果举例子,那么对齐有点类似于资源数组化,数组的访问速度当然比链表快。

答:xml里面都是各种字符,不利于快速遍历。编译成二进制文件,用数字替换各种符号,一方面能快速访问,另一方面也能减少大小。

https://developer.android.com/studio/build/index.html
http://www.alittlemadness.com/2010/06/07/understanding-the-android-build-process/
http://blog.csdn.net/luoshengyang/article/details/8744683
https://stackoverflow.com/questions/6517151/how-does-the-mapping-between-android-resources-and-resources-id-work
http://www.jianshu.com/p/eaaddfe34d11

Ⅲ Android App安装以及启动流程

Android App的安装可以分为有界面的安装和无界面的安装。

有界面的安装其实就是调用系统App(PackageInstaller)去安装apk,打开安装apk应用之后,点击安装按钮执行startInstall方法,然后就进入安装中界面开始安装,安装成功或者失败都会有对应的回调。内部其实也是使用PackageManager的installExistingPackage方法,通过binder机制,调用到PackageManagerService的installExistingPackage方法,最终调用到installExistingPackageAsUser方法安装,而 安装的核心原理其实就是将apk文件拷贝到系统可识别的重要的文件目录

无界面安装是调用adb命令,执行到一个c写的commandline脚本,调用 install_app 方法,然后再调用 pm_command ,然后执行到pm脚本,执行 run 方法,调用 runinstall ,然后调用 installPackageAsUser 通过AMS执行安装。

说到App的启动,就需要从开机开始说起,Android开机会先把所有应用安装一遍就是把apk拷贝到对应的目录(这也是Android开机慢的原因)。

整个流程如下:

其实App的启动,除了刚开机是不一样之外,正常时候基本与Activity的启动非常接近。

Ⅳ Android 启动流程

makeApplication创建application中会执行attachBaseContext(context);

installContentProviders第一个参数context,是从上面传递下来的app,也就是application。
遍历providers列表,初始化每一个provider,都是用application的context。构造出ContentProvider然后执行attachInfo() 方法,attachInfo()执行完毕会执行onCreate()。

最后再mInstrumentation.callApplicationOnCreate(app);执行Application的OnCreate方法。

总结
从流程上来看,符合日志打印的流程Application#attachBaseContext() → ContentProvider#attachInfo() → ContentProvider#onCreate() → Application#onCreate()
ContentProvider持有的Context也是application,具备给SDK初始化使用。

这时候第一进程是zygote。zygote英文是受精卵的意思。android系统的所有进程都是由zygote进程fork而来。zygote最先启动的第一个进程是鼎鼎大名的SystemServer进程。这个进程包含了我们常说的三个大神级系统服务,分别是ActivityManagerService,WindowManagerService以及PackegeManagerService。

http://androidxref.com/6.0.0_r1/xref/frameworks/base/core/java/android/app/ActivityThread.java

进程入口在ActivityThread这个类的main()方法,这个main方法类似C语言的mian方法,是一个程序入口。

这个方法会接着调用ActivityManagerNatvie(一个单例类,可以获取ActivityManagerService的实例)的getDeafault()返回ActivityManagerService实例。

ApplicationThread是ActivityThread的内部类,他是App和系统跨进程交互的入口,它的实现类在客户端进程。

获得了正在Binder通信的客户端的当前线程的id,然后和ApplicationThread对象作为参数传入到AMS的attachApplicationLocked。

thread是ApplicationThreadProxy的对象引用,它是代理对象,先调用ApplicationThreadProxy的bindApplication方法,接着在这个方法中又调用ApplicationThreadNative的函数onTransact,然后函数onTransact中根据code找到对应的case,最终会调用ApplicationThread的bindApplication方法。

在这里,bindApplication方法通过向ActivityThread的消息队列发送BIND_APPLICATION消息

消息的处理调用handleBindApplication方法,handleBindApplication方法比较重要的是会调用如下方法

在执行完bindApplication()之后进入ActivityStackSupervisor.attachApplicationLocked(),这样我们整个应用进程已经启动起来了。开始activity的启动逻辑了。

这个类是一个AMS的一个栈管理类,里面存储着ActivityStack的集合。在这个方法,会遍历各个ActivityStack,找到前台栈,找到里面的TopActivity。然后比较 传进来的ProcessRecord.processName和UID是否个和opActivity对用的ActivityRecord里面的一致。如果一致,就调用ActivityStackSupervisor.realStartAcvitiyLocked(ProcessRecord,ActivityRecord)方法。

这个方法会调用传过来的ApplicationThread实例的ScheelLaunchActivity(包括ActivityRecord)方法,所以真正执行的是ActivityThread中的scheleLaunchActivity

这个方法是跨进程的,会把ActivityRecord同步到App进程的ActivityRecordClient数据结构,用来后面构造Application和Activity等。

ActivityThread接收到SystemServer进程的消息之后会通过其内部的Handler对象分发消息,经过一系列的分发之后调用了ActivityThread的handleLaunchActivity方法:

接着调用PerformLaunchActivity方法和HandleLaunchActivtiy()方法。performLauncherActivity,看名字应该就是执行Activity的启动操作了

1.这个方法主要是构造Application和通过mInstrumention.newActivity()构造Activity。

这个方法会初始化一个Window,以后详细讲,人格视图都是附在一个window的docorView上,然后由WMS.addView显示。

这个方法会调用Actiity的resume()方法,并且在makrVisible()里面调用WMS.addView(window),这个windows里面的docorView的contentView就是onCreate()里面setContentView(int layout)设置的contentView。

注意关于WMS.addView(window),这个系统服务,我们下次再讲,里面有一个类RootViewImpl,这个类负责管理我们contentView视图树的逐级绘制。

原文链接
https://www.cnblogs.com/mingfeng002/p/10330414.html
https://blog.csdn.net/ZZB_Bin/article/details/125209192

Ⅳ Android应用程序启动流程总结

AMS主要功能:
AMS是Android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。还负责启动或杀死应用程序的进程。

WMS主要功能:
为所有窗口分配Surface。
管理Surface的显示顺序、尺寸、位置。
管理窗口动画。
输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息。

PWS主要功能:
PMS 用来管理跟踪所有应用APK,包括安装,卸载,解析,控制权限等。

SystemServer也是一个进程,包括AMS、PMS、WMS等等。

zygote意为“受精卵“。Android是基于linux系统的,而在Linux中,所有的进程都是由init进程直接或者是间接fork出来的,zygote进程也不例外。

App进程是用户点击桌面icon时,通过Launcher进程请求SystemServer,再调用Zygote孵化的。

①点击启动一个App,Launcher进程采用Binder IPC向ActivityManagerService发起startActivity请求;

②ActivityManagerService接收到请求后,向zygote进程发送创建进程的请求;

③Zygote进程fork出新的子进程,即App进程;

④App进程通过Binder IPC向sytem_server进程发起绑定Application请求;

⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheleLaunchActivity请求;

⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;

⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。

⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。

备注:
Launcher,PMS,Zygote,App进程是三个独立的进程,相互通信就需要使用进程间通信机制。与Zygote通信是使用的socket通信,Launcher,PMS,App进程间使用的是Binder机制。

Ⅵ Android开机流程

最近回顾的一些知识,补充了一下。

源码标准:API : 29“Android 10.0”

android手机是怎么开机的?

android 的底层是 linux kernel“ 内核 ”,由 BootLoader“系统启动加载器” 负责加载(类似于计算机的BIOS系统)。

首先启动 init“父进程,第一个进程”进程,接着运行init.rc脚本,脚本文件有个命令启动了Zygote进程,初始化时会启动虚拟机。

Zygote进程fork出 SystemServer 进程,然后会调用SystemServer.main()方法。

run方法中,主要是在进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等。

下面是一些 主要 的初始化方法。

真正启动是在ActivityManagerService的中systemReady方法,调用resumeTopActivityLocked打开 锁屏界面

到这里,android的开机流程结束。

Ⅶ Android app开发流程有哪些环节

android app开发流程具体步骤如下:
一 应用开发规划:
※确定app软件功能。
※必须的app应用界面及界面跳转的流程。
※开发app需要的数据及数据的来源及格式。
※是否需要服务端支持。
※是否需要本地数据库支持。
※是否需要特殊权限。
※是否需要后台服务。

二 架构设计:
※分层。
※网络连接。
※数据处理-xml、domain。
※封装Activity。
三 界面设计:
※主界面确定。
※模块界面、列表、查看、编辑界面。
※菜单、按钮、对话框、提示信息。
※界面总体颜色。

四 数据操作和存储:
※数据来源。
※数据类型。
※存储方式。

五 业务实现:
※客户端业务解析。

六 页面跳转:
※每个页面间的跳转。
※菜单、按钮、事件等。
二、Android APP开发过程中需要注意的问题:
(1)Android APP开发有自己规范的一套标准,在开发中必须无条件遵守。
(2)在Android APP开发过程中,需要根据不同特性来进行优化。
(3)需要针对特定屏幕密度使用特定的图标和位图。
(4)避免利用那些智能手机可能不支持的硬件功能。
(5)还要针对网页的布局来调整字体的大小和触控按钮。

Ⅷ Android:一个完整app开发流程

可选MVP,MVVM

本app基于mvp架构。除了mvp架构的文件。
还包含下面的文件夹
ui (下面根据Activity划分)
widget (自定义dialog等)
base (BaseActivity,BaseFragment)

有侧滑栏,tab的一般用fragment

设置sw-360dp,sw-480dp等不同的dimension目录,根据百分比计算dp值。

bindview使用butterknife,不同组件通信使用EventBus,定时使用RxJava,崩溃收集bugly

按钮样式:
使用selector

按钮背景色,包括颜色和圆角

使用ConstraintLayout,直接使用标注的值来做,最简单,不要用百分比。使用layout_constraint,layout_margin完成所有布局。

在AndroidStudio直接肉眼布局,Android可以选择不同的分辨率机器,水平或者垂直进行预览

配置sdk版本
配置abi

使用蓝湖进行图片的协助。提供m,h,x,xx等不同分辨率的图片

Ⅸ Android开机流程

当电源键按下系统加载引导程序 BootLoader 到RAM中,开始执行

Android操作系统运行前通过 BootLoader 小程序拉起系统OS

当内核启动时,首先进行系统设置,比如:设置缓存、加载驱动等,设置完成则在系统中寻找init.rc文件并启动第一个进程: init

zygote虚拟机启动一个子进程system_server,同时定义了一个Socket用来处理AMS启动应用的请求

ZygoteInit.java里面通过startSystemServer() fork出了SystemServer进程,SystemServer和Zygote进程是Android框架中两个重要的进程,系统里重要的进程都在SystemServer里开启,如AMS、WMS、PMS等。

SystemServer启动后会初始化ActivityManagerService,同时加载本地系统服务库,调用createSystemContext()创建系统上下文,创建ActivityThread及各种服务

AMS开启后会调用finishRooting()完成系统引导过程,同时发送开机广播,ActivityManagerService会与zygote的Socket通信,请求启动Home。zygote收到AMS的连接请求后,zygote处理请求会通过fork启动新的应用进程,并最终启动Home。完成系统界面的加载与显示。

Ⅹ Android打包流程

官方详细: https://ionicframework.com/docs/intro/deploying/
ps:打包前做好config.xml配置如包名

一、添加android平台
添加之后,在项目目录的platforms下会生成一个android文件夹。

二、cordova编译应用
使用build命令编译应用的发布版本,这个过程需要你的android sdk和环境变量、java jdk和环境变量、android的gradle配置没有错误。

编译成功之后,在项目路径platforms/android/build/outputs/apk/android-release-unsigned.apk未签名文件,这个时候的apk还不能被安装到手机上。

三、生成签名文件

输入的密码要记住,其他姓名地区等信息随便填吧,最好还是记住,成功之后在主目录下就生成了 jhy-release-key.keystore 文件,命令中jhy-release-key.keystore是生成文件的名字, alias_jhy 是别名,随便起但是要记住,一会签名要用到,其他信息如加密、有效日期等就不说了,无需改动。

生成后会提示:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore jhy-release-key.jks -destkeystore jhy-release-key.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
执行命令:

执行结果: Warning: 已将 "jhy-release-key.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "jhy-release-key.jks.old" 进行了备份。

四、签名应用文件

把在第二步生成的android-release-unsigned.apk拷贝到与生成的jhy-release-key.jks同一目录下,也就是项目的主目录下,执行命令:

输入签名文件的密码,成功之后主目录下的android-release-unsigned.apk就被签名成功了,会比原来未被签名的apk文件大一点,能够安装到手机或android虚拟机上了。

签名完成后会提示没有时间戳,忽略即可

检测是否签名成功:

也可用以下命令签名并生成新apk文件

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:619
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:347
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:62
php微信接口教程 发布:2025-04-16 17:07:30 浏览:288
android实现阴影 发布:2025-04-16 16:50:08 浏览:781
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:334
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:197
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:791
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:350
土压缩的本质 发布:2025-04-16 16:13:21 浏览:578