问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么开发android framework

发布网友 发布时间:2022-04-21 17:40

我来回答

2个回答

热心网友 时间:2023-07-05 16:41

一.认识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();
}
}

热心网友 时间:2023-07-05 16:41

零、准备工作:

开发环境:建议在ubuntu(32/64位均可)下进行开发。

开发板:推荐cubieboard、pcino

(资料开放,连相应的android源码以及硬件配置文件都有提供。

不推荐所谓的开源硬件Raspberry-Pi,毕竟Raspberry-Pi并不是真正的开源硬件。)

其他:串口线

强烈不推荐在windows环境下搞Android底层开发!!!

一个及格的Android工程师,就应该熟练在Linux环境下进行开发工作。

如果你不会“优雅”地使用Linux,不得不在windows下编辑代码,

恳请你记得设置编码utf-8!!!!!!!!!!

一、编译器的选择:

阅读/编译代码:eclipse (Java)、vim+ctags+cscope(C/C++)

搜索代码:shell

例如命令1:grep "Telephoney" -rn ./*

例如命令2:find -name Telephoney*

等等等

不会用eclipse,请不要说他不好用!

eclipse是阅读framework代码以及系统应用的居家旅行杀人必备神器。

正确使用eclipse阅读Android源码:

 复制eclipse的classpath到Android源码根目录

cp ~/android/development/ide/eclipse/.classpath ~/android

修改eclipse缓存设置

把eclipse.ini文件的3个值改为下面的值(不要盲目参考,需要根据自己机器情况来定):

-Xms128m

-Xmx768m

-XX:MaxPermSize=512m

(mac路径:eclipse/Eclipse.app/Contents/MacOS/eclipse.ini)

导入eclipse代码风格

把android-formatting.xml和android.importorder导入Eclipse

~/android/development/ide/eclipse/android-formatting.xml

~/android/development/ide/eclipse/android.importorder

导入Android源码

新建Java Project(不是Android project),选择从已存在的工程导入,定位到Android源码的目录进行导入即可。

PS:eclipse只是阅读/编辑代码的工具,编译源码还是需要通过make命令在终端编译的。



二、知识储备:

编程语言什么的没什么好说。

着重提一个:设计模式

由于Android源代码用到各种各样的设计模式,如果不会设计模式,将会大大降低你的阅读理解速度。

三、网站资料:

去看Android官方文档,很详细描述各模块的设计思路。

理解这个链接的内容,看个十遍八遍,一边看一边分析代码。

PS:由于比较笨(-’&#3663;_&#3663;’-),所以我当年是一边看一边翻译出来.

四、书刊资料:

邓凡平大神的《深入理解Android》系列

《深入理解Android:卷I/卷II》 [Kindle电子书] ~ 邓凡平

五、学习方法:

要一下子把所有模仿都理解透,是件比较困难的事情。

可以分模块学习:

Telephoney

Audio & media

webkit & Browser

Wi-Fi & wpa supplicant

Dalvik

Display & Surface flinger

Camera

等等等

另外,如果题主有什么问题,可以随时私信我,我平时的工作就是做Android FrameWork开发的,对这一块还算是比较熟悉。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
dnf白手抓头技能在那里学习 DNF的白手可以偷学技能吗? DNF阿尔伯特那个任务能偷学到技能 最好说说都能偷学什么谢谢了,大神帮 ... dnf白手如何偷学技能。。能学到什么。。不要转我到官方 说明白点... 上海ocp如何报考 混合物都有哪些 常见的混合物有什么 五峰芽毛尖的特点 五峰芽毛尖的功效与作用 五峰毛尖和芽茶的区别 如何修复乱码pdf文件 android Framework学习步骤是个啥流程? android framework具体工作是什么? 如何搭建android framework开发环境搭建 Android framework 如何开发?需要学习什么知识? 什么是android framework 蓝色妖姬是真花还是假花?一般多少钱? 人们通常用来送花的“蓝色妖姬”其实是什么花? 兰色妖姬是什么? 有没有自然生长的蓝色妖姬呢? 马耳他蓝玫瑰是真花还是假花 假花花束蓝色妖姬的做法 蓝色妖姬假花还需要用水养? 有什么办法可以知道蓝色妖姬的花是真是假 那用蓝色妖姬亮亮粉的假花是怎么制作的,有知道的嘛? 蓝色妖姬是真花还是假花 蓝色妖姬是真花吗 蓝色妖姬为什么花瓣摸起来像假花? 田螺什么弄才好吃 在爱花居买到的蓝色妖姬是假花吗? 爱花居卖的蓝色妖姬是真花还是假花啊? android如何使用framework层的方法 霓虹灯闪烁歌词 android 怎么调用framework层 霓虹灯闪烁工作原理 android手机里面的framework文件夹 android framework开发 做什么 陈小云的闽南歌《爱情恰恰》注音成普通话,我想学... 霓虹灯为什么一闪一闪 android framework 有什么用 霓虹闪烁是什么意思? 霓虹灯怎么读音 android framework层用什么工具开发代码 霓虹灯闪烁原理 怎么做android的framework层测试 霓虹灯的拼音是什么 android四大组件与framework 是什么关系 霓虹灯有规律的闪烁是要编程的么 android FrameWork Ndk方面的迷惑 霓虹灯闪烁 怎么开发 android framework