第一篇:Android開發(fā)Info類總結(jié)
Android開發(fā)Info類總結(jié)
首先我們來看一下PackageItemInfo,它是包含了一些信息的基類,它的直接子類有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupInfo、PermissionInfo。它的間接子類有:ActivityInfo、ProviderInfo、ServiceInfo。這個(gè)類包含的信息對(duì)于所有包中項(xiàng)目是平等的。這些Package items是被Package manager所持有的。這個(gè)類提供了屬性的非常普通的基本設(shè)置:label、icon和meta-data。這個(gè)類的意圖不是被自己調(diào)用。它在這只是簡(jiǎn)單地分享被package manager返回的所有items之間的普通定義。比如,它自己并不實(shí)現(xiàn)Parcelable接口,但卻幫助實(shí)現(xiàn)了Parcelable的子類提供了方便的方法。
ApplicationInfo是從一個(gè)特定的應(yīng)用得到的信息。這些信息是從相對(duì)應(yīng)的Androdimanifest.xml的< application>標(biāo)簽中收集到的。
ResolveInfo這個(gè)類是通過解析一個(gè)與IntentFilter相對(duì)應(yīng)的intent得到的信息。它部分地對(duì)應(yīng)于從AndroidManifest.xml的< intent>標(biāo)簽收集到的信息。
PackageManager這個(gè)類是用來返回各種的關(guān)聯(lián)了當(dāng)前已裝入設(shè)備了的應(yīng)用的包的信息。你可以通過getPacageManager來得到這個(gè)類。
ApplicationInfo與ResolveInfo比較:前者能夠得到Icon、Label、meta-data、description。后者只能得到Icon、Label。
下面講一下這幾個(gè)類綜合在一起的具體應(yīng)用:
通過調(diào)用PackageManager的方法可以得到兩種不同的信息:
首先要得到manager:
PackageManager manager = getPackageManager();
Java代碼:
List< ApplicationInfo> appList = manager.getInstalledApplications(PackageManager.GET.UNINSTALLED_PAKAGES);它是通過解析AndroidManifest.xml的< application>標(biāo)簽中得到的,所以它能得到所有的app。
Java代碼:
Intent intent = new Intent(Intent.A CTION_MAIN,null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List< ResolveInfo> appList = manager.queryIntentActivities(intent,0);
//它是通過解析< Intent-filter>標(biāo)簽得到有
< action android:name=”android.intent.action.MAIN”/>
< action android:name=”android.intent.category.LAUNCHER”/>
//這樣的app,所以得到的要比第一種方法少(前者比它多那種service、previder等app)。
第二篇:Android項(xiàng)目開發(fā)總結(jié)
項(xiàng)目開發(fā)總結(jié)報(bào)告
1引言
1.1編寫目的
總結(jié)開發(fā)經(jīng)驗(yàn)與學(xué)習(xí)中的不足
1.2背景
以方便用戶記錄日常學(xué)習(xí)心得,生活體會(huì)為目的,進(jìn)行主題為“隨心筆記”的應(yīng)用開發(fā)
2實(shí)際開發(fā)結(jié)果
2.1產(chǎn)品
2.2主要功能和性能
能夠查看筆記的目錄,記錄筆記完成時(shí)間。能夠改變主題顏色,目錄排版方式,擁有簡(jiǎn)潔的主題。對(duì)于涂鴉功能,插入圖片,密碼鎖等功能未能實(shí)現(xiàn)。
3開發(fā)工作評(píng)價(jià)
3.1對(duì)產(chǎn)品質(zhì)量的評(píng)價(jià)
本應(yīng)用擁有簡(jiǎn)單實(shí)用的功能,能夠滿足一般用戶的需要
3.3對(duì)技術(shù)方法的評(píng)價(jià)
開發(fā)中使用了軟件工程中的增量開發(fā)模型,黑盒測(cè)試等技術(shù),使開發(fā)逐步向前發(fā)展
3.4出錯(cuò)原因的分析
對(duì)于部分Android版本支持性不好,不能正常使用安裝等
4經(jīng)驗(yàn)與教訓(xùn)
通過這次開發(fā),我們體驗(yàn)了開發(fā)不易,需要很多人員的合作。開發(fā)過程中,必須明確整體目標(biāo),不能東一榔頭,西一棒槌。另外由于學(xué)習(xí)時(shí)間短,對(duì)很多東西都不太了解,還好通過CSDN等一些網(wǎng)站能夠找到有益的幫助,感謝那些博客,論壇。
第三篇:Android開發(fā)基本知識(shí)總結(jié)-Android課件
Android開發(fā)基礎(chǔ)教程
2015-4-13周一2CJ02 目錄
1.什么是Android? 2.Android應(yīng)用開發(fā)環(huán)境 3.Gradle 4.模擬器Emulator 5.開發(fā)一個(gè)安卓應(yīng)用程序的步驟 6.關(guān)于多個(gè)模擬器的問題 7.安卓工程文件的結(jié)構(gòu) 8.android界面文件---xml文件 9.android程序文件---java文件 10.界面布局方式 11.幾個(gè)常用組件 12.Roast組件 13.對(duì)話框AlertDialog 14.幾條重要的語句 15.監(jiān)聽器Listener 16.識(shí)別響應(yīng)事件的組件 17.界面切換
18.界面之間的數(shù)據(jù)傳遞 19.Activity生命周期 20.多媒體播放
21.日志文件在程序調(diào)試中的使用 22.使用XML文件保存數(shù)據(jù)
23.使用TXT文件保存數(shù)據(jù) 24.使用數(shù)據(jù)庫保存數(shù)據(jù) 25.時(shí)間組件 26.線程Thread 27.視頻播放VideoView 28.MediaPlayer,SurfaceView和SurfaceHolder播放視頻 29.錄制音頻MediaRecorder 30.菜單組件
1.什么是Android? 移動(dòng)設(shè)備(常常指手機(jī)mobile)的操作系統(tǒng),由google公司出品,是免費(fèi)的, 最早是基于Linux平臺(tái)的;目前已經(jīng)推出的Android3.0是平板電腦上的操作系統(tǒng)。
其它的手機(jī)操作系統(tǒng)有:iPhone系統(tǒng)等。
手機(jī)廠商:三星(Samsung,宏達(dá)電(HTC),摩托羅拉(Motorola),華碩,索尼,Garmin等都支持iPhone系統(tǒng)。
Android系統(tǒng)功能:自定義用戶界面,支持藍(lán)牙,多點(diǎn)觸摸,具有導(dǎo)航功能和語音識(shí)別功能,結(jié)合了google地圖。
Android軟件開發(fā)工具SDK
4.0。
Android系統(tǒng)特點(diǎn):虛擬鍵盤,以WebKit為核心的WebView組件,可以使用HTML, javascript等。
2.Android應(yīng)用開發(fā)環(huán)境 Eclipse+ADT+Android SDK。ADT---Android開發(fā)工具插件(Android Plugs for Eclipse).開發(fā)環(huán)境安裝注意事項(xiàng):關(guān)閉防毒軟件,按順序安裝,保持網(wǎng)絡(luò)暢通,比較耗時(shí)。特別說明,安裝和運(yùn)行需要高配置機(jī)器和高速網(wǎng)絡(luò),比較費(fèi)時(shí)。
(1)安裝Java
JDK。甲骨文
網(wǎng)站: http://004km.cn ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);startActivity(in);(2)調(diào)用系統(tǒng)撥號(hào)界面
Uri uri = Uri.parse(“tel:*** ”);Intent in = new Intent(Intent.ACTIN_DIAL, uri);startActivity(in);(3)調(diào)用系統(tǒng)撥號(hào)功能
Uri uri = Uri.parse(“tel:*** ”);Intent in = new Intent(Intent.ACTIN_CALL, uri);startActivity(in);注意:需要在AndroidManifest.xml文件中進(jìn)行設(shè)置,才可以自動(dòng)撥號(hào):
= new Bundle();bndle.pushString(“name”, “David”);bndle.pushInt(“age”, 22);//pushChar, putShort,put Boolean, pushChar等等
Uri uri = Uri.parse(“http://004km.cn ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);in.putExtras(bundle);startActivity(in);在第二個(gè)界面中: Intent in = this.get Intent();Bundle bundle
= in.getExtras();String studentName = bundle.getInt();//getDouble, 2.方法2:調(diào)用有返回參數(shù) 例1,在第一個(gè)界面中: private static final int ACTIVITY_EDIT = 1;Bundle bundle = new Bundle();bundle.pushString(“name”, “David”);Intent in = new Intent();
getShort, getIntArray等 in.putExtras(bundle);in.setClass(FullscreenActivity.this, SecondActivity.class);startActivityForResult(in, ACTIVITY_EDIT);注意:startActivityForResult后所有語句無效,不執(zhí)行;在第一個(gè)界面中,第二個(gè)界面可以在不同位置被多次調(diào)用;在第一個(gè)界面中,在其它位置可以調(diào)用其它界面。
在第一個(gè)界面中,重寫onActivityResult,接收所有被調(diào)用界面返回的參數(shù)(如果有):@Override protected void onActivityResult(int
requestCode,int resultCode,Intent
data){ super.onActivityResult(requestCode, resultCode, data);if(requestCode== ACTIVITY_EDIT)
//此參數(shù)可以區(qū)分不同的調(diào)用
{
Bundle bundle = data.getExtras();if(resultCode == RESULT_OK)
//此參數(shù)可以判斷有無返回參數(shù)
{
Bundle bundle = data.getExtras();……
} if
(resultCode == RESULT_CANCELED)
{ } }
…… } ……
問題
:如何判斷被調(diào)用界面是否傳遞返回參數(shù)?如何區(qū)分返回參數(shù)是由不同的被調(diào)用界面?zhèn)鬟f的?android的這種解決方法并不是完美的。例2,在第二個(gè)界面中:
讀取第一個(gè)界面?zhèn)鬟f的參數(shù),省略;下面是向調(diào)用程序傳遞返回參數(shù): Bundle bundle
= new Bundle();bndle.pushString(“name”, “賀昌峰373780592”);Intent
setResult(RESULT_CANCELED);//傳遞參數(shù)返回
// 或setResult(RESULT_OK, in);//不傳遞參數(shù)返回 finish();注意:這時(shí),第二個(gè)界面返回到第一個(gè)界面,可以不傳遞參數(shù)直接返回(RESULT_CANCELED),in = new Intent();
in.putExtras(bundle);也可以傳遞參數(shù)返回(RESULT_OK)。19.Activity生命周期
onCreate
---onStart
---onResume
---onPause---onStop
---onDestroy 也就是說,有: protected void oncreate(…){ ….} protected void onStart(…){ ….} protected void onResume(…){ ….} protected void onPause(…){
….} protected void onStop(…){ ….} protected
void onDestroy(…){ ….} 20.多媒體播放MediaPlayer public MediaPlayer player = new MediaPlayer();//生成語句可省略 try{ player.reset();
//重新播放音樂
player.setDataSource(“/sdcard/music/music_file_name.mp3”);
// player = MediaPlayer.create(getApplicationContext(), R.raw.music);
// 打開音樂文件
//music為音樂資源文件
player.prepare();player.start();
// player.isPlaying()
//準(zhǔn)備播放 //播放音樂
//判斷是否正在播放
//音樂播放完成觸發(fā)事件
player.setOnCompletionListener(new OnCompletionListener){ public void onCompletion(){ //音樂播放完成后,處理代碼 } }
player.pause();player.start();player.stop();
} catch(IllegalStateException e){ ……} catch(IOException e){ ……}
//播放暫停 //繼續(xù)播放音樂 //停止播放音樂 player.release();
//釋放存儲(chǔ)空間
//注意:可以播放存儲(chǔ)卡上任意一個(gè)音樂文件;也可以播放資源列表中的音樂文件 21.日志文件在程序調(diào)試中的使用
import android.util.Log;對(duì)應(yīng)的方法有:debug,verbose,info,warn,error。注意,使用簡(jiǎn)寫。問題:如何查看系統(tǒng)日志文件?
Log.d(“這里是分類標(biāo)簽”, “這里是輸出信息”);22.使用XML文件保存數(shù)據(jù)
對(duì)XML文件進(jìn)行操作,形式為(key,value)。SharedPreferences
sp = get SharedPreferences(文件名,權(quán)限);
權(quán)限:MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 例:
//1打開XML文件 SharedPreferences
//2更改數(shù)據(jù)
Editor editor = sp.eidt();
//更改數(shù)據(jù)
sp = get SharedPreferences(“myconfig”,MODE_PRIVATE);
editor.putString(“name”, “賀昌峰373780592”);editor.putInt(“age”, 48);editor.putFloat(“salary”, 2048.5);//putLong,putBoolean等;
editor.commit();
//保存數(shù)據(jù)
//3讀取數(shù)據(jù)
String myname = sp.getString(“name”, “”);
//4刪除數(shù)據(jù)
editor.remove(“name”);//刪除數(shù)據(jù) editor.commit();
editor.clear();//刪除全部數(shù)據(jù) editor.commit();
//5簡(jiǎn)寫形式如下: Editor editor = sp.eidt()
//更改數(shù)據(jù)
//讀取數(shù)據(jù)
.putString(“name”,.commit();
“賀昌峰”)23.使用TXT文件保存數(shù)據(jù) FileOutPutStream
fout = openFileOutput(文件名, 文件權(quán)限);文件權(quán)限: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE
1.在文件中寫入數(shù)據(jù)
try { //打開TXT文件 FileOutPutStream
BufferedOutputStream
String
//向文件中寫入數(shù)據(jù)
bufferoutput.write(s.getBytes());s = “大家跟我學(xué)習(xí)android”;
bufferoutput = new BufferedOutputStream(fout);fout = openFileOutput(“myconfig.txt”, MODE_PRIVATE);
//關(guān)閉文件 bufferoutput.close();fout.close();} Catch(Exception e){
2.從文件中讀取數(shù)據(jù)
try { FileInputStream
BufferedInputStream
byte[] bufferbytes = new byte[20];int flag = bufferoutput.read(bufferbytes);if(flag==-1){ //文件讀取到文件末尾,否則可以繼續(xù)讀出
}
//僅讀取長(zhǎng)度為20個(gè)字節(jié)的數(shù)據(jù)
bufferoutput = new BufferedInputStream(fout);
fout = openFileInput(“myconfig.txt”);
//打開文件
e.printStackTrace();} bufferoutput.close();fout.close();} Catch(Exception e){
24.使用數(shù)據(jù)庫保存數(shù)據(jù) 1.數(shù)據(jù)庫相關(guān)類
//關(guān)閉緩沖區(qū) //關(guān)閉文件
e.printStackTrace();} import android.content.ContentValues;import android.content.Context;import android.database.Coursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;
2.SQLiteDataBase類
注意:數(shù)據(jù)庫操作時(shí),要求捕獲異常,此處省略。
SQLiteDataBase db = openOrCreateDatabase(“databasename.db”, MODE_PRIVATE);//說明:數(shù)據(jù)庫權(quán)限同文件權(quán)限
// Context就是this指針 db.execSQL(sql_exp): 執(zhí)行SQL語句
Cursor cs = db.rawQuery(select_exp, null): 返回?cái)?shù)據(jù)集。Cursor cs1 = db.query(arg0, ……): 使用較繁瑣,可用rawQuery替換。
db.insert(arg0, ……): 使用較繁瑣,可用rawQuery替換。db.delete(arg0, ……): 使用較繁瑣,可用rawQuery替換。db.update(arg0, ……):
使用較繁瑣,可用rawQuery替換
db.close(): 一般寫在onDestroy事件中。3.Cursor類 方法有:
move, moveToPosition, moveToFirst, moveToLast,moveToNext, getCount(), getInt(),getString(),isNull(), isFirst()等等。
4.ContentValues類
一般用在SQLiteDataBase.insert中, 此處省略。
ContentValues content
= new ContentValues();
content.put(“name”, “賀昌峰”);
moveToPrevious, content.put(“age”, 48);5.SimpleCursorAdapter類
SimpleCursorAdapter是界面組件如ListView和Cursor的橋梁。例, 在ListView組件listview1中,顯示數(shù)據(jù)集(有綁定功能嗎?):
Cursor cs = db.rawQuery(“select SimpleCursorAdapter
adapter
* from table”, null);
= new SimpleCursorAdapter(this,android.R.layout.simple_list_item_2, new String[]{“id”, “name”}, new int[]{ android.R.id.text1, android.R.id.text2});// 注意:第2個(gè)參數(shù)的作用
listview1.setAdapter(cs);
//在ListView組件顯示數(shù)據(jù)集
25.時(shí)間組件
1.常用組件AnalogClock,DigitClock 用法比較簡(jiǎn)單,無需過多設(shè)置,僅僅顯示當(dāng)前時(shí)間:機(jī)械式,數(shù)字式
2.計(jì)時(shí)組件:Chronometer 常用方法:start開始計(jì)時(shí), stop停止計(jì)時(shí), setBase設(shè)置時(shí)間 setFormat(“秒表:%s”):設(shè)置組件時(shí)間顯示格式。
附:與時(shí)間格式有關(guān)的函數(shù) SimpleDateFormat String
sformat = new SimpleDateFormats(“hh:mm:ss”);
//得得當(dāng)前時(shí)間 s = sformat.format(new Date());
例,Chronometer對(duì)象是chroTime: chroTime.setOnChronometerTickListeter(chrolisteten);
private Chronometer.onChronometerTickListeter Chronometer.onChronometerTickListeter(){ @Override public
void OnChronometerTickListeter(Chronometer chronomoter){ //每秒執(zhí)行一次該方法 } }
3.計(jì)時(shí)組件Timer和TimerTask
chrolisteten = new 常用函數(shù):schedule(TimerTask對(duì)象, Timer對(duì)象延遲時(shí)間, TimerTask對(duì)象間隔時(shí)間);
TimerTask對(duì)象用法: private TimerTask { public void run(){ //按設(shè)定間隔調(diào)用執(zhí)行 handle.sendMessage(msg);//特別注意:此處不能對(duì)界面進(jìn)行更新,因?yàn)橛绊懹?jì)時(shí)精度,所有需要使用Handle配合。見下。} }
4.Handle和Message的配合使用 Handle handle { public void handleMessage(){ super.handleMessage();//進(jìn)行其它處理 }
= new Handle()
timetask = new TimerTask()} Message
msg.what = “******”;handle.sendMessage(msg);
26.線程Thread
1.Thread的定義
public class ClockThread extends Thread{ @Override public void run(){ //進(jìn)行其它處理
//注意:不會(huì)自動(dòng)重復(fù)執(zhí)行多次的 } } 2.Thread的啟動(dòng)、延時(shí)啟動(dòng)、停止 使用Handle對(duì)線程進(jìn)行控制: msg = new Message();Handle handle = new Handle();
ClockThread clock = new ClockThread();
handle.post(clock);
//啟動(dòng)線程 5000);
//延時(shí)5000ms啟動(dòng)線程 //停止線程 handle.postDelayed(clock, handle.removeCallbacks(clock);
問題:使用Handle有什么優(yōu)點(diǎn)? 27.視頻播放VideoView 支持的文件格式:H.264的mp4, wmv, 3gp等。1.視頻播放
private VideoView
videoview.setVideoPath(“/sdcard/robot.mp4”);//增加控制面板
videoview.setMediaController(new MediaController(getApplicationContext()));
videoview
= new VideoView();videoview.start();//開始播放
2.視頻準(zhǔn)備播放事件
videoview.setOnPreparedListener(videoPreparedListener);videoview.setOnCompletionListener(videoCompletionListener);
private MediaPlayer.onPreparedListener videoPreparedListener = new MediaPlayer.onPreparedListener(){ @Override public
void onPrepared(MediaPlayer
mp){ //視頻準(zhǔn)備播放 } }
3.視頻播放完成事件
private MediaPlayer.onCompletionListener videoCompletionListener = MediaPlayer.onCompletionListener(){ @Override public
void onCompletion(MediaPlayer
mp){
new //視頻播放完成 } }
28.MediaPlayer,SurfaceView和SurfaceHolder播放視頻
MediaPlayer也可以播放視頻,需要SurfaceView和SurfaceHolder配合,其中SurfaceView為可視化組件可以播放視頻,SurfaceHolder為橋梁。
private SurfaceView surfview = new SurfaceView();//此組件可視化設(shè)計(jì),無需這里聲明 private MediaPlayer
surfholder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaplayer.setDisplay(surfholder);
mediaplayer.setDataSource(“/sdcard/vedio.mp4”);mediaplayer.reset();
//打開視頻文件
mediaplayer = new MediaPlayer();
= surfview.getHolder();private SurfaceHolder surfholder
//重新播放視頻 mediaplayer.prepare();mediaplayer.start();mediaplayer.stop();mediaplayer.release();
//準(zhǔn)備播放視頻 //播放視頻
29.錄制音頻MediaRecorder MediaRecorder
mediaRecorder.SetAudioSource(MediaRecorder.AudioSource.MIC);mediaRecorder.SetAudioEncode(MediaRecorder.AudioEncode.DEFAULT);mediaRecorder.SetOutputFormat(MediaRecorder.OutputFormat.DEFAULT);mediaRecorder.SetOutputFile(“/sdcard/recorder.amr”);mediaRecorder.prepare();mediaRecorder.start();
注意:要有寫入SD卡的權(quán)限,在AndroidManifest.xml文件中:
//準(zhǔn)備錄音 //開始錄音
mediaRecorder = new MediaRecorder(); :
1.附1:ImageView.setAlpha(50)的含義?設(shè)置透明色 2.附2:遍歷目錄下所有文件: private File pathfile;pathfile = Environment.getExternalStorageDirectory();
//疑問:pathfile + ”/myfilename.txt” 這個(gè)用法正確嗎? for(File file: pathfile.listFiles()){ if {(file.getName().toLowerCase().endsWith(“.amr”))……
// File.getAbsolutePath(), File.getName()的區(qū)別 } } 30.菜單組件 //添加系統(tǒng)菜單 protected protected static final int MENU_ABOUT
= Menu.FIRST;static final int MENU_QUIT = Menu.FIRST + 1;
//得到SD卡路經(jīng) protected
@Override static final int MENU_EDIT = Menu.FIRST + 2;public boolean onCreateOptionsMenu(Menu menu){ menu.add(0,MENU_ABOUT,0,“關(guān)于本軟件...”).setShortcut('0','A');
menu.add(0,MENU_QUIT,1,“結(jié)束”).setShortcut('1','E');
menu.add(0,MENU_EDIT,2,“編輯”).setShortcut('2','D');
menu.add(0,MENU_FILE,3,“文件”).setShortcut('3','F');
return super.onCreateOptionsMenu(menu);} //添加菜單響應(yīng)事件 @Override public boolean onOptionsItemSelected(MenuItem switch(item.getItemId()){ case MENU_ABOUT: // 響應(yīng)處理 break;case MENU_QUIT: // 響應(yīng)處理 break;}
return super.onOptionsItemSelected(item);}
//添加快捷菜單 protected static final int MENU_BACKCOLOR protected static final int MENU_SMALLSIZE =
item){
= Menu.FIRST;
Menu.FIRST + 1;//定義快捷菜單組件 private LinearLayout private TextView
layout;
txtview1,txtview2;在onCreate中, 增加以下語句: layout =(LinearLayout)findViewById(R.id.layout);txtview1 =(TextView)findViewById(R.id.txtview1);txtview2 =(TextView)findViewById(R.id.txtview2);registerForContextMenu(txtview1);registerForContextMenu(txtview2);
在java文件類中, 增加以下語句: @Override public boolean onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ //注意:父類函數(shù)先調(diào)用,或最后調(diào)用? super.onCreateOptionsMenu(menu, v, menuInfo);
if(v == txtview1)menu.add(0, MENU_BACKCOLOR,0,“設(shè)置背景顏色”); if(v == txtview2)menu.add(0, MENU_SMALLSIZE,1,“較小字體”);
}
//添加菜單響應(yīng)事件 @Override public boolean onContextItemSelected(MenuItem switch(item.getItemId()){ case MENU_BACKCOLOR: // 響應(yīng)處理
layout.setBackgroundColor(Color.BLUE);break;case MENU_SMALLSIZE: // 響應(yīng)處理
txtview2.setTextSize(12);break;}
return super.onContextItemSelected(item);}
item){
第四篇:Qualcomm平臺(tái)android開發(fā)總結(jié)
1、高通平臺(tái)android開發(fā)總結(jié).7 1.1 搭建高通平臺(tái)環(huán)境開發(fā)環(huán)境.7 1.2 搭建高通平臺(tái)環(huán)境開發(fā)環(huán)境.7 1.2.1 高通android智能平臺(tái)概述.7
1.2.1.1 什么是L4,REX,BREW,AMSS以及相互之間的關(guān)系.7 1.2.2 選擇合適的源代碼以及工具.8
1.2.2.1 獲取經(jīng)過高通打補(bǔ)丁的android 源代碼.8 1.2.2.2 獲取高通針對(duì)不同處理器的vendor源代碼.9 1.2.2.3 獲取 modem 源代碼.9
1.2.2.3.1 高通 modem 源代碼編譯前的修正.13 1.2.3 建立 Android 開發(fā)環(huán)境.14 1.2.4 建立 modem 開發(fā)環(huán)境.15 1.2.4.1 補(bǔ)充.16
1.2.4.1.1 獲取 licenses 16
1.2.4.1.2 Flex 簡(jiǎn)單使用指南.16 1.2.4.1.3 啟動(dòng) license 服務(wù)器.18
1.2.4.1.4 license 沒有辦法從服務(wù)器獲取的幾種情況.18 1.2.4.1.5 破解 rvds 的license 19 1.2.5 在高通開發(fā)板上燒錄文件系統(tǒng).19
1.3 高通平臺(tái),android和 modem 編譯流程分析.21 1.3.1 android代碼編譯流程分析.21 1.3.1.1 編譯工具檢測(cè).22 1.3.1.1.1 22
1.3.1.2 appsboot.mbn 生成過程解析.22
1.3.1.3 boot.img 生成過程解析,怎樣手動(dòng)生成 boog.img 28 1.3.1.4 編譯過程存在的問題.32
1.3.1.4.1 prelinkmap 的時(shí)候 base 0xaff00000 out of range 32 1.3.1.4.2 LOCAL_SDK_VERSION 使應(yīng)用程序不能訪問hide的api 32 1.3.1.4.3 armv5te-vfp 導(dǎo)致一些游戲運(yùn)行不了.32 1.3.2 分布式編譯 android 代碼.33 1.3.3 modem 代碼編譯流程分析.33
1.3.3.1 單獨(dú)編譯某個(gè)模塊(如:qcsbl oemsbl).34 1.3.3.2 $(TARGETDIR)/exist 規(guī)則解析.36 1.3.3.3 setup規(guī)則解析.36
1.3.3.3.1 corebsp_create_incpaths 36 1.3.3.3.2 create_incpaths 36 1.3.3.3.3 amsssetup 36
1.3.3.3.4 amsslinkaddress 36 1.3.3.3.5 firmware 38 1.3.3.4 deps規(guī)則解析.38
1.3.3.5 corebsp_build規(guī)則解析.38 1.3.3.5.1 corebsp_build_action 38 1.3.3.5.1.1 corebsp_scons 規(guī)則.39 1.3.3.5.1.1.1 corebsp_scons_start 39 2.3.3.5.1.1.1 corebsp_scons_action 39
1.3.3.5.1.1.2.1 命令 pboot_gen_elf image_header pboot_add_hash 解析.40
1.3.3.5.1.1.2.2 env.BinBuilder 過程解析.41 1.3.3.5.1.1.2.3 env.MbnBuilder 過程解析.41
1.3.3.5.1.1.2.4 env.MbnDummyBuilder 過程解析.42 1.3.3.5.1.1.2.5 fsbl.mbn 生成過程解析.43 1.3.3.5.1.1.2.6 dbl.mbn 生成過程解析.43
1.3.3.5.1.1.2.7 AMSS_AABBQOLYM.mbn 生成過程解析.43 1.3.3.5.1.1.2.8 adsp.mbn 生成過程解析.43 1.3.3.5.1.1.2.9 osbl.mbn 生成過程解析.44
1.3.3.5.1.1.2.10 enandprg_AABBQOLYM.mbn 生成過程解析.44 1.3.3.5.1.1.2.11 nandprg_AABBQOLYM.mbn 生成過程解析.45 1.3.3.5.1.1.2.12 emmcbld.mbn 生成過程解析.45 3.3.3.5.1.1.1 corebsp_scons_done 46 1.3.3.5.1.2 corebsp 46
1.3.3.5.2 corebsp_create_incpaths 46 1.3.3.5.3 corebsp_setup 46 1.3.3.6 libs 46
1.3.3.7 copybar規(guī)則解析.47 1.3.3.8 exe規(guī)則解析.47
1.3.3.8.1 CORELIBS_AABBQOLYM.mbn生成過程解析.47 1.3.3.8.2 amss.mbn 生成過程解析.47 1.3.3.9 bldprod規(guī)則解析.48
1.3.3.10 create_mem_feat_html規(guī)則解析.48 1.3.3.10.1 50
1.3.3.11 partition規(guī)則解析.50
1.3.3.11.1 eMCC 啟動(dòng)和 NAND 啟動(dòng)的分區(qū)格式是不一樣的,如果是 eMCC 啟動(dòng),多了編譯選項(xiàng):.50
1.4 高通平臺(tái) 7630 啟動(dòng)流程分析.52 1.4.1 啟動(dòng)流程概述.52 1.4.2 pbl 流程.52 1.4.3 dbl 流程.52 1.4.4 osbl 流程.54
1.4.4.1 osbl 裝載 appsbl 過程分析.56
1.4.5 appsbl 流程(源代碼在 android中).56
1.4.5.1 aboot_init 過程分析(需要側(cè)重關(guān)心的部分).58 1.4.5.1.1 fastboot 模式分析.61
1.4.5.1.1.1 什么是 fastboot 模式.61
1.4.5.1.1.2 fastboot 模式與 recovery 模式的區(qū)別.61 1.4.5.1.1.3 怎樣進(jìn)入 fastboot 模式.62
1.4.5.1.1.4 android 系統(tǒng)手機(jī)刷機(jī)過程分析(補(bǔ)充知識(shí))62 1.4.5.1.2 appsbl 引導(dǎo) android 系統(tǒng).63
1.4.5.1.2.1 Android 系統(tǒng)啟動(dòng)過程中存在的問題.67 1.4.5.1.1.1.1 linker 問題導(dǎo)致系統(tǒng)無法啟動(dòng).67 1.4.6 AMSS 流程.69
1.5 android 系統(tǒng)重啟關(guān)機(jī)流程分析.82 1.5.1 c語言中調(diào)用 reboot 函數(shù).82 1.5.2 通過 adb 讓系統(tǒng)重啟.82
1.5.3 fastboot 模式下系統(tǒng)重啟.83 1.5.4 系統(tǒng)關(guān)機(jī).84
1.5.5 內(nèi)核中的系統(tǒng)調(diào)用 reboot 85 1.6 軟件調(diào)用流程分析.89 1.6.1 設(shè)置sim卡狀態(tài).89 1.6.2 設(shè)置背光.90 1.6.3 獲取電池信息.90
1.7 python scons 語法學(xué)習(xí).94 1.8 python 語法學(xué)習(xí).94 1.8.1 Python中文全攻略.94
1.8.2 推薦一款Python編輯器.94
1.8.3 使用 pyExcelerator 讀 Execl 文件.94 1.8.4 xlrd 解析 xls 文件.95 1.8.5 xlrd 生成 xls 文件.95
1.9 Python 語言之 scons 工具流程分析.95 1.9.1 Program 方法.100 1.9.2 Library 方法.100
2、高通常用工具使用.101 2.1 QPST 101 2.2 QXDM 101 2.3 QCAT 101
3、工程模式.101
4、Android 系統(tǒng)更新升級(jí)總結(jié).104 4.1 刷機(jī)基本知識(shí).104
4.1.1 各品牌代表手機(jī)刷機(jī)模式進(jìn)入方法.104 4.1.1.1 HTC G1 104
4.1.1.2 三星 Galaxy i7500 104 4.1.1.3 Google Nexus One 105 4.1.2 fastboot 模式.105
4.1.2.1 fastboot 模式概述.105
4.1.2.2 PC端fastboot 命令分析.106 4.1.2.2.1 命令選項(xiàng) –w –s-p –c 106 4.1.2.3 手機(jī)端fastboot 命令分析.107 4.1.2.3.1 boot 107 4.1.2.3.2 erase 107 4.1.2.3.3 flash 107 4.1.2.3.4 continue 107 4.1.2.3.5 reboot 107
4.1.2.3.6 reboot-bootloader 107 4.1.2.3.7 getvar 107 4.1.2.3.8 download 108 4.1.2.3.9 update 108
4.1.2.3.9.1 system/core/fastboot/fastboot.c:294: 108 4.1.2.3.9.2 fprintf(stderr, “archive does not contain '%s'n”, name);108 4.1.2.4 fastboot 模式流程分析.108 4.1.3 recovery 模式.108
4.1.3.1 recovery 模式概述.108 4.1.3.2 軟件升級(jí)包.109
4.1.3.3 recovery v1跟recovery v2的區(qū)別.109 4.1.3.4 軟件升級(jí)腳本語法解析.109 4.1.3.4.1.1 mount 110 4.1.3.4.1.2 getprop 111
4.1.3.4.1.3 file_getprop 111 4.1.3.4.1.4 assert 111 4.1.3.4.1.5 format 111
4.1.3.4.1.6 apply_patch_check 111 4.1.3.4.1.7 apply_patch_space 111 4.1.3.4.1.8 apply_patch 111
4.1.3.4.1.9 package_extract_file 112 4.1.3.4.1.10 ui_print 112
4.1.3.4.1.11 META-INF/com/google/android/update-script 腳本分析.1124.1.3.4.2 Recovery 模式中 install_package 函數(shù)解析.117 4.1.3.5 Recovery 流程分析.118 4.1.3.5.1 恢復(fù)出廠設(shè)置.118 4.1.3.5.2 系統(tǒng)更新流程.119
4.1.3.5.3 通過sd卡實(shí)現(xiàn)刷機(jī).121 4.1.3.6 系統(tǒng)升級(jí)包案例分析.122 4.1.4 工程模式(HBoot)模式.122 4.1.4.1 HBOOT降級(jí)方法.122
4.2 如何制作升級(jí)包 update.zip 123 4.2.1 手動(dòng)制作升級(jí)包.123 4.2.2 自動(dòng)制作升級(jí)包.123 4.3 Android 簽名機(jī)制.125
4.4 android 文件系統(tǒng)權(quán)限概述.125 4.4.1 獲取手機(jī)root權(quán)限.127 4.4.2 adb默認(rèn)權(quán)限分析.128
4.4.3 adb root命令切換到 root 權(quán)限.129 4.4.4 掛載系統(tǒng)分區(qū)為讀寫(remount)130
4.4.5 通過修改 boot.img 獲取 Nexus One 權(quán)限.132 4.5 系統(tǒng)應(yīng)用移植.132
4.5.1 Android 2.2在線升級(jí)的移植.132
4.5.2 解決donut Gtalk、Market登錄不了的問題.133 4.5.3 apk反編譯問題總結(jié).133
4.5.4 系統(tǒng)重啟.133
5、高通linux內(nèi)核驅(qū)動(dòng)開發(fā).133 5.1 添加串口調(diào)試.133 5.2 Sensor 傳感器.133
5.3 USB 枚舉 USB Composition 134 5.4 USB 枚舉 USB Composition 136
6、從 android 源代碼制作 sdk 136 6.1 linux sdk 137 6.2 windows sdk 137
7、程序安裝與調(diào)試.138
8、android 框架流程分析.138 8.1 屏幕顯示相關(guān).138 8.1.1 屏幕分辨率.138 8.1.2 屏幕模式.139
8.2 Android 開機(jī)充電.141 8.3 Android 開機(jī)動(dòng)畫.141 8.3.1 內(nèi)核開機(jī)畫面.141 8.3.2 文件系統(tǒng)開機(jī)畫面.141
8.3.2.1 開機(jī)顯示的 ANDROID 文字.141 8.3.2.2 ANDROID 發(fā)光動(dòng)畫.142
8.3.2.3 initlogo.rle 文件分析.143
8.3.2.4 bootanimation.zip 文件分析.143 8.3.3 三星I9000 開機(jī)動(dòng)畫.144 8.4 JNI調(diào)用流程.145
8.5 Android 開機(jī)鈴聲.145 8.6 GPS 導(dǎo)航.145
8.6.1 GPS導(dǎo)航原理.145 8.6.2 GPS導(dǎo)航軟件.145
9、高通modem框架流程分析.146 9.1.1 添加自定義rpc調(diào)用.146
9.1.1.1 從AP端獲取modem的系統(tǒng)分區(qū)信息.146 9.1.2 添加自定義 AT命令.146
10、linux 應(yīng)用.146
10.1 嵌入式Linux通過幀緩存截圖包括Scheduling(調(diào)度), File system(文件系統(tǒng)), Networking(網(wǎng)絡(luò)), Device driver(設(shè)備驅(qū)動(dòng)程序), Memory management(存儲(chǔ)管理), Paging(存儲(chǔ)頁面管理)-都在內(nèi)核中完成.一直到現(xiàn)在廣泛應(yīng)用的操作系統(tǒng),如UNIX,Linux,和Windows還大都是monolithic kernel操作系統(tǒng).但隨著操作系統(tǒng)變得越來越復(fù)雜(現(xiàn)代操作系統(tǒng)的內(nèi)核有一兩百萬行C程序是很常見的事情),把所有這些功能都放在內(nèi)核中使設(shè)計(jì)難度迅 速增加.微內(nèi)核是一個(gè)與Monolithic Kernel相反的設(shè)計(jì)理念.它的目的是使內(nèi)核縮到最小,把所有可能的功能模塊移出內(nèi)核.理想情況下,內(nèi)核中僅留下Address Space Support(地址空間支持),IPC(Inter-Process Communication,進(jìn)程間通訊),和Scheduling(調(diào)度),其他功能模塊做為用戶進(jìn)程運(yùn)行。
REX 是在 L4 之上封裝的服務(wù),是一個(gè)搶占式,多任務(wù)的RTOS,所有的任務(wù)都以task的形式存在,REX提供包括任務(wù)創(chuàng)建,同步,互斥,計(jì)時(shí)器,中斷控制等功能的 API,這里的task實(shí)際上就是我們的線程,每個(gè) task對(duì)應(yīng)著一個(gè)線程。REX維護(hù)一個(gè)task list(雙向鏈表),始終運(yùn)行高優(yōu)先級(jí)的task。products里面所有的服務(wù)包括3g協(xié)議棧等都是以task的形式跑在rex之上的。而Brew的話是運(yùn)行的環(huán)境,跟Java 有點(diǎn)兒類似,相當(dāng)于是一個(gè)虛擬機(jī)。AMSS――高級(jí)的移動(dòng)用戶軟件(Advanced Mobile Subscriber Software)技術(shù),是一種新的軟件架構(gòu),是對(duì)原來軟件架構(gòu) DMSS 的升級(jí)。AMSS源代碼實(shí)際上是QC BREW(Binary Runtime Environment For Wireless)平臺(tái)的的底層部分,去掉了為應(yīng)用程序提供接口的AEE(application execution environment)部分,高通在Dual Proc芯片上的其他平臺(tái)基本上都是采用的這樣的架構(gòu)。
參考文檔:
微內(nèi)核操作系統(tǒng)及L4概述
http://wenku.baidu.com/view/90929762caaedd3383c4d311.html MSM平臺(tái)上的AMSS http://blog.csdn.net/yili_xie/archive/2010/01/04/5129469.aspx
1.2.2 選擇合適的源代碼以及工具 要編譯出可供燒寫使用的鏡像文件需要三部分代碼: 1)獲取經(jīng)過高通打補(bǔ)丁的 android 源代碼 2)獲取高通針對(duì)不同處理器的 vendor 源代碼 3)獲取 modem 源代碼
1.2.2.1 獲取經(jīng)過高通打補(bǔ)丁的android 源代碼 網(wǎng)址:
http://004km.cn1312 Chipset(such as QSC6270):MSM7227-1 RF chipset(such as RGR6240):RTR6285 PMIC chipset(such as PM7540):PM7540 WCMDA Supported Bands(900,1900,2100?.if support WCDMA):2100 CMDA Supported Bands(450,850,1900,2100? if support CDMA):not suport OS(Brew,BMP,Android,WM,ThinUI(no UI)?):android froyo OS version(Android Donuts?): android froyo
1.2.2.3.1 高通 modem 源代碼編譯前的修正
從高通獲取的源代碼直接編譯會(huì)存在一些問題,以下為可能的問題以及解決方法:
1)為相應(yīng)的腳本加上編譯選項(xiàng)
vim./AMSS/products/7x30/build/ms/xxxxxx.cmd 加上: BUILD_UNIX=yes
2)如果編譯過程出現(xiàn).pl 文件沒有執(zhí)行權(quán)限而退出,那么為工程下面所有的 pl 文件加上可執(zhí)行屬性,命令:
find./-name “*.pl” |xargs chmod 755
3)無法找到需要的 pl 腳本解析器
vim./AMSS/products/7x30/tools/build/depgen.pl 修改
#!/pkg/perl/5.6.1/bin/perl-w 為
#!/usr/bin/perl-w
4)如果出現(xiàn)錯(cuò)誤:
“AMSS/products/7x30/core/bsp/build/data/incpathsaaabqmlym.py”, line 14 IndentationError: expected an indented block 修改文件:./AMSS/products/7x30/core/bsp/build/scripts/genpaths.pl 內(nèi)容:
#if($line =~ /^# makefile(from/)為:
if($line =~ /^# makefile /)原因分析:
genpaths.pl 會(huì)對(duì)編譯過程的中間信息 :...line=# makefile(from'incpaths.min',line 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc...等信息進(jìn)行解析,由于我們使用的是中文系統(tǒng),所以以上內(nèi)容變?yōu)椋?line=# makefile(從'incpaths.min',行 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc 所以導(dǎo)致:
#if($line =~ /^# makefile(from/)判斷條件為為 false 無法正確生成 incpathsaaabqmlym.py,python 在解析該文件的時(shí)候認(rèn)為存在語法錯(cuò)誤。
在 modem 代碼 M7630AABBQMAZM2020(HY11-N2280-2.zip)中開始使用 genincpaths.py 產(chǎn)生
./AMSS/products/7x30/core/bsp/build/data/incpathsaaabqoazm.py 文件,所以修改文件 amend-source-code-qualcomm-modem.sh 在腳本中需要加入以下內(nèi)容: incpathsxxx_py=$PRODUCT_DIR/core/bsp/build/scripts/genincpaths.py if test-f $incpathsxxx_py;then PERL=`which /usr/bin/perl` sed-i “s/(from//g” $incpathsxxx_py fi./AMSS/products/7x30/multimedia/audio/drivers/Adie/AdieCodecDb/src/DALAdieCodecDb.c #DalAdieCodecDbInternal.h 改為: #include “DALAdieCodecDbInternal.h”
5)如果出現(xiàn) make: execvp:../../../../platform/cs/bin/cifc: Permission denied 錯(cuò)誤,執(zhí)行以下命令:
chmod-R 755 AMSS/platform/cs/bin/*
1.2.3 建立 Android 開發(fā)環(huán)境(略)
curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo export PATH=~/bin:$PATH 1)安裝基本軟件
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl sun-java5-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev
2)安裝 sun-java5-jdk ubuntu 下通過命令: sudo apt-get install sun-java5-jdk 將會(huì)安裝下面的包 sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre sun-java5-plugin 如果ubuntu 發(fā)布版本中沒有 sun-java5-jdk 那么 sudo vim /etc/apt/source.list #for sun-java5-jdk deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse sudo apt-get update sudo apt-get sun-java5-jdk 或者,如果 ubuntu 版中不支持 apt-get,那么用手動(dòng)安裝: sudo mount-t nfs 172.20.127.15:/home/shared /mnt sudo dpkg-i /mnt/tools/debs/java-1.5.0-sun/sun-java5-*
3)配置usb cd /etc/udev/rules.d/ sudo vi 50-android.rules # adb single interface device SUBSYSTEM==“usb_device”, SYSFS{idVendor}==“18d1”, SYSFS{idProduct}==“d00d”, MODE=“0664”, GROUP=“plugdev” # adb composite interface device SUBSYSTEM==“usb_device”, SYSFS{idVendor}==“18d1”, SYSFS{idProduct}==“deed”, MODE=“0664”, GROUP=“plugdev” # Sooner low-level bootloader BUS==“usb”, SYSFS{idVendor}==“0bb4”, SYSFS{idProduct}==“0a51”, MODE=“0664”,GROUP=“plugdev” sudo /etc/init.d/udev restart
1.2.4 建立 modem 開發(fā)環(huán)境
與android 源代碼不同,modem 編譯工具使用的是 RVDS ,實(shí)際上只用到其中的 RVCT 編譯器,高通不提供該工具,我們必須從arm公司獲取相應(yīng)的授權(quán),RVDS 是 ADS 的升級(jí)版本,從 ADS 1.2 開始到 RVDS 3.1 我們公司都有其授權(quán),按照高通的要求我們目前必須使用 RVDS 2.2 并且使用他的 349 patch。RVDS 2.2 安裝以及使用步驟如下:
1).RVDS 2.2 共享在 172.20.127.15:/home/shared/ 目錄 sudo mount-t nfs 172.20.127.15:/home/shared/ /mnt cd /mnt/qualcommon/RVDS-2.2/ linux下rvds2.2的安裝程序?yàn)椋?/p>
./rvds2.2_linux-pentium/setuplinux.bin 執(zhí)行以上命令,按照默認(rèn)步驟安裝,安裝路徑為:~/ARM 注意事項(xiàng):
安裝過程如果出現(xiàn)錯(cuò)誤:
..................java.lang.UnsatisfiedLinkError: /tmp/ismp001/6073753.tmp: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory 從網(wǎng)上下載 libstdc++-libc6.2-2.so.3 拷貝到 /usr/lib 目錄 ,或者從下面地址獲?。?/p>
http://172.20.127.15/repositories/DocsAndTools/Tools/Qualcomm/RVDS-2.2-patch/patch/libstdc++-libc6.2-2.so.3 工具的安裝通過腳本進(jìn)行了簡(jiǎn)化,具體過程請(qǐng)參考文檔: 80-N0216-2_A_M7630AABBQMAZM1170.pdf 80-VR881-7_B_M7630AABBQMLZA1200.pdf 80-VR192-1_C_AMSS_Linux_Software_Users_Guide.pdf 80-VR192-1_D_AMSS_Linux_Software_Users_Guide.pdf
2)安裝高通指定的 593 patch cd /mnt/qualcommon/RVDS2.2/下執(zhí)行命令:./setup-patch-rvct2.2-bin593-lib349.sh
目前版本只支持 32 位的系統(tǒng) 1.2.4.1 補(bǔ)充
vim./AMSS/products/7x30/core/bsp/build/scripts/defaults.py 定義了工作線程
#num_jobs = num_cpu * 2 modified by mhf num_jobs = 2 if num_jobs < 4: num_jobs = 2 if num_jobs > 8: num_jobs = 8 env.SetOption('num_jobs', num_jobs)――――――― 獲取 RVDS 官方網(wǎng)站下載評(píng)估版本
https://silver.arm.com/browse http://004km.cn/wiki/QAEP#Branch_Releases http://004km.cn/wiki/QLBEP 下載 M7630AABBQMLZA1150 分支:
February 1, 2010 M7630AABBQMLZA1150 msm7630 eclair M7630AABBQMLZA1150.xml 命令如下:
mkdir-pv ~/workspace/gphone/eclair-M7630AABBQMLZA1150-20100201 cd ~/workspace/gphone/eclair-M7630AABBQMLZA1150-20100201 repo init-u git://codeaurora.org/platform/manifest.git-b eclair-m M7630AABBQMLZA1150.xml nohup repo sync 代碼下的 vendor/qcom-proprietary 來自包 HY11-VR881-5.zip 以上兩部分代碼已經(jīng)下載并且合并,共享在:
http://172.20.127.15/repositories/TD1002/trunk/eclair-M7630AABBQMLZA1150---------------編譯 eclair 代碼
svn co http://172.20.127.15/repositories/TD1002/trunk/eclair-M7630AABBQMLZA1150 cd eclair-M7630AABBQMLZA1150 cd eclair-M7630AABBQMLZA1150$../setenv.sh../make-image.sh ======= modem代碼從高通網(wǎng)站:https://support.cdmatech.com/login/ 上獲取 我們目前使用的是: 共享在:
http://172.20.127.15/repositories/TD1002/trunk/modem-M7630AABBQMAZM1220-------編譯 modem 代碼
svn co http://172.20.127.15/repositories/TD1002/trunk/modem-M7630AABBQMAZM1220 cd modem-M7630AABBQMAZM1220../setenv-qualcomm.sh../make ======== 編譯結(jié)果分別如下:------------其中 adsp.mbn,amss.mbn,dbl.mbn,osbl.mbn,partition.mbn 位于以下目錄:./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/adsp.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/amss.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/dbl.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/osbl.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/partition.mbn------------appsboot.mbn,boot.img,system.img,userdata.img 位于以下目錄:./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/appsboot.mbn./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/boot.img./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img.ext3./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img.ext3------------eMMC 啟動(dòng)使用的是 ext3 文件系統(tǒng),需要使用鏡像 system.img.ext3 userdata.img.ext3 補(bǔ)充說明:
partition.mbn 文件的原始數(shù)據(jù)來自配置文件:
./AMSS/products/7x30/tools/jsdcc/partition_load_pt/partition.xml
1.3 高通平臺(tái),android和 modem 編譯流程分析 android 代碼編譯流程分析 modem 代碼編譯流程分析 1.3.1 android代碼編譯流程分析
1.從服務(wù)器下載 android 源碼到當(dāng)前目錄
http://smartphone/repositories/TD1014/branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/ svn co http://172.20.127.15/repositories/TD1014/trunk/froyo_almond-M76XXTSNCJNLYA6050/ cd froyo_almond-M76XXTSNCJNLYA6050/../setenv.sh 設(shè)置環(huán)境變量 Setting Environment...通常情況下 generic 用于編譯模擬器版本 Options are: 1.generic 2.msm7627_surf 3.msm7627_ffa 4.tiny-system ====從以上列表中選擇==== Which would you like? [1]
燒錄的鏡像文件appsboothd.mbn appsboot.mbn boot.img system.img userdata.img persist.img 來自 android 源碼 appsboot.mbn 的主要功能是裝載 linux 內(nèi)核,通過 linux 的引導(dǎo)來完成 android 系統(tǒng)的加載,appsboot.mbn 被燒寫在相應(yīng)的分區(qū),它的加載由 osbl.mbn 來完成,osbl.mbn 程序來自 modem。
7x30 7x27 系列 appsboot 不一樣,7x30 的 appsboot.mbn 是 7x27 appsboothd.mbn appsboot.mbn 兩個(gè)文件的合并
1)appsboot.mbn 生成過程解析
2)boot.img 生成過程解析,怎樣手動(dòng)生成 boog.img
1.3.1.1 編譯工具檢測(cè)
make out/target/product/msm7630_surf/appsboot.mbn 1.3.1.1.1
1.3.1.2 appsboot.mbn 生成過程解析
make out/target/product/msm7630_surf/appsboot.mbn make out/target/product/msm7630_surf/nandwrite make out/target/product/msm7630_surf/emmc_appsboot.mbn 分別執(zhí)行:
make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ msm7630_surf make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_EMMC_OBJ msm7630_surf EMMC_BOOT=1 生成 nandwrite =============== #build nandwrite as a part of Android Build TARGET_NANDWRITE := $(PRODUCT_OUT)/obj/nandwrite/build-$(TARGET_PRODUCT)_nandwrite/lk NANDWRITE_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/nandwrite
nandwrite_clean: $(hide)rm-f $(TARGET_NANDWRITE)$(hide)rm-rf $(NANDWRITE_OUT)
$(NANDWRITE_OUT): mkdir-p $(NANDWRITE_OUT)
$(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT)@echo $(TARGET_PRODUCT)_nandwrite $(MAKE)-C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT)$(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1 ================
vim./bootable/bootloader/lk/makefile:98: TARGET := msm7630_surf #./bootable/bootloader/lk/project/msm7630_surf.mk PLATFORM := msm7x30 #./bootable/bootloader/lk/target/msm7630_surf/rules.mk msm7x30 msm7630_surf.mk msm7630_surf_nandwrite ============================= include project/$(PROJECT).mk include target/$(TARGET)/rules.mk include target/$(TARGET)/tools/makefile include platform/$(PLATFORM)/rules.mk include arch/$(ARCH)/rules.mk include platform/rules.mk include target/rules.mk include kernel/rules.mk include dev/rules.mk include app/rules.mk...include make/module.mk...include make/build.mk ======================== vim bootable/bootloader/lk/make/module.mk INCMODULES := $(MODULES)$(info including $(INCMODULES))include $(addsuffix /rules.mk,$(INCMODULES))展開為:./bootable/bootloader/lk/app/nandwrite/rules.mk./bootable/bootloader/lk/dev/fbcon/rules.mk./bootable/bootloader/lk/dev/keys/rules.mk./bootable/bootloader/lk/lib/debug/rules.mk./bootable/bootloader/lk/lib/heap/rules.mk./bootable/bootloader/lk/lib/libc/rules.mk./bootable/bootloader/lk/lib/ptable/rules.mk ======================== bootable/bootloader/lk/make/build.mk:29: include arch/$(ARCH)/compile.mk
./bootable/bootloader/lk/project/msm7630_surf_nandwrite.mk 中有: MODULES += app/nandwrite./bootable/bootloader/lk/platform/msm7x30/rules.mk中有: MODULES += dev/fbcon./bootable/bootloader/lk/kernel/rules.mk 中有: MODULES += lib/libc lib/debug lib/heap./bootable/bootloader/lk/target/msm7630_surf/rules.mk 中有: MODULES += dev/keys lib/ptable 所以:
MODULES= app/nandwrite dev/fbcon dev/keys lib/debug lib/heap lib/libc lib/ptable 因?yàn)?/p>
ifeq($(BUILD_NANDWRITE), 1)APPSBOOTHDR_FILES := else out/host/linux-x86/bin/acp-fpt out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk out/target/product/msm7630_surf/nandwrite
25780 184 34000 59964 ea3c../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk arm-eabi-objcopy-O binary../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.bin generating listing:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.lst generating listing:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.debug.lst generating symbols:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.sym generating size map:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.size make[2]:正在離開目錄
/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk make[1]:正在離開目錄
/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk target Prebuilt:(out/target/product/msm7630_surf/nandwrite)
make-C bootable/bootloader/lk BOOTLOADER_OUT=./out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 make[2]: 正在進(jìn)入目錄
`/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk` msm7630_surf_nandwrite make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 ==》生成 mkheader 工具
gcc target/msm7630_surf/tools/mkheader.c-o target/msm7630_surf/tools/mkheader
$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld @echo generating $@ @$(MKDIR)$(NOECHO)sed “s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/” < $< > $@
generating../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/system-onesegment.ld compiling arch/arm/crt0.S compiling arch/arm/crt0.S。。compiling lib/ptable/ptable.c compiling lib/ptable/ptable.c
vim bootable/bootloader/lk/platform/msm7x30/rules.mk-----LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld include platform/msm_shared/rules.mk-----
./build/core/product_config.mk:177:TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)./build/core/envsetup.mk:152:OUT_DIR := $(TOPDIR)out./build/core/envsetup.mk:159:TARGET_OUT_ROOT_release := $(OUT_DIR)/target./build/core/envsetup.mk:161:TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))./build/core/envsetup.mk:178: TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product./build/core/envsetup.mk:184:PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)build/core/envsetup.mk:200:TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj bootable/bootloader/lk/AndroidBoot.mk:4:BOOTLOADER_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_OBJ bootable/bootloader/lk/makefile:32:BUILDDIR := $(BOOTLOADER_OUT)/build-$(PROJECT)bootable/bootloader/lk/makefile:34:OUTELF := $(BUILDDIR)/lk 所以:
TARGET_PRODUCT_OUT_ROOT=out/target/product/ PRODUCT_OUT=out/target/product/msm7630_surf/ TARGET_OUT_INTERMEDIATES=out/target/product/msm7630_surf/obj/ BOOTLOADER_OUT=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/ 所以:
BUILDDIR=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf 所以:
OUTELF=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk
make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ msm7630_surf
bootable/bootloader/lk/makefile OUTELF := $(BUILDDIR)/lk./bootable/bootloader/lk/make/build.mk $(OUTELF): $(ALLOBJS)$(LINKER_SCRIPT)@echo linking $@ $(NOECHO)$(LD)$(LDFLAGS)-T $(LINKER_SCRIPT)$(ALLOBJS)$(LIBGCC)-o $@
vim./bootable/bootloader/lk/AndroidBoot.mk TARGET_NANDWRITE := $(PRODUCT_OUT)/obj/nandwrite/build-$(TARGET_PRODUCT)_nandwrite/lk $(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT)@echo $(TARGET_PRODUCT)_nandwrite $(MAKE)-C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT)$(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1
BOOTLOADER_EMMC_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_EMMC_OBJ
vim./bootable/bootloader/lk/make/build.mk $(OUTELF): $(ALLOBJS)$(LINKER_SCRIPT)@echo linking $@ $(NOECHO)$(LD)$(LDFLAGS)-T $(LINKER_SCRIPT)$(ALLOBJS)$(LIBGCC)-o $@
bootable/bootloader/lk/makefile:33:OUTBIN := $(BUILDDIR)/lk.bin bootable/bootloader/lk/makefile:34:OUTELF := $(BUILDDIR)/lk
./lk/platform/msm7x30/rules.mk:23:LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld
==》鏈接 lk linking../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk linking../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk generating image:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.bin generating image:../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin text data bss dec hex filename 29592 7388 42720 79700 13754../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk text data bss dec hex filename 25780 184 34000 59964 ea3c../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk
==》以 binary 格式,把文件
out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk 輸出到:
out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin arm-eabi-objcopy-O binary out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin ==》
生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.lst 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.debug.lst 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.sym 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.size make[1]:正在離開目錄 /opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk ==》
make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi-msm7630-perf_defconfig make[1]: 正在進(jìn)入目錄
/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/kernel generating symbols:../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.sym generating size map:../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.size
mkheader 從 lk.bin 生成 appsboothd.mbn 語法: mkheader
out/target/product/msm7630_surf/appsboot.mbn cat out/target/product/msm7630_surf/appsboothd.mbn out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin > out/target/product/msm7630_surf/appsboot.mbn 刪除:out/target/product/msm7630_surf/appsboothd.mbn ==== 1.3.1.3 boot.img 生成過程解析,怎樣手動(dòng)生成 boog.img boot.img 包括兩個(gè)部分: kernel 和 ramdisk,通過命令: make out/target/product/msm7630_surf/boot.img showcommands 會(huì)自動(dòng)生成 kernel 和 ramdisk,然后把兩者合并制作成燒寫的鏡像文件:boot.img kernel 為
out/target/product/$TARGET_PRODUCT/obj/KERNEL_OBJ/arch/arm/boot/zImage 或者 out/target/product/$TARGET_PRODUCT/kernel , kernel 是 zImage 的拷貝
編譯內(nèi)核之前必須獲取一個(gè)默認(rèn)的配置文件.config ,此配置文件可以生成,或者來自默認(rèn)配置,高通中 msm7630_surf 的
默認(rèn)配置文件名為: msm7630-perf_defconfig 在文件: vendor/qcom/msm7630_surf/AndroidBoard.mk:45 中通過: KERNEL_DEFCONFIG := msm7630-perf_defconfig 進(jìn)行了指定。我們可以通過命令:
make-j3 ARCH=arm CROSS_COMPILE=arm-eabi-kernel showcommands 或者通過如下命令一步步完成:
1.獲取默認(rèn)的內(nèi)核配置并生成.config 的命令如下: make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi-msm7630-perf_defconfig-C kernel 告訴 make 進(jìn)入 kernel 工作目錄,到其下面尋找 makefile 文件
O 內(nèi)核編譯的中間文件以及編譯結(jié)果等都存儲(chǔ)在該目錄下,此做法的好處是不會(huì)在kernel源代碼目錄下生成垃圾文件
ARCH=arm 告訴系統(tǒng)到./kernel/arch/$ARCH/configs/ 目錄下找文件 msm7630-perf_defconfig,生成的.config 保存在:
out/target/product/msm7630_surf/obj/KERNEL_OBJ/.config 2.手動(dòng)編譯內(nèi)核
make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ/ 3.如果需要配置內(nèi)核,使用下面的命令 make kernelconfig 他首先會(huì)進(jìn)入 menuconfig 界面,用戶配置完成以后,會(huì)把修改后的配置文件$(KERNEL_OUT)/.config 更新為默認(rèn)的配置文件
cp out/target/product/msm7627_ffa/obj/KERNEL_OBJ/.config kernel/arch/arm/configs/msm7627-perf_defconfig kernel/arch/arm/configs/$(KERNEL_DEFCONFIG)
4.手動(dòng)生成 ramdisk 執(zhí)行命令
make out/target/product/msm7630_surf/ramdisk.img showcommands 會(huì)用到命令:
out/host/linux-x86/bin/mkbootfs out/target/product/msm7630_surf/root | out/host/linux-x86/bin/minigzip > out/target/product/msm7630_surf/ramdisk.img 5.手動(dòng)生成 boot.img 需要使用命令 mkbootimg ,語法如下: mkbootimg--kernel 內(nèi)核--ramdisk ramdisk鏡像--cmdline 命令行--base 基地址--pagesize 大小--output 輸出的boot.img ========== KERNEL=out/target/product/$TARGET_PRODUCT/kernel KERNEL=out/target/product/$TARGET_PRODUCT/obj/KERNEL_OBJ/arch/arm/boot/zImage RAMDISK=out/target/product/$TARGET_PRODUCT/ramdisk.img CMDLINE=“console=ttyDCC0 androidboot.hardware=qcom” BASE=0x00200000 PAGESIZE=4096 OUTPUT=out/target/product/$TARGET_PRODUCT/boot.img out/host/linux-x86/bin/mkbootimg--kernel $KERNEL--ramdisk $RAMDISK--cmdline “$CMDLINE”--base $BASE--pagesize $PAGESIZE--output $OUTPUT =========================================
編譯 bootloader(appsboot.mbn),nandwrite 生成過程解析./vendor/qcom/msm7630_surf/AndroidBoard.mk:25: include bootable/bootloader/lk/AndroidBoot.mk =================== 因?yàn)橛校?/p>
bootable/bootloader/lk/AndroidBoot.mk:3: TARGET_BOOTLOADER := $(PRODUCT_OUT)/appsboot.mbn INSTALLED_BOOTLOADER_TARGET := $(PRODUCT_OUT)/bootloader file := $(INSTALLED_BOOTLOADER_TARGET)
第五篇:Android開發(fā)優(yōu)勢(shì)總結(jié)
Android開發(fā)優(yōu)勢(shì)總結(jié)
來源:扣丁學(xué)堂
目前市場(chǎng)上的移動(dòng)端有兩種形式,一種是Android開發(fā),另一種是ios開發(fā),其中Android開發(fā)方面的人員要多一些,今天我們就一起來看一下扣丁學(xué)堂Android培訓(xùn)講師解讀的Android開發(fā)的優(yōu)勢(shì)。
Android開發(fā)優(yōu)勢(shì):
1、Android價(jià)格占優(yōu),價(jià)廉性能并不低
消費(fèi)者選擇產(chǎn)品,價(jià)格是必然要考慮的一大因素,iphone雖好,但是價(jià)格讓一般人望而卻步。蘋果就像是寶馬、奔馳,雖然大家都認(rèn)為它很好,但是一般人消費(fèi)不起,只有看的份。而Android,如同大眾,滿大街跑的都是,不僅如此,還有一些型號(hào)是可以與寶馬、奔馳相媲美的。雖然Android平臺(tái)的手機(jī)價(jià)廉,但是其性能卻一點(diǎn)也不低廉,觸摸效果并不比蘋果差到哪里去。Android平臺(tái)簡(jiǎn)單實(shí)用,無論是功能還是外觀設(shè)計(jì),都可以與蘋果一決高下。當(dāng)消費(fèi)者考慮價(jià)格因素之后,在數(shù)量眾多的android手機(jī)中,消費(fèi)者總是會(huì)找到一款滿意的Android手機(jī)取代價(jià)格高昂的 iPhone。
2、應(yīng)用程序發(fā)展迅速
智能機(jī)玩的就是個(gè)應(yīng)用,雖然現(xiàn)在Android的應(yīng)用還無法與蘋果相競(jìng)爭(zhēng),但是隨著Android的推廣與普及,應(yīng)用程序數(shù)在成數(shù)量級(jí)增長(zhǎng),Android應(yīng)用在可預(yù)見的未來是有能力與蘋果相競(jìng)爭(zhēng)的。而來自Android應(yīng)用商店最大的優(yōu)勢(shì)是,不對(duì)應(yīng)用程序進(jìn)行嚴(yán)格的審查,在這一點(diǎn)上優(yōu)于蘋果。
3、智能手機(jī)廠家助力
蘋果的自我中心是它成功的一大法寶,從硬件到軟件,到其獨(dú)特的推廣方式。蘋果形成了一個(gè)很好的很完整的產(chǎn)業(yè)鏈。在一個(gè)封閉的圈子中創(chuàng)造一個(gè)又一個(gè)的奇想,讓消費(fèi)者的體驗(yàn)得到了很大的滿足。但是這樣并不能使其長(zhǎng)期占據(jù)有利位置。現(xiàn)在,世界很多智能手機(jī)廠家?guī)缀醵技尤肓薃ndroid陣營(yíng),并推出了一系列的Android智能機(jī)。摩托羅拉、三星、HTC、LG、Lumigon等廠家都與谷歌建立了Android平臺(tái)技術(shù)聯(lián)盟。廠商加盟的越多,手機(jī)終端就會(huì)越多,其市場(chǎng)潛力就越大。
4、運(yùn)營(yíng)商的鼎力支持
在國(guó)內(nèi),三大運(yùn)營(yíng)商是卯足了勁的推出Android智能機(jī)。聯(lián)通的“0元購(gòu)機(jī)”,電信的千元3G,移動(dòng)的索愛A8i定制機(jī),都顯示了運(yùn)營(yíng)商對(duì)Android智能機(jī)的期望。在美國(guó),T-Mobile、Sprint、AT&T和Verizon全部推出了Android手機(jī)。此外,日本的KDDI,NTT DoCoMo,Telecom Italia(意大利電信)、T-Mobile(德
國(guó))、Telefónica(西班牙)等眾多運(yùn)營(yíng)商都是Android的支持者。有這么多的運(yùn)營(yíng)商支持Android,自然會(huì)占據(jù)巨大的市場(chǎng)份額。相對(duì)于Android的運(yùn)營(yíng)商聯(lián)盟,只有AT&T一家運(yùn)營(yíng)商銷售iPhone。而蘋果其特有的自我封閉性,無論是對(duì)手機(jī)廠商還是對(duì)運(yùn)營(yíng)商,都帶來了一定的威脅性。手機(jī)聯(lián)盟的形成,在一定程度上直指蘋果。
5、機(jī)型多 硬件配置優(yōu)
自從谷歌推出Android系統(tǒng)以來,各大廠家紛紛推出自己的Android平臺(tái)手機(jī),HTC、索尼愛立信、魅族、摩托羅拉、夏普、LG、三星、聯(lián)想等等,每一家手機(jī)廠商都推出了各自的Android手機(jī),機(jī)型多樣,數(shù)不勝數(shù)。摩托羅拉的Droid X、三星的Galaxy,HTC從開始的T-Mobile G1到當(dāng)前的 EVO 4G,每一款都有著優(yōu)秀的配置,都有可說之處。
6、系統(tǒng)開源 利于創(chuàng)新
蘋果的自我封閉性,使其創(chuàng)新必須源自內(nèi)部。而Android是開源的,允許第三方修改,這在很大程度上容許廠家根據(jù)自己的硬件更改版本,從而能夠更好的適應(yīng)硬件,與之形成良好的結(jié)合。
扣丁學(xué)堂Android視頻教程講師:相比于蘋果的封閉,開源能夠提供更好的安全性能,也給開發(fā)人員提供了一個(gè)更大的創(chuàng)新空間,從而使Android版本升級(jí)更快。扣丁學(xué)堂有大量的的Android視頻教程可供Android開發(fā)者觀看學(xué)習(xí),喜歡的話就關(guān)注扣丁學(xué)堂吧。