Android上层启动过程的几个关键点

Android Launcher启动过程 开机启动概述: step 1: 上电开机 长按power键后引导芯片开始从固化在ROM的预设代码处执行,加载引导程序(BootLoader)到RAM. step 2: BootLoader启动 跳转到BootLoader的入口函数,开始执行BootLoader的代码. 硬件初始化工作(硬件时钟、手机的主板等) 完成初始化uart端口的操作 arch_init target_init apps_init aboot_init 跳转到内核入口函数start_kernel,启动内核. step 3: kerne 阅读详情

        在前面我简单的描述了Android的启动过程http://blog.youkuaiyun.com/codectq/article/details/7383231,但终究是不够完善。

        现在在工程中遇到了实际的问题,反过来阅读下代码,再重新审视一下在kernel启动之后的ANDROID启动过程。

        在frameworks/base/services/java/com/android/server文件夹下的SystemServer.cpp文件。在此文件中调用了init1()函数,文件中对次函数的描述为:这个方法是从Zygote中调用来初始化系统。这将引起本地的服务(Surfaceflinger,audioflinger等)开启。在这些完成之后将回调init2()来开始android服务。

       从上面的描述中我们可以得知两个方面:一是在android的服务中,我们分两种服务,一种是native服务,另一种是android服务。二是我们的本地服务是在init1()的过程中完成的,而android服务是在init2()的过程中完成的。

        从实际的真机的启动过程的打印信息我们也能够看出,在启动的过程中,我们首先会启动SurfaceFlinger,AudioFlinger然后开始启动dalikvm,从而进入对Zygote和System并且通过调用system_init()函数和sysproc来启动Android runtime 启动native service。通过回调init2(),Android  service\thread pool从而进入systemserver,运行systemserver线程,将注册到systemserver中的服务启动。

        如果我们想借助Android本身的架构来完成添加我们的服务的目的的情况下我们不妨就利用这些。

        在我们通过使用JNI机制使得上层的java应用能够调用native service。而具体的实现就是将.cpp文件放在JNI文件夹下,而将.java文件放在java文件夹下。具体步骤如下:

        在上文中,我们说过我们可以借助Android自身架构的东西来完成我们的JNI服务,而不必每个细节都自己完成。并且我们提到我们会调用AndroidRuntime所以我们可以将服务注册到AndroidRuntime.cpp文件中。下面是个经典的例子,此处做个摘抄地址为http://dongyulong.blog.51cto.com/1451604/545496(但是不知道是不是原作者)

frameworks/base/core/jni 路径下创建例子 android_mytest_hellojni.cpp 文件,这个文件就是在 JNI 层实现接口。文件内容如下:(可参考同一目录下的 android_debug_JNITest.cpp 文件编写)

#define LOG_TAG "HelloJNI"
#include "jni.h"
#include "nativehelper/JNIHelp.h"
#include "utils/Log.h"
#include "utils/misc.h"

namespace android {
static jstring android_mytest_hellojni_displayString(JNIEnv *env, jclass clazz)
{
 return env->NewStringUTF("Hello from JNI!");
} 

/*
 * JNI registration.
 */

static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    { "displayString", "()Ljava/lang/String;",
            (void*) android_mytest_hellojni_displayString },
    
};
int register_android_mytest_hellojni(JNIEnv* env)
{ //此处的目录结构就是在Javaframework层的文件目录,且必须一致

return jniRegisterNativeMethods(env, "android/mytest/hellojni", 
        gMethods, NELEM(gMethods));
}
};

2. JNI 层:对编译的修改配置

  2.1修改/Android/android-1.6_r2/frameworks/base/core/jni目录下的Android.mk 文件,在LOCAL_SRC_FILES:= \ 下面加上
android_mytest_hellojni.cpp \ 
   2.2修改/Android/android-1.6_r2/frameworks/base/core/jni目录下的AndroidRuntime.cpp 文件在extern int 后面添加
extern int register_android_mytest_hellojni(JNIEnv* env); 
然后在static const RegJNIRec gRegJNI[] = {下面添加
REG_JNI(register_android_mytest_hellojni), 
这样,JNI层的修改就到此为止了。

frameworks/base/core/java/android/ 新建文件目录 mytest ,在该目录下新建文件 hellojni.java 声明接口。内容如下:(可以参考 android-1.6_r2/frameworks/base/core/java/android/debug 目录下的 JNITest.java 文件编写) 

package android.mytest;
public class hellojni{
    public hellojni(){}
//此处声明为public所以才可以被application调用

    public static native String displayString(); 
}

4 .下面我们要对我们做过更改的 libandroid_runtime.so 和 framework.jar 进行重新编译。

在源代码工程目录下输入 make libandroid_runtime 重新编译生成 libandroid_runtime.so

…

target thumb C++: libandroid_runtime <= frameworks/base/core/jni/android_mytest_hellojni.cpp

target thumb C++: libandroid_runtime <= frameworks/base/core/jni/AndroidRuntime.cpp

target SharedLib: libandroid_runtime (out/target/product/generic/obj/SHARED_LIBRARIES/libandroid_runtime_intermediates/LINKED/libandroid_runtime.so)

target Prelink: libandroid_runtime (out/target/product/generic/symbols/system/lib/libandroid_runtime.so)

target Strip: libandroid_runtime (out/target/product/generic/obj/lib/libandroid_runtime.so)

Install: out/target/product/generic/system/lib/libandroid_runtime.so

然后再输入 make framework 重新编译生成 framework.jar

…

Install: out/target/product/generic/system/framework/framework.jar


安卓APP(2)——安卓的工程目录文件夹介绍和安卓APP启动过程 阅读详情

相关推荐

Android Activity的启动过程

简称AMS,服务端对象,负责系统中所有Activity的生命周期。,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作。,用来实现ActivityManagerService与ActivityThread之间的交互。

Code857 的博客 847

Android 源码解读-应用是如何启动的

作为多年的 Android 开发,写了不少应用,但是一个App到底是怎么启动起来的?你要说桌面点一下就启动了,那也对。但是它的启动过程呢?带着这样的疑问,咱们来一步步学习。

maniuT的博客 2084

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

Android 源码分析 - 系统 - 库结构

libandroid_runtime 源代码位置:frameworks/base/core/jni。 包含AndroidRuntime类,目录下的jni函数,链接libinput等库。 libandroid_servers 源代码位置:frameworks/base/service/jni。 包含目录下的jni函数,链接libinputservice、libsensorservice等库。 由SystemServer通过loadLibrary(java)方式加载。 frameworks-bas

luansxx的专栏 394

从Level 1到Level 22:手把手带你用Burp Suite通关burp-labs靶场全关卡(附难点解析)

本文详细解析了如何使用Burp Suite通关burp-labs靶场的22个关卡,从基础爆破到复杂编码绕过,涵盖Intruder配置、响应过滤、POST请求处理、MD5爆破等关键技术。特别针对Level 16的三重编码和Level 20的中文响应处理等难点提供实战技巧,帮助渗透测试工程师提升Web安全实战能力。

weixin_28831461的博客 436

《联邦学习实战》杨强 读书笔记十四——构建公平的大数据交易市场

当数据具有资产属性之后,数据便可以直接或者间接地为公司、为社会创造价值和收益,并且可以作为一种特殊的商品在市场中进行交易。 与传统的商品交易相比,数据资产交易的市场前景更广阔,但同时也面临着很多的挑战,主要包括: 数据的质量、价格如何定义 在合法合规的前提下,数据的交易如何确保不会泄露用户的隐私 如何构建合理的激励机制来鼓励更多的参与方加入数据交易市场中 大数据交易 数据交易的定义 数据交易是指一种对数据进行买卖的行为,大数据交易由三方共同参与,分别为数据提供方、大数据交易平台和数据需求方:

IEEE802_11的博客 3433

Android系统启动流程完整分析(三)

(1)zygote进程入口 从上文的rc文件可以知道,zyogte进程的原型是: service zygote /system/bin/app_process64 代码路径为:frameworks/base/cmds/app_process,先来看一下mk文件。 LOCAL_PATH:= $(call my-dir) app_process_common_shared_libs := \ libandroid_runtime \ libbinder \ libcutils \

Flying snow 1033

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4865

【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )

一、Android 虚拟机涉及的 libdvm.so 动态库 和 libart.so 动态库、 二、Android 运行时相关 libandroid_runtime.so 动态库、 三、Android Framework 层 Native 实现相关 libandroidfw.so 动态库

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 8187

西门子博图v16安装密钥提示报错:CryptAcquireContext MS_DEF_PROV Error of containger opening...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 3300

【Transformer】小白入门指南

Transformer是起源于NLP领域,然后在图像、视频、声音等领域都得到了广泛应用的基础架构,是继MLP、CNN、RNN’后的公认的第四大基础模型结构。Transformer技术凭借其卓越的表现和广泛的应用前景,已经成为了机器学习领域的一个关键技术。自从2017年Google提出》一文以来,Transformer架构的出现彻底改变了机器学习和深度学习的格局,尤其是在处理语言模型、生成模型以及多模态学习等领域,Transformer几乎成为了不可或缺的技术基石。

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 2522

android runtime虚拟机,zygote分析--AndroidRuntime::start()

AndroidRuntime.cpp的路径为/frameworks/base/core/jni/AndroidRuntime.cpp在上一篇文章中分析了app_main.cpp,得到app_main.cpp的main()方法最终调用了AndroidRuntime的start()方法(runtime为apptime类型的对象,apptime继承了androidruntime的start方法)。run...

weixin_39824834的博客 720

基于Vision Transformer的鸟类图像分类(200个类别)完整代码+数据

基于Vision Transformer的鸟类图像分类(200个类别)完整代码+数据

1727

【安卓逆向系列】安卓的启动流程

【最后步骤很关键,重新启动init的过程也讲加载的权限进一步降低,在整个第一阶段都是以权限极高的kernel执行,转化为init域后权限降低,更为安全,这个就是SELinux安全策略的作用】主要的功能是设置了虚拟机的参数,利用了很多的parseRuntimeOption函数(对于不同的软硬件环境,函数的参数往往需要调整、优化,从而使系统达到最佳性能)所有的app进程都是由zygote进程fork而来的。进程(翻译为受精卵,此进程也称为安卓的应用进程孵化器,是所有应用进程的父进程)对于此孵化进程,他会加载。

xianyu_yuan的博客 1318

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

安卓开机启动流程

安卓开机启动流程

似霰的博客 4880

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android启动过程

SystemServer启动过程 1.设置时间、时区、语言等; 2.startBootstrapServices:读配置,启动开机必备的服务:AMS、PMS等等 startCoreServices:其他重要服务,DropBox、电池、应用使用情况服务等 startOtherServices:通知、蓝牙、wifi等设备相关服务。 3.在AMS的systemReady 中调用startHomeActivityLocked 启动launcher。 4.Launcher启动后,会在Activit...

风和先行的专栏 3608

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【安卓开发】安卓工程介绍及启动过程

文件作用存放java代码的,有包,有文件。

qq_62361050的博客 964

安卓启动过程

安卓启动过程引言1 用户态init阶段 引言 安卓系统的启动过程如下: 整个流程分为四个阶段,即引导阶段、内核启动阶段、用户态init阶段、Zygote启动阶段。由于安卓系统内核基于linux修剪而成,其引导和内核启动与linux基本相同,差异性的是用户态init阶段和Zygote启动阶段,特别是Zygote阶段是安卓特有的。 注 1 :本文中断解析用户态init阶段和Zygote启动阶段,引导...

fs3296的博客 432

Android开发——Android系统启动以及App启动过程

0.前言从Android手机打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的?1.系统上电当给Android系统上电,在电源接通的瞬间,CPU内的寄存器和各引脚均会被置为初始状态,CPU复位之后,程序指针会指向启动地址,从该地址读取并直接运行启动程序的可执行代码,或者将可执行代码与数据载入CPU内置的RAM中再运行。这一段代码,放在PC中,叫做BIOS,而在Andro...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 6038

android 启动过程及init.rc

目录android 启动过程1.init 进程1.1 action1.2 service1.2.1 service的class2添加启动脚本总结 关于安卓启动过程,参考链接如下: Android启动过程深入分析 android 启动过程 以下内容属于转载,侵删! 第一步:启动电源以及系统启动 当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。 第...

u012944254的博客 2730

Android系统的启动过程(三):Launcher启动过程

前两篇文章中我们已经将系统启动的过程推进到了系统服务启动完毕之后,本篇文章就来介绍Android系统启动的最后一步:启动Launcher。这个Launcher我们可以通俗地理解为桌面,系统启动的最后一步就是启动一个应用程序来显示系统中已经安装完成的应用程序,这个应用程序就叫做Launcher。在 Android 系统启动的最后一步,是启动系统的默认桌面(Launcher)。桌面是用户与 Android 设备交互的主要界面,它提供了应用程序图标、小部件、壁纸等元素,使用户可以访问和启动应用程序。Launche

Tai_Monster的博客 6348

android的启动过程

<!-- p {margin-bottom:0.08in} --> Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动,下面我们分别来了解一下具体的过程。本篇我们主要是研究android的启动过程,linu

太妃糖的专栏 2125

Android 启动过程总结

<br /> <br />Android从Linux系统启动有4个步骤;<br />(1) init进程启动<br />(2) Native服务启动<br />(3) System Server,Android服务启动<br />(4) Home启动<br />总体启动框架图如:<br /><br /> <br /> <br /><br />第一步:initial进程(system/core/init)<br />     init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行

basonjiang的专栏 3988
上一篇: 虚拟机问题
下一篇: Android 4.0 触摸屏消息(一大写的一)
野-百-合
博客等级 码龄17年 308粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值