adb的全稱為Android Debug Bridge,就是起到調(diào)試橋的作用。通過adb我們可以在IDE中方面通過DDMS來調(diào)試Android程序,說白了就是debug工具。 adb的工作方式比較特殊,采用監(jiān)聽Socket TCP 5554等端口的方式讓IDE和Qemu通訊,默認(rèn)情況下adb會daemon相關(guān)的網(wǎng)絡(luò)端口,所以當(dāng)我們運(yùn)行IDE時adb進(jìn)程就會自動運(yùn)行。
公司主營業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出興隆免費(fèi)做網(wǎng)站回饋大家。
adb的全稱為Android Debug Bridge,就是起到調(diào)試橋的作用。通過adb我們可以在Eclipse中方面通過DDMS來調(diào)試Android程序,說白了就是debug工具。 adb的工作方式比較特殊,采用監(jiān)聽Socket TCP 5554等端口的方式讓IDE和Qemu通訊,默認(rèn)情況下adb會daemon相關(guān)的網(wǎng)絡(luò)端口,所以當(dāng)我們運(yùn)行Eclipse時adb進(jìn)程就會自動運(yùn)行。
對于安卓開發(fā)與測試來說就像一把“瑞士軍刀”
ADB本身是Android手機(jī)開發(fā)時的調(diào)試工具,但是也可以用來作為手機(jī)管理工具。
基本上現(xiàn)在的豌豆莢(豌豆莢會自動在手機(jī)上安裝其APP-靜默安裝)、360手機(jī)助手、qq手機(jī)助手對手機(jī)的管理功能都是通過ADB來實(shí)現(xiàn)。
ADB的管理功能需要手機(jī)打開調(diào)試選項(xiàng),這為手機(jī)管理提供了方便,同時也造成了安全隱患。
因?yàn)锳DB工具可以實(shí)現(xiàn)查看手機(jī)內(nèi)容、向手機(jī)寫入文件、給手機(jī)安裝軟件等功能,這些都不需要root權(quán)限。
當(dāng)我們打開手機(jī)的調(diào)試選項(xiàng),并使用USB線將手機(jī)連接到PC時,不僅僅是手機(jī)管理工具可以控制手機(jī),只要調(diào)用ADB命令,任何PC端的程序都可以訪問手機(jī)內(nèi)容。
假設(shè)有一個運(yùn)行在PC端的間諜程序,那么就很容易檢測到手機(jī)與PC的連接,而且只要一條很簡單的命令"adb.exe shell ls /"就可以列出手機(jī)根目錄下的所有文件了。
其實(shí)如果打開了手機(jī)的調(diào)試選項(xiàng),那么手機(jī)連接到PC后就是在“裸奔",手機(jī)中的所有信息都可以被PC端抓取,其實(shí)這也就是現(xiàn)在流行的手機(jī)管理工具的基本原理。
所以如果需要保護(hù)手機(jī)上的私密信息,那么最好謹(jǐn)慎打開手機(jī)的USB調(diào)試選項(xiàng)
一.認(rèn)識android的架構(gòu)
Android其本質(zhì)就是在標(biāo)準(zhǔn)的Linux系統(tǒng)上增加了Java虛擬機(jī)Dalvik,并在Dalvik虛擬機(jī)上搭建了一個JAVA的application framework,所有的應(yīng)用程序都是基于JAVA的application framework之上。
android分為四個層,從高層到低層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫層和linux核心層。
二.搭建環(huán)境
搭建開發(fā)環(huán)境
對國內(nèi)的開發(fā)者來說最痛苦的是無法去訪問android開發(fā)網(wǎng)站。為了更好的認(rèn)識世界,對程序員來說,會翻墻也是的一門技術(shù),帶你去領(lǐng)略墻外的世界,好了,不廢話了, 國內(nèi)開發(fā)者訪問(androiddevtools) 上面已經(jīng)有了所有你要的資源,同時可以下載到我們的主角framework
但是這樣的搭建只能去閱讀源代碼,我們無法去更進(jìn)一步去實(shí)現(xiàn)自己的rom,我們看到錘子的系統(tǒng)在早期的開放rom是自己從新實(shí)現(xiàn)了framework的代碼,現(xiàn)在看起來他成功了,所以我們還要去搭建android系統(tǒng)的源碼編譯環(huán)境。
搭建源碼編譯環(huán)境
三.開始主題
在一開始寫c程序的時候都有一個運(yùn)行的入口,比如
#include iostream
#include cmath
#include algorithm
using namespace std;
//這里的main就是應(yīng)用的入口
int main(int argc, const char * argv[]){
return 0;
}
在計(jì)算機(jī)網(wǎng)絡(luò)原理中我們用socket實(shí)現(xiàn)一個服務(wù)器端,不斷的接聽客戶端的訪問,而且他的代碼是這樣實(shí)現(xiàn)的:
#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;
}
//判斷高低字節(jié)是不是2,如果不是2.2的版本則退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
return;
}
//創(chuàng)建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址結(jié)構(gòu)體的創(chuàng)建
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//轉(zhuǎn)換Unsigned long型為網(wǎng)絡(luò)字節(jié)序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定端口號,除sin_family參數(shù)外,其它參數(shù)都是網(wǎng)絡(luò)字節(jié)序,因此需要轉(zhuǎn)換
//將套接字綁定到一個端口號和本地地址上
bind(socSrv, (SOCKADDR*)addrSrv, sizeof(SOCKADDR));//必須用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrClient;//字義用來接收客戶端Socket的結(jié)構(gòu)體
int len = sizeof(SOCKADDR);//初始化參數(shù),這個參數(shù)必須進(jìn)行初始化,sizeof
//循環(huán)等待接受客戶端發(fā)送請求
while (1)
{
//等待客戶請求到來;當(dāng)請求到來后,接受連接請求,
//返回一個新的對應(yīng)于此次連接的套接字(accept)。
//此時程序在此發(fā)生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)addrClient, len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr));//格式化輸出
//用返回的套接字和客戶端進(jìn)行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多發(fā)送一個字節(jié)
//接收數(shù)據(jù)
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
}
}
他采用了一個while死循環(huán)去監(jiān)聽客戶端的請求。
先上源代碼
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開辟了一個線程進(jìn)入了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循環(huán)啊,其實(shí)用了他方法實(shí)現(xiàn)
//用一個looper的機(jī)制循環(huán)監(jiān)聽響應(yīng)
Looper.prepareMainLooper();
Looper.loop();
進(jìn)一步深入代碼
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();
// 在這里看到了一個循環(huán)監(jiān)聽消息
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 during 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();
}
}
幀,是視頻的一個基本概念,表示一張畫面,如上面的翻頁動畫書中的一頁,就是一幀。一個視頻就是由許許多多幀組成的。
幀率,即單位時間內(nèi)幀的數(shù)量,單位為:幀/秒 或fps(frames per second)。一秒內(nèi)包含多少張圖片,圖片越多,畫面越順滑,過渡越自然。 幀率的一般以下幾個典型值:
24/25 fps:1秒 24/25 幀,一般的電影幀率。
30/60 fps:1秒 30/60 幀,游戲的幀率,30幀可以接受,60幀會感覺更加流暢逼真。
85 fps以上人眼基本無法察覺出來了,所以更高的幀率在視頻里沒有太大意義。
這里我們只講常用到的兩種色彩空間。
RGB的顏色模式應(yīng)該是我們最熟悉的一種,在現(xiàn)在的電子設(shè)備中應(yīng)用廣泛。通過R G B三種基礎(chǔ)色,可以混合出所有的顏色。
這里著重講一下YUV,這種色彩空間并不是我們熟悉的。這是一種亮度與色度分離的色彩格式。
早期的電視都是黑白的,即只有亮度值,即Y。有了彩色電視以后,加入了UV兩種色度,形成現(xiàn)在的YUV,也叫YCbCr。
Y:亮度,就是灰度值。除了表示亮度信號外,還含有較多的綠色通道量。
U:藍(lán)色通道與亮度的差值。
V:紅色通道與亮度的差值。
音頻數(shù)據(jù)的承載方式最常用的是 脈沖編碼調(diào)制 ,即 PCM 。
在自然界中,聲音是連續(xù)不斷的,是一種模擬信號,那怎樣才能把聲音保存下來呢?那就是把聲音數(shù)字化,即轉(zhuǎn)換為數(shù)字信號。
我們知道聲音是一種波,有自己的振幅和頻率,那么要保存聲音,就要保存聲音在各個時間點(diǎn)上的振幅。
而數(shù)字信號并不能連續(xù)保存所有時間點(diǎn)的振幅,事實(shí)上,并不需要保存連續(xù)的信號,就可以還原到人耳可接受的聲音。
根據(jù)奈奎斯特采樣定理:為了不失真地恢復(fù)模擬信號,采樣頻率應(yīng)該不小于模擬信號頻譜中最高頻率的2倍。
根據(jù)以上分析,PCM的采集步驟分為以下步驟:
采樣率,即采樣的頻率。
上面提到,采樣率要大于原聲波頻率的2倍,人耳能聽到的最高頻率為20kHz,所以為了滿足人耳的聽覺要求,采樣率至少為40kHz,通常為44.1kHz,更高的通常為48kHz。
采樣位數(shù),涉及到上面提到的振幅量化。波形振幅在模擬信號上也是連續(xù)的樣本值,而在數(shù)字信號中,信號一般是不連續(xù)的,所以模擬信號量化以后,只能取一個近似的整數(shù)值,為了記錄這些振幅值,采樣器會采用一個固定的位數(shù)來記錄這些振幅值,通常有8位、16位、32位。
位數(shù)越多,記錄的值越準(zhǔn)確,還原度越高。
最后就是編碼了。由于數(shù)字信號是由0,1組成的,因此,需要將幅度值轉(zhuǎn)換為一系列0和1進(jìn)行存儲,也就是編碼,最后得到的數(shù)據(jù)就是數(shù)字信號:一串0和1組成的數(shù)據(jù)。
整個過程如下:
聲道數(shù),是指支持能不同發(fā)聲(注意是不同聲音)的音響的個數(shù)。 單聲道:1個聲道
雙聲道:2個聲道
立體聲道:默認(rèn)為2個聲道
立體聲道(4聲道):4個聲道
碼率,是指一個數(shù)據(jù)流中每秒鐘能通過的信息量,單位bps(bit per second)
碼率 = 采樣率 * 采樣位數(shù) * 聲道數(shù)
這里的編碼和上面音頻中提到的編碼不是同個概念,而是指壓縮編碼。
我們知道,在計(jì)算機(jī)的世界中,一切都是0和1組成的,音頻和視頻數(shù)據(jù)也不例外。由于音視頻的數(shù)據(jù)量龐大,如果按照裸流數(shù)據(jù)存儲的話,那將需要耗費(fèi)非常大的存儲空間,也不利于傳送。而音視頻中,其實(shí)包含了大量0和1的重復(fù)數(shù)據(jù),因此可以通過一定的算法來壓縮這些0和1的數(shù)據(jù)。
特別在視頻中,由于畫面是逐漸過渡的,因此整個視頻中,包含了大量畫面/像素的重復(fù),這正好提供了非常大的壓縮空間。
因此,編碼可以大大減小音視頻數(shù)據(jù)的大小,讓音視頻更容易存儲和傳送。
視頻編碼格式有很多,比如H26x系列和MPEG系列的編碼,這些編碼格式都是為了適應(yīng)時代發(fā)展而出現(xiàn)的。
其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)國際電傳視訊聯(lián)盟主導(dǎo)
MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的組織)主導(dǎo)。
當(dāng)然,他們也有聯(lián)合制定的編碼標(biāo)準(zhǔn),那就是現(xiàn)在主流的編碼格式H264,當(dāng)然還有下一代更先進(jìn)的壓縮編碼標(biāo)準(zhǔn)H265。
H264是目前最主流的視頻編碼標(biāo)準(zhǔn),所以我們后續(xù)的文章中主要以該編碼格式為基準(zhǔn)。
H264由ITU和MPEG共同定制,屬于MPEG-4第十部分內(nèi)容。
我們已經(jīng)知道,視頻是由一幀一幀畫面構(gòu)成的,但是在視頻的數(shù)據(jù)中,并不是真正按照一幀一幀原始數(shù)據(jù)保存下來的(如果這樣,壓縮編碼就沒有意義了)。
H264會根據(jù)一段時間內(nèi),畫面的變化情況,選取一幀畫面作為完整編碼,下一幀只記錄與上一幀完整數(shù)據(jù)的差別,是一個動態(tài)壓縮的過程。
在H264中,三種類型的幀數(shù)據(jù)分別為
I幀:幀內(nèi)編碼幀。就是一個完整幀。
P幀:前向預(yù)測編碼幀。是一個非完整幀,通過參考前面的I幀或P幀生成。
B幀:雙向預(yù)測內(nèi)插編碼幀。參考前后圖像幀編碼生成。B幀依賴其前最近的一個I幀或P幀及其后最近的一個P幀。
全稱:Group of picture。指一組變化不大的視頻幀。
GOP的第一幀成為關(guān)鍵幀:IDR
IDR都是I幀,可以防止一幀解碼出錯,導(dǎo)致后面所有幀解碼出錯的問題。當(dāng)解碼器在解碼到IDR的時候,會將之前的參考幀清空,重新開始一個新的序列,這樣,即便前面一幀解碼出現(xiàn)重大錯誤,也不會蔓延到后面的數(shù)據(jù)中。
DTS全稱:Decoding Time Stamp。標(biāo)示讀入內(nèi)存中數(shù)據(jù)流在什么時候開始送入解碼器中進(jìn)行解碼。也就是解碼順序的時間戳。
PTS全稱:Presentation Time Stamp。用于標(biāo)示解碼后的視頻幀什么時候被顯示出來。
前面我們介紹了RGB和YUV兩種圖像色彩空間。H264采用的是YUV。
YUV存儲方式分為兩大類:planar 和 packed。
planar如下:
packed如下:
上面說過,由于人眼對色度敏感度低,所以可以通過省略一些色度信息,即亮度共用一些色度信息,進(jìn)而節(jié)省存儲空間。因此,planar又區(qū)分了以下幾種格式:YUV444、 YUV422、YUV420。
YUV 4:4:4采樣,每一個Y對應(yīng)一組UV分量。
YUV 4:2:2采樣,每兩個Y共用一組UV分量。
YUV 4:2:0采樣,每四個Y共用一組UV分量。
其中,最常用的就是YUV420。
YUV420屬于planar存儲方式,但是又分兩種類型:
YUV420P:三平面存儲。數(shù)據(jù)組成為YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。
YUV420SP:兩平面存儲。分為兩種類型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)
原始的PCM音頻數(shù)據(jù)也是非常大的數(shù)據(jù)量,因此也需要對其進(jìn)行壓縮編碼。
和視頻編碼一樣,音頻也有許多的編碼格式,如:WAV、MP3、WMA、APE、FLAC等等,音樂發(fā)燒友應(yīng)該對這些格式非常熟悉,特別是后兩種無損壓縮格式。
但是,我們今天的主角不是他們,而是另外一個叫AAC的壓縮格式。
AAC是新一代的音頻有損壓縮技術(shù),一種高壓縮比的音頻壓縮算法。在MP4視頻中的音頻數(shù)據(jù),大多數(shù)時候都是采用AAC壓縮格式。
AAC格式主要分為兩種:ADIF、ADTS。
ADIF:Audio Data Interchange Format。音頻數(shù)據(jù)交換格式。這種格式的特征是可以確定的找到這個音頻數(shù)據(jù)的開始,不需進(jìn)行在音頻數(shù)據(jù)流中間開始的解碼,即它的解碼必須在明確定義的開始處進(jìn)行。這種格式常用在磁盤文件中。
ADTS:Audio Data Transport Stream。音頻數(shù)據(jù)傳輸流。這種格式的特征是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特征類似于mp3數(shù)據(jù)流格式。
ADIF數(shù)據(jù)格式:
ADTS 一幀 數(shù)據(jù)格式(中間部分,左右省略號為前后數(shù)據(jù)幀):
AAC內(nèi)部結(jié)構(gòu)也不再贅述,可以參考AAC 文件解析及解碼流程
細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn),前面我們介紹的各種音視頻的編碼格式,沒有一種是我們平時使用到的視頻格式,比如:mp4、rmvb、avi、mkv、mov...
沒錯,這些我們熟悉的視頻格式,其實(shí)是包裹了音視頻編碼數(shù)據(jù)的容器,用來把以特定編碼標(biāo)準(zhǔn)編碼的視頻流和音頻流混在一起,成為一個文件。
例如:mp4支持H264、H265等視頻編碼和AAC、MP3等音頻編碼。
我們在一些播放器中會看到,有硬解碼和軟解碼兩種播放形式給我們選擇,但是我們大部分時候并不能感覺出他們的區(qū)別,對于普通用戶來說,只要能播放就行了。
那么他們內(nèi)部究竟有什么區(qū)別呢?
在手機(jī)或者PC上,都會有CPU、GPU或者解碼器等硬件。通常,我們的計(jì)算都是在CPU上進(jìn)行的,也就是我們軟件的執(zhí)行芯片,而GPU主要負(fù)責(zé)畫面的顯示(是一種硬件加速)。
所謂軟解碼,就是指利用CPU的計(jì)算能力來解碼,通常如果CPU的能力不是很強(qiáng)的時候,一則解碼速度會比較慢,二則手機(jī)可能出現(xiàn)發(fā)熱現(xiàn)象。但是,由于使用統(tǒng)一的算法,兼容性會很好。
硬解碼,指的是利用手機(jī)上專門的解碼芯片來加速解碼。通常硬解碼的解碼速度會快很多,但是由于硬解碼由各個廠家實(shí)現(xiàn),質(zhì)量參差不齊,非常容易出現(xiàn)兼容性問題。
MediaCodec 是Android 4.1(api 16)版本引入的編解碼接口,是所有想在Android上開發(fā)音視頻的開發(fā)人員繞不開的坑。
由于Android碎片化嚴(yán)重,雖然經(jīng)過多年的發(fā)展,Android硬解已經(jīng)有了很大改觀,但實(shí)際上各個廠家實(shí)現(xiàn)不同, 還是會有一些意想不到的坑。
相對于FFmpeg,Android原生硬解碼還是相對容易入門一些,所以接下來,我將會從MediaCodec入手,講解如何實(shí)現(xiàn)視頻的編解碼,以及引入OpenGL實(shí)現(xiàn)對視頻的編輯,最后才引入FFmpeg來實(shí)現(xiàn)軟解,算是一個比較常規(guī)的音視頻開發(fā)入門流程吧。
佳音北大青鳥安卓培訓(xùn)學(xué)校是一家由移動互聯(lián)網(wǎng)的資深專業(yè)人士共同創(chuàng)立的培訓(xùn)學(xué)員。
佳音北大青鳥自成立之日起,就以促進(jìn)和發(fā)展移動互聯(lián)網(wǎng)化為已任,專注進(jìn)行佳音android培訓(xùn)和佳音ios培訓(xùn)。
如今許多大學(xué)生都對Android和IOS等移動開發(fā)感興趣,有自學(xué)的有進(jìn)入像我們佳音北大青鳥這樣的培訓(xùn)機(jī)構(gòu),今天就由佳音北大青鳥的老師來給基礎(chǔ)薄弱的同學(xué)一點(diǎn)建議。
自學(xué)Android開發(fā)怎么快速入門:首先,想學(xué)習(xí)的同學(xué)需要一個明晰自己的目標(biāo),其實(shí)android開發(fā)也會分為應(yīng)用、游戲、底層等等,每種不同的方向需要學(xué)習(xí)不同的知識。
比如要做APP的話j2me、web、sql等等都要學(xué)習(xí),最好是從這些基礎(chǔ)的支持開始,后面才有發(fā)展,佳音北大青鳥老師推薦大家先多看看java方面的教程。
可進(jìn)入佳音北大青鳥教學(xué)視頻進(jìn)行學(xué)習(xí)。
要做游戲的話當(dāng)然要在opengl、線性代數(shù)這些基礎(chǔ)上再開始,做底層的話可能更多的涉及到嵌入式的驅(qū)動、LINUX方面,對不同的平臺不同的硬件配置要有了解才能做好底層工作,這一部分可能對C基礎(chǔ)、匯編、硬件的原理等等要求很扎實(shí),要通常要多年的積累,熟悉kernel、文件系統(tǒng)、各類協(xié)議等等。
當(dāng)然細(xì)分還有很多,這里不一一舉例了,還是推薦去把基礎(chǔ)學(xué)扎實(shí)了,當(dāng)有料之后,看一下android相應(yīng)的一些工具書等等,很快就能上手了,多多和技術(shù)論壇的朋友進(jìn)行互動,寫程序沒有取巧的,在這些基礎(chǔ)之上再去培訓(xùn)機(jī)構(gòu)系統(tǒng)的跟著老師強(qiáng)化學(xué)習(xí)一下,和老師做一些開發(fā)項(xiàng)目,佳音北大青鳥安卓培訓(xùn)學(xué)校講師都是具備多年項(xiàng)目實(shí)戰(zhàn)背景、以及多年的佳音android培訓(xùn)和佳音IOS培訓(xùn)教學(xué)經(jīng)驗(yàn)。
授課過程中,會針對不同類型的學(xué)員靈活轉(zhuǎn)變教學(xué)方式,學(xué)員在掌握理論基礎(chǔ)的同時,能夠在實(shí)際操作中靈活運(yùn)用。
如果你想從事andriod手機(jī)軟件開發(fā),那么你需要擁有這些東西:
1、最基本的是需要懂得用Java語言和XML知識。
2、掌握了這兩種語言后再裝個Eclipse和Android
SDK,
就可以做開發(fā)了。當(dāng)然,還得學(xué)Android特有的API的用法。Java和XML只是編程基礎(chǔ)。
不管怎樣,手機(jī)軟件開發(fā)最低的入門條件是:
1.
熟悉《數(shù)據(jù)結(jié)構(gòu)》
2.
熟悉多任務(wù)操作系統(tǒng)
3.
精通C語言
4.
略知通信協(xié)議,比如ISDN協(xié)議中呼叫建立和呼叫拆除過程。
如果你想跳過這些繁瑣的步驟,想走捷徑,這也不是不可能的,你可以通過在線應(yīng)用開發(fā)平臺進(jìn)行開發(fā),比如通過應(yīng)用之星(appstar.com.cn)平臺,它對開發(fā)者無技術(shù)門檻,人人都能開發(fā)app。
以下內(nèi)容是對Google Android TV文檔的翻譯,可能存在錯誤,請讀者以官方文檔為準(zhǔn)
官方地址
在文檔中Google對Android TV的提出了許多要求,如果你只是使用它的一些UI元素,你可以不用太注意這些要求。
官方地址 鏡像地址
TV應(yīng)用在手機(jī)和平板電腦上使用相同的項(xiàng)目結(jié)構(gòu)。這意味著你可以修改已經(jīng)存在的應(yīng)用使其在電視設(shè)備上運(yùn)行或者在你已知的Android知識上創(chuàng)建新的應(yīng)用。這部分內(nèi)容主要是準(zhǔn)備開發(fā)環(huán)境和開發(fā)TV應(yīng)用的一些最低要求。(開發(fā)TV應(yīng)用和手機(jī)應(yīng)用本質(zhì)是一致的,下面的一些要求只是你要使用到一些Google的庫(Leanback support)或者要將應(yīng)用在GooglePlay上線,否則,要求不必遵守)
Supported Media Formats
DRM
android.drm
ExoPlayer
android.media.MediaPlayer
這一部分主要關(guān)于如何修改一個已存在的Android項(xiàng)目或者創(chuàng)建一個新的項(xiàng)目。
下面是讓app在電視設(shè)備上運(yùn)行的主要部分:
1.Activity for TV,在manifest中聲明一個activity。
2.TV Support Libraries
1.SDK tools version 24.0.0 或者更高
2.SDK with android5.0 或者更高
3.創(chuàng)建或更新項(xiàng)目(如果你要修改已存在的Android項(xiàng)目應(yīng)該是該項(xiàng)目的target為5.0或者更高)
可以兼容到API17
如果一個應(yīng)用打算運(yùn)行在電視設(shè)備上它必須在manifest文件中聲明一個TV activity。如下:
如果設(shè)置required屬性為true,你的APP在設(shè)備上將只運(yùn)行l(wèi)eanback ui。
運(yùn)行在TV設(shè)備上的應(yīng)用不需要通過觸摸屏幕來輸入。
v17 leanback library 為電視應(yīng)用程序提供用戶界面部件,特別是用于媒體播放的應(yīng)用程序。
v7 recyclerview library
v7 cardview library
在完成上述步驟之后,是時候開始為大屏幕構(gòu)建應(yīng)用程序了!檢查這些額外的主題,以幫助您建立您的應(yīng)用程序的電視:
構(gòu)建電視播放應(yīng)用
幫助用戶搜索內(nèi)容
Building TV Games
Building TV Channels
網(wǎng)站名稱:android快速入門,安卓快速入門
文章網(wǎng)址:http://jinyejixie.com/article30/dssisso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站設(shè)計(jì)公司、定制開發(fā)、ChatGPT、網(wǎng)站制作、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)