activity学习

来源:互联网 发布:海岛奇兵兵种等级数据 编辑:程序博客网 时间:2024/05/21 06:23

今天没啥事,研究哈ANDROID。

android这个Linux操作系统肯定有它独特的东西,特别是作为移动操作系统,要省电。
所以android的设计理念要体现省电。

先看activity

直接看源代码

看这个肯定要用Source insight

打开建个项目,然后把frameworks/base都代码都加进去

习惯性的把apk文件解压看一哈!因为,任何操作系统的安装包都是可以被解压的,管你deb,rpm还是cab.这个是肯定的。

打开解压后的目录。

然后上网搜搜,发现原来:

AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具解开。其他XML都是压缩过的哈!

META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。

resources.arsc编译后的二进制资源文件

android的程序现在都是宣告式的了,就是把UI和程序逻辑剥离开了,可以直接通过修改XML文件修改程序布局以及外观。

其他图标那些文件则是可直接访问的,也没有必要压缩。

看见了这个classes.dex文件,我习惯性的把它解剖了。网上找找有没有解剖它的工具。

用自带的Dexdump dump一哈,这个工具在android-sdk-windows/platform-tools目录下,其他目录也有,你可以自己SEARCH一哈!de

用dexdump classes.dex 则可以显示出所有class文件的信息。




现在开始寻找android程序的入口点。找到了入口点,才知道一个程序的来龙去脉。

拿不准,dex文件的入口点,网上也没有详细的资料,没办法,跟dalvik的源代码

其实android的DEX文件其实是用DX命令从把多个CLASS文件整合成为一个单独的DEX文件。


我们跟踪dalvik的main.c   位于dalvik/dalvikvm目录下:


    /*
     * Find [class].main(String[]).
     */

    startMeth = (*env)->GetStaticMethodID(env, startClass,
                    "main", "([Ljava/lang/String;)V");

    if (startMeth == NULL) {
        fprintf(stderr, "Dalvik VM unable to find static main(String[]) in '%s'/n",
            slashClass);
        goto bail;
    }

从源代码看出:dalvik还是需要传递给他的启动类有一个main()函数。

但是我们的框架的启动类在哪里呢??

其实,手机里的程序都是由laucher启动的,

Launcher是Android系统的"桌面",在android2.1之前采用的是launcher,android2.2之后采用的launcher2

具体源代码在:
packages/apps/Launcher2/src/com/android/launcher.java

其实手机里的那些点击启动的activity都是用这个Launcher启动的。

这里插一哈,android的启动机制。

Linux起来后,首先是init进程,这个是常识。

然后是zygote,另外的就是native service.
然后是system server
然后才是service 和 manager

从zygote这个进程开始才建立起android 的运行空间。

我们还是先从zygote开始吧。

zygote是由init进程从RC文件里面启动起来的。

其源代码在目录:framework/base/cmds/app_process/App_main.cpp

我们就从这里开始吧:
在App_main.cpp
建立虚拟机实例,直接从C程序进入到JAVA程序:

com.android.internal.os.ZygoteInit

直接杀到frameworks/base/core/java/com/android/internal/os这个目录

这个入口是有main函数的哈!

在这个函数里面调用startSystemServer();

其实zygote 就是一个孵化池,打过星际争霸的哥们都晓得。虫族的怪物都要从这里孵化出来。

其他进程通过SOCKET与之通信,让其孵化出新的进程,在android里面的进程都是通过LINUX的fork系统调用孵化出来的。

这里就能理解android 的那些UID参数就是通过SOCKET传给zygote 的。

zygote首先孵化的进程就是system server

zygote的就啊java代码在libcore/dalvik/src/main/java/dalvik/system

Activity其实就是一个被ANDROID包装和管理后的LINUX进程。其不可能脱离普通LINUX进程而存在,因为其要用到LINUX的众多系统支撑,activity是HOSTING在Linux上的。

而system server 是什么东西呢?

android的所有系统服务框架都是建立在system server上的!相当于windows xp 里面的SCM.

服务分两种,原生服务和系统服务:

其实我们这里应该好好理解三个概念:

Server:这个是从物理实现来说的,一个Server是多个service的宿主。相当于Windows xp  里面的svchost和services进程起的作用
Service:这个是用功能意义上俩说的。
Manager:这个是从API意义上来说的,Manager往往是一种编程接口。


系统服务包括:
Activity Manager
Window Manager
Package Manager
Power Manager
Account Manager
Content Manager
Location Manager

Hardware Service
Sensor Service
Connectivity Service
Search Service
Battery Service

原生服务,也就是native服务包括:

其实我们不能称之为服务。而应该是LINUX的DAEMON,这个服务是进程为单位的。

ril-daemon
media
bootsound
bootanim
service manager等

从这里我们就知道Activity不是从main函数开始的,android对其有比较复杂的管理。

我们还是回到launcher2

其实Launcher 只是一个启动界面,相当于windows xp里面的资源管理器。Activity 不仅可以从这里启动,也能在其他Activity中启动。

具体启动函数就是startActivity(),launcher也是调用的startActivity()启动一个Activity

我们还是从startActivity()开始。

不过
在开始之前我们还是好好学习哈android的services,server,manager。

源代码目录位于frameworks/base/services

我们用Activity作为列子吧!
Activity Service的目录位于:
frameworks/base/services/java/com/android/server

先从Activity Manager说起,因为他是框架的入口。

Activity Manager直接调用Activity Manager Native
后者在利用Binder机制,获得信息。

IBinder b = ServiceManager.getService("activity");

该语句表明其向ServiceManger请求信息。
这里采用了android轻量级的IPC机制——binder机制.

这里服务器server向Service Manager注册自己可以提供的服务。

特别要注意的是,此服务非彼服务,这个不是我们框架里所说的那种应用程序可以起的服务我们称之为SDK service,而是系统服务。

系统服务好多甚至是用C来写的。



















原创粉丝点击