導航:首頁 > 操作系統 > android中framework

android中framework

發布時間:2022-07-27 17:30:11

『壹』 android framework具體工作是什麼

說簡單點,Framework具體的工作也就是為android應用開發的開發人員提供了一系列的服務和API的介面。
能夠從源碼下載到編譯,到移植進開發板都能順利的完成" 你的這些經驗挺符合要求的啊,招聘信息里寫的"Android Framework"指的應該就是/frameworks/base,多數是java代碼。看樣子他們是在做Android設備,廠商一般是做移植,然後根據自己產品的特點可能會在frameworks及整個平台里加自己的擴展功能。

『貳』 怎麼開發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();
}
}

『叄』 做Android驅動開發一定要懂Framework嗎

理論上是不太需要。不過作為一個android開發者,任何一個方面都需要了解,這樣可以開發出更健壯的程序。驅動大部分是c,c++的。framework在驅動上層,將驅動功能封裝為到java層給應用提供出系統硬體服務

『肆』 android framework 有什麼用

android fragmework是支持上層應用開發的必要框架,有些人也會專門去開發framework的

『伍』 android Framework學習步驟是個啥流程

一、閱讀Android源碼的術與道:
1、Android源碼的道
Android的功夫,在Android之外。要想「理解」而非單純的「知道」,想「學習」而非單純的「記誦」。必備基礎:信息檢索能力、編程語言(C\C++、Java)、計算機系統知識、設計模式、JVM,多線程設計
2、Android源碼的術
針對每一個模塊本身的職責,詢問更細節的實現,永遠記住,先有的問題,之後才有的代碼。代碼實現是新鮮的,但是有了之前的鋪墊和對問題的預期,它們的出現才是可理解的。
總結:先理解模塊對應的要解決的「問題」是什麼,再去給問題找解決方案的思路去理解源碼;
理解源碼的功夫不止在Android本身,也要提高Android之外的姿勢水平。

二、Framework需求開發與維護注意點
1、需求開發
1) 相關功能的現有模塊需要非常熟悉,否則會有非常大的風險
2 )所寫代碼盡量與已有類似的代碼保持風格一致
3 )必要的注釋,寫代碼的時候認為代碼的意圖貌似是理所當然,但是當別人看你的代碼或者過一段時間你自己查閱代碼的時候,很有可能由於代碼量過大,在代碼的海洋中未必容易理解某一段代碼的意圖
4 )找比自己能力強的,經驗較為豐富的同事review代碼。系統層畢竟是上層應用的基礎,必須保證其極高的穩定性,不像app即使有一些bug可以快速的迭代和發版推送。
2、維護
1 )優秀的代碼設計。Android的代碼加工的順序大致是Google源碼->晶元廠商的修改->OEM廠商的修改。這些代碼里積累了大量世界級優秀的代碼設計方式,架構思想,這樣咱們對代碼的學習和認識的起步就是不低的,所以閱讀大量的代碼過後,我們再嘗試寫代碼的時候,一般也不會寫出低質量的代碼
2 )分析定位的技巧。一個經驗豐富的工程師的價值,主要會體現在遇到問題時,能夠分析定位解決問題的能力和效率,而很少會聽說我這有個20年經驗的工程師,他的價值在於別人一個小時能寫成的代碼他在一分鍾就寫出來了。

『陸』 如何調試android framework

這里先把代碼再放出來
ZygoteInit.java
[java] view plain
public static List<String> readCommandOutput(String command) {

Runtime rt =Runtime.getRuntime();

java.lang.Processproc;

try {

proc =rt.exec(command);

if (proc.waitFor() != 0) {

return null;

}

LinkedList<String>list = new LinkedList<String>();

InputStreamReader ir = new InputStreamReader(proc.getInputStream());

BufferedReader in = new BufferedReader(ir);

String line = null;

while ((line = in.readLine()) != null) {

list.add(line);

}

return list;

} catch (InterruptedException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

public static String getPackageName(){

String strPid =Integer.toString(android.os.Process.myPid());

String cmd = "ps";

List<String>result = readCommandOutput(cmd);

if(result == null){

return "";

}

for(String info:result){

if(info.contains(strPid)){

int index = info.lastIndexOf(" ");

if(index >=0){

StringsubStr = info.substring(index+1);

Log.i(TAG,subStr);

return subStr;

}

}

}

return "";

}

public static boolean needDebug(String packageName){

String debugProcess = android.os.SystemProperties.get("persist.sys.debug");

Log.i(TAG,debugProcess);

if(debugProcess.equals(packageName)){

return true;

}

return false;

}

public static void main(Stringargv[]) {

try {

// Start profiling the zygote initialization.

SamplingProfilerIntegration.start();

registerZygoteSocket();

EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,

SystemClock.uptimeMillis());

preload();

EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,

SystemClock.uptimeMillis());

// Finish profiling the zygote initialization.

SamplingProfilerIntegration.writeZygoteSnapshot();

// Do an initial gc to cleanup after startup

gc();

// If requested, start system server directlyfrom Zygote

if (argv.length != 2) {

throw new RuntimeException(argv[0] + USAGE_STRING);

}

if (argv[1].equals("start-system-server")) {

startSystemServer();

} else if (!argv[1].equals("")) {

throw new RuntimeException(argv[0] + USAGE_STRING);

}

Log.i(TAG, "Accepting command socket connections");

if (ZYGOTE_FORK_MODE) {

runForkMode();

} else {

runSelectLoopMode();

}

closeServerSocket();

} catch (MethodAndArgsCaller caller) {

String packageName = getPackageName();

if(needDebug(packageName)){

android.ddm.DdmHandleAppName.setAppName(packageName,UserHandle.myUserId());

android.os.Debug.waitForDebugger();

}

caller.run();

} catch (RuntimeException ex) {

Log.e(TAG, "Zygote died with exception", ex);

closeServerSocket();

throw ex;

}

}

5 如果有興趣,繼續往下看!

6 readCommandOutput:用於執行命令並獲取命令的輸出

7 getPackageName()有於獲取當前進程的包名
這里默認進程名稱即為包名
獲取ps的輸出
然後通過pid找到本程序所在的輸出行。
提取出本程序所在的輸出行包名

8 needDebug()用於判斷當前進程是否需要調試,原理是這樣的:
使用者通過setprop persist.sys.debug 包名來設置包的名稱
needDebug獲取 persist.sys.debug
再與本進程的包名進行比較,以判斷是否要調試

9 接下來的動作就和《Android實現開機調試system_process》一樣了:
設置App在DDM中的名稱:
android.ddm.DdmHandleAppName.setAppName(packageName,UserHandle.myUserId());
等待調試器來連接:
android.os.Debug.waitForDebugger();

10 接下來重新編譯和燒錄,mmm...,一個漫長的過程,但是結果將會證明一確都是值得的。

11 接下來,創建一個偽工程,修改Manifest中的package為需要調試的程序包名

12 再在工程中將需要調試的framework層代碼引進來

13 接下來,adb shell連接到android,進行命令行

14 執行命令:
setprop persist.sys.debug 包名

15 在需要調試的代碼上設置斷點

16 接下來,啟動應用程序,注意,是直接啟動程序,而不是通過eclipse啟動調試!

17 enjoy it!

『柒』 android framework層是用於開發什麼

framework的開發比應用層就要煩的多啦。做應用在eclipse中就足夠了,用android系統中的控制項等工具,或者是自己寫個類來實現特定的功能。而framework層的開發,需要往源碼中添加代碼、xml、圖片、id等等數據,這個id可是費了我好大的勁才搞定的。在項目開始的一個半月里,我探索、嘗試了很多,現在把我的經驗分享出來。網上關於framework層的開發信息很少,多是靠自己。
最有效的方式就是分析android的源碼,看google是怎樣實現一個類的,以及類的層次。我現在看的主要是widget和app中的代碼,其他的還沒涉及。像View,ViewGroup,Activity,ActivityThread都是非常重要的類,也是代碼量很大的類,我只是大概地過了下,還沒有仔細分析過。

我花大力氣的地方是資源文件夾下values中幾個文件的作用。

attrs.xml中定義的是類的屬性,屬性是為了能在xml文件中被引用到,換句話說就是指定類中變數(也就是屬性的實際作用者)的值。這些屬性會在類的構造函數中用到。看過一兩個源碼就會明白,構造函數中的TypedArray其實就是屬性的數組,數組的成員會被賦給類里的成員,完成從xml的初始化。類的構造函數一般有三個,一個是Class(context),這個用於在代碼中創建一個類,所以只包含一個上下文;Class(context, attrs)和Class(context, attrs, defStyle)用於從xml創建類的情況。

styles.xml中是各個控制項的「樣式」,樣式由一個個屬性所組成。我們在編輯xml文件的時候,不同的類所能設置的屬性有共同的,也有不同的,都是由樣式來控制的。具體可以去看styles.xml這個文件的內容。

themes.xml其實也是樣式,只是適用的范圍大一點,這個我是參考網上別人的看法,自己還沒研究過。

ids.xml是公共的id,也就是對應用層可見的id,id是為了獲得xml中的對象而需要的參數,也就是Object = findViewById(R.id.id_name)中的id_name。這些值可以在代碼中用android.R.id引用到

public.xml描述的是為attr、id、drawable所指定的一個32的id值,這個值在current.xml文件中會被用到。

當我們對public.xml做了改動後,執行make update-api命令,相應的current.xml就會添加這些改動。因為這些值按類型被放在不同的段上,類型相同的必須連續存放,不指定id值的話系統會自動計算出下一個值。

添加id的方法:1)在ids.xml中添加公共id項,在public.xml中也添加相應的id項。這種辦法沒有兼容性,會與後面的版本產生沖突。

2)在ids.xml中添加公共id項,每一項前面加一行的注釋,這樣就不用在public.xml中添加相應的項了。源碼中是/** @hide */的形式,這樣current中就不會有相應的段了。

3)在自己寫的xml中,使用android:id = "@+id/id_name"的形式,就和在eclipse中一樣,搜一下會發現android源碼中也有這么用的,這樣ids.xml和public.xml都不用改,兼容性我還不確定。

上面這些希望能對大家有所幫助吧。

『捌』 什麼是android framework

說簡單點,Framework具體的工作也就是為android應用開發的開發人員提供了一系列的服務和API的介面。
能夠從源碼下載到編譯,到移植進開發板都能順利的完成" 你的這些經驗挺符合要求的啊,招聘信息里寫的"Android Framework"指的應該就是/frameworks/base,多數是Java代碼。看樣子他們是在做Android設備,廠商一般是做移植,然後根據自己產品的特點可能會在frameworks及整個平台里加自己的擴展功能。
http://blog.csdn.net/coding_or_coded/article/details/6822029

閱讀全文

與android中framework相關的資料

熱點內容
分段加密的安全性 瀏覽:507
咪咕直播為什麼沒有適配安卓系統 瀏覽:172
php模版大全 瀏覽:102
沒車能解壓嗎 瀏覽:634
php開發oa系統源碼 瀏覽:759
怎麼安裝蘋果ios的app 瀏覽:581
app拉新如何機刷 瀏覽:480
zendeclipseforphp 瀏覽:480
同時有幾個微信如何加密微信 瀏覽:86
大眾20t壓縮比 瀏覽:566
程序員要記住的500個單詞 瀏覽:830
wq快捷方式在哪個文件夾 瀏覽:965
雲南到河北源碼 瀏覽:92
安卓手機怎麼玩造夢3 瀏覽:60
多玩我的世界盒子怎麼創造伺服器地址 瀏覽:986
手機如何下載米家app 瀏覽:96
未知來源app在哪裡 瀏覽:206
命令與征服3合集 瀏覽:752
有免稅標簽有溯源碼是假的嗎 瀏覽:218
stc89c52單片機引腳圖 瀏覽:223