当前位置:首页 » 编程软件 » 安卓framework编译原理

安卓framework编译原理

发布时间: 2023-03-30 14:18:40

‘壹’ android framework具体工作是什么

说简单点,Framework具体的工作也就是为android应用开发的开发人员提供了一系列的服务和API的接口。
同事负责应用程序生命周期和资源等进行管理。
如果说你想了解framework 的内容,那需要关注android系统层内容。了解android系统架构。

‘贰’ android四大组件与framework 是什么关系

Framework意思是框架,Android framework就是已经安卓开发框架,提供了Android开发模式和所有安卓开发所需要的各个组件,并且把所有这些组件组合在一起,编译成一个完整的Android应用。四大组件是Android framework的一部分。

‘叁’ 什么是android framework

说简单点,Framework具体的工作也就是为android应用开发的开发人员提供了一系列的服务和API的接口。
能够从源码下载到编译,到移植进开发板都能顺利的完成" 你的这些经验挺符合要求的啊,招聘信息里写的"Android Framework"指的应该就是/frameworks/base,多数是java代码。看样子他们是在做Android设备,厂商一般是做移植,然后根据自己产品的特点可能会在frameworks及整个平台里加自己的扩展功能。
http://blog.csdn.net/coding_or_coded/article/details/6822029

‘肆’ Xposed Framework对于Android 5.0的支持是什么原理

着作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Edsger Lin
链接:http://www.hu.com/question/28178070/answer/39728292
来源:知乎

初步看了下,只支持ARMv7所以Nexus6可以用Nexus9就不要想了。。。。。。
作者说他干扰了ART的编译过程,禁用了一些优化以孝碧达到目的,所以可能会降低性能,不过并不是太明闭斗显。
简单的说他patch了ART的源码,自己基于AOSP的源码修改并重新编译了一个支持hook的libart.so然后通过XposedBridge.jar对外提供和以前一样的API。
这样看来使用新Xposed并不是像Dalvik时代那么无痛,性能可能减少,有些ART安全特性为了hook方便也关掉了。
作者说这只是alpha版,轿慎磨他自己在Nexus5上用没啥问题但是没有仔细测试过。
4.4的支持可行,但是他要先搞好5.X的支持。

修正一下,作者说他目前只保证v7支持"For now, I will only publish the ARMv7 version. 64-bit is more complex, so let’s try the “easy” variant first."所以我以为Nexus 9没被支持所以没仔细看= =

‘伍’ framework初了解与必备技能

E:Engine发动机,I:Interface接口,T:tire轮胎。有发动机和轮胎,再提供接口接口就可以让汽车跑起来。没有简单,我们就无法理解复杂;

application framework(应用框架层):无论是android提供的应用程序,还是开发人员自己编写的应用程序,都需要使用framework,核心的作用就是提供一个接口,给app跑起来,并且起到了屏蔽解耦作用。
简而言之,Framework具体的工作也就是为android应用开发的开发人员提供了一系列的服务和API的接口。同时负责应用程序生命周期和资源等进行管理。是android系统层内容。
framework是google厂商定制好了,最多修改一些bug或者添加一些东西,如果大改,很多应用就跑不起来。

Framework又分为Java Framework和Native Framewok:示意图如下:

csdn一篇博客通俗易懂的讲了framework: 我眼中的Android Framework
Framework是由多个系统服务共同组成。所有服务都寄宿在系统核心进程中,在运行时每个服务都占据一个独立的线程。
为了实现Java程序在运行阶段的二次编译,Android为他们提供了运行时(Runtime)的支撑。
运行时由Java核心类库和Java虚拟机Dalvik共同构成
Java核心类库涵盖了Android框架层和应用层所要用到的基础java库。dalvik负责动态解析执行应用、分配空间、管理对象生命周期等工作,是android心脏。
硬件抽象层(HAL):是安卓为厂商定义的一套接口标准,为框架层提供接口函数。
Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通讯的功能。

‘陆’ 如何学习MTK 编译android系统的framework层源码,需要看一些什么文档,最近在公司需要学习、

mtk有个叫makeMtk的脚本文件,直接执行就行,后面参数加上自己要编译的模块,比如./makeMtk -t mm frameworks/base/core/res

‘柒’ Framework 详解

即静态链接库。以 .a 或者 .framework 为文件后缀名。
在程序编译时会被链接到二进制可执行文培拆腊件中。

即动态链接库。以 .tbd (之前叫 .dylib ) 或者 .framework 为文件后缀名。
在程序配滑编御裂译时并不会被链接到二进制可执行文件中,而是在程序运行是才被载入。

Xcode 中集成 Framework 有三种状态: Do Not Embed 、 Embed & Sign 和 Embed Without Signing

‘捌’ 怎么开发android framework

一.认识android的架构
Android其本质就是在标准的linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。

二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了, 国内开发者访问(androiddevtools) 上面已经有了所有你要的资源,同时可以下载到我们的主角framework

但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。

搭建源码编译环境
http://www.cnblogs.com/bluestorm/p/4419135.html
https://source.android.com/source/downloading.html(这里详细的介绍了如何下载编译)
三.开始主题

在一开始写c程序的时候都有一个运行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

//这里的main就是应用的入口
int main(int argc, const char * argv[]){
return 0;
}

在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")

#include <stdio.h>
void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//加载套接字库,如果失败返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}

//判断高低字节是不是2,如果不是2.2的版本则退出
if (LOBYTE(wsaData.wVersion) != 2 ||

HIBYTE(wsaData.wVersion) != 2)

{
return;
}

//创建流式套接字,基于TCP(SOCK_STREAM)

SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);

//Socket地址结构体的创建

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换

//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行

listen(socSrv, 5);

SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体

int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof

//循环等待接受客户端发送请求

while (1)
{
//等待客户请求到来;当请求到来后,接受连接请求,

//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞

SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);

char sendBuf[100];

sprintf(sendBuf, "Welcome %s to JoyChou",

inet_ntoa(addrClient.sin_addr));//格式化输出

//用返回的套接字和客户端进行通信

send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节

//接收数据

char recvBuf[100];

recv(sockConn, recvBuf, 100, 0);

printf("%s\\n", recvBuf);
closesocket(sockConn);

}
}

他采用了一个while死循环去监听客户端的请求。
在一遍啰嗦之后,主角终于闪亮的登场了。

先上源代码
public final class ActivityThread {

public static void main(String[] args) {
SamplingProfilerIntegration.start();

CloseGuard.setEnabled(false);

Environment.initForCurrentUser();

EventLogger.setReporter(new EventLoggingReporter());

Security.addProvider(new AndroidKeyStoreProvider());

final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);

Process.setArgV0("<pre-initialized>");

Looper.prepareMainLooper();

//从中可以看到为app开辟了一个线程进入了looper之中

ActivityThread thread = new ActivityThread();
thread.attach(false);

if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}

AsyncTask.init();

if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}

Looper.loop();

throw new RuntimeException("Main thread loop unexpectedly exited");
}

}

看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();

Looper.loop();

进一步深入代码
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;

Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();

// 在这里看到了一个循环监听消息

for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}

Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}

msg.target.dispatchMessage(msg);

if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}

// Make sure that ring the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}

msg.recycleUnchecked();
}
}

热点内容
万科海上传奇二期 发布:2024-11-01 14:22:52 浏览:59
u盘文件夹是空的 发布:2024-11-01 14:19:57 浏览:402
python包含字符串 发布:2024-11-01 14:19:17 浏览:479
c语言的精华 发布:2024-11-01 14:19:02 浏览:588
steam截图文件夹 发布:2024-11-01 14:18:59 浏览:613
ipad怎么往安卓传照片 发布:2024-11-01 14:18:19 浏览:508
我的电脑没有文件夹选项 发布:2024-11-01 14:13:55 浏览:546
vb创建数据库表 发布:2024-11-01 14:11:55 浏览:872
sql联合表 发布:2024-11-01 14:03:25 浏览:962
linux编程gcc 发布:2024-11-01 14:02:41 浏览:705