今天没啥事,研究哈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来写的。
activity学习
最新推荐文章于 2022-04-23 21:02:31 发布