久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

Android開發Info類總結

時間:2019-05-12 14:30:59下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《Android開發Info類總結》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《Android開發Info類總結》。

第一篇:Android開發Info類總結

Android開發Info類總結

首先我們來看一下PackageItemInfo,它是包含了一些信息的基類,它的直接子類有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupInfo、PermissionInfo。它的間接子類有:ActivityInfo、ProviderInfo、ServiceInfo。這個類包含的信息對于所有包中項目是平等的。這些Package items是被Package manager所持有的。這個類提供了屬性的非常普通的基本設置:label、icon和meta-data。這個類的意圖不是被自己調用。它在這只是簡單地分享被package manager返回的所有items之間的普通定義。比如,它自己并不實現Parcelable接口,但卻幫助實現了Parcelable的子類提供了方便的方法。

ApplicationInfo是從一個特定的應用得到的信息。這些信息是從相對應的Androdimanifest.xml的< application>標簽中收集到的。

ResolveInfo這個類是通過解析一個與IntentFilter相對應的intent得到的信息。它部分地對應于從AndroidManifest.xml的< intent>標簽收集到的信息。

PackageManager這個類是用來返回各種的關聯了當前已裝入設備了的應用的包的信息。你可以通過getPacageManager來得到這個類。

ApplicationInfo與ResolveInfo比較:前者能夠得到Icon、Label、meta-data、description。后者只能得到Icon、Label。

下面講一下這幾個類綜合在一起的具體應用:

通過調用PackageManager的方法可以得到兩種不同的信息:

首先要得到manager:

PackageManager manager = getPackageManager();

Java代碼:

List< ApplicationInfo> appList = manager.getInstalledApplications(PackageManager.GET.UNINSTALLED_PAKAGES);它是通過解析AndroidManifest.xml的< application>標簽中得到的,所以它能得到所有的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>標簽得到有

< action android:name=”android.intent.action.MAIN”/>

< action android:name=”android.intent.category.LAUNCHER”/>

//這樣的app,所以得到的要比第一種方法少(前者比它多那種service、previder等app)。

第二篇:Android項目開發總結

項目開發總結報告

1引言

1.1編寫目的

總結開發經驗與學習中的不足

1.2背景

以方便用戶記錄日常學習心得,生活體會為目的,進行主題為“隨心筆記”的應用開發

2實際開發結果

2.1產品

2.2主要功能和性能

能夠查看筆記的目錄,記錄筆記完成時間。能夠改變主題顏色,目錄排版方式,擁有簡潔的主題。對于涂鴉功能,插入圖片,密碼鎖等功能未能實現。

3開發工作評價

3.1對產品質量的評價

本應用擁有簡單實用的功能,能夠滿足一般用戶的需要

3.3對技術方法的評價

開發中使用了軟件工程中的增量開發模型,黑盒測試等技術,使開發逐步向前發展

3.4出錯原因的分析

對于部分Android版本支持性不好,不能正常使用安裝等

4經驗與教訓

通過這次開發,我們體驗了開發不易,需要很多人員的合作。開發過程中,必須明確整體目標,不能東一榔頭,西一棒槌。另外由于學習時間短,對很多東西都不太了解,還好通過CSDN等一些網站能夠找到有益的幫助,感謝那些博客,論壇。

第三篇:Android開發基本知識總結-Android課件

Android開發基礎教程

2015-4-13周一2CJ02 目錄

1.什么是Android? 2.Android應用開發環境 3.Gradle 4.模擬器Emulator 5.開發一個安卓應用程序的步驟 6.關于多個模擬器的問題 7.安卓工程文件的結構 8.android界面文件---xml文件 9.android程序文件---java文件 10.界面布局方式 11.幾個常用組件 12.Roast組件 13.對話框AlertDialog 14.幾條重要的語句 15.監聽器Listener 16.識別響應事件的組件 17.界面切換

18.界面之間的數據傳遞 19.Activity生命周期 20.多媒體播放

21.日志文件在程序調試中的使用 22.使用XML文件保存數據

23.使用TXT文件保存數據 24.使用數據庫保存數據 25.時間組件 26.線程Thread 27.視頻播放VideoView 28.MediaPlayer,SurfaceView和SurfaceHolder播放視頻 29.錄制音頻MediaRecorder 30.菜單組件

1.什么是Android? 移動設備(常常指手機mobile)的操作系統,由google公司出品,是免費的, 最早是基于Linux平臺的;目前已經推出的Android3.0是平板電腦上的操作系統。

其它的手機操作系統有:iPhone系統等。

手機廠商:三星(Samsung,宏達電(HTC),摩托羅拉(Motorola),華碩,索尼,Garmin等都支持iPhone系統。

Android系統功能:自定義用戶界面,支持藍牙,多點觸摸,具有導航功能和語音識別功能,結合了google地圖。

Android軟件開發工具SDK

4.0。

Android系統特點:虛擬鍵盤,以WebKit為核心的WebView組件,可以使用HTML, javascript等。

2.Android應用開發環境 Eclipse+ADT+Android SDK。ADT---Android開發工具插件(Android Plugs for Eclipse).開發環境安裝注意事項:關閉防毒軟件,按順序安裝,保持網絡暢通,比較耗時。特別說明,安裝和運行需要高配置機器和高速網絡,比較費時。

(1)安裝Java

JDK。甲骨文

網站: http://www.tmdps.cn ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);startActivity(in);(2)調用系統撥號界面

Uri uri = Uri.parse(“tel:*** ”);Intent in = new Intent(Intent.ACTIN_DIAL, uri);startActivity(in);(3)調用系統撥號功能

Uri uri = Uri.parse(“tel:*** ”);Intent in = new Intent(Intent.ACTIN_CALL, uri);startActivity(in);注意:需要在AndroidManifest.xml文件中進行設置,才可以自動撥號: 18.界面之間的數據傳遞 1.方法1:調用無返回參數 在第一個界面中: Bundle bundle

= new Bundle();bndle.pushString(“name”, “David”);bndle.pushInt(“age”, 22);//pushChar, putShort,put Boolean, pushChar等等

Uri uri = Uri.parse(“http://www.tmdps.cn ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);in.putExtras(bundle);startActivity(in);在第二個界面中: Intent in = this.get Intent();Bundle bundle

= in.getExtras();String studentName = bundle.getInt();//getDouble, 2.方法2:調用有返回參數 例1,在第一個界面中: 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后所有語句無效,不執行;在第一個界面中,第二個界面可以在不同位置被多次調用;在第一個界面中,在其它位置可以調用其它界面。

在第一個界面中,重寫onActivityResult,接收所有被調用界面返回的參數(如果有):@Override protected void onActivityResult(int

requestCode,int resultCode,Intent

data){ super.onActivityResult(requestCode, resultCode, data);if(requestCode== ACTIVITY_EDIT)

//此參數可以區分不同的調用

{

Bundle bundle = data.getExtras();if(resultCode == RESULT_OK)

//此參數可以判斷有無返回參數

{

Bundle bundle = data.getExtras();……

} if

(resultCode == RESULT_CANCELED)

{ } }

…… } ……

問題

:如何判斷被調用界面是否傳遞返回參數?如何區分返回參數是由不同的被調用界面傳遞的?android的這種解決方法并不是完美的。例2,在第二個界面中:

讀取第一個界面傳遞的參數,省略;下面是向調用程序傳遞返回參數: Bundle bundle

= new Bundle();bndle.pushString(“name”, “賀昌峰373780592”);Intent

setResult(RESULT_CANCELED);//傳遞參數返回

// 或setResult(RESULT_OK, in);//不傳遞參數返回 finish();注意:這時,第二個界面返回到第一個界面,可以不傳遞參數直接返回(RESULT_CANCELED),in = new Intent();

in.putExtras(bundle);也可以傳遞參數返回(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()

//準備播放 //播放音樂

//判斷是否正在播放

//音樂播放完成觸發事件

player.setOnCompletionListener(new OnCompletionListener){ public void onCompletion(){ //音樂播放完成后,處理代碼 } }

player.pause();player.start();player.stop();

} catch(IllegalStateException e){ ……} catch(IOException e){ ……}

//播放暫停 //繼續播放音樂 //停止播放音樂 player.release();

//釋放存儲空間

//注意:可以播放存儲卡上任意一個音樂文件;也可以播放資源列表中的音樂文件 21.日志文件在程序調試中的使用

import android.util.Log;對應的方法有:debug,verbose,info,warn,error。注意,使用簡寫。問題:如何查看系統日志文件?

Log.d(“這里是分類標簽”, “這里是輸出信息”);22.使用XML文件保存數據

對XML文件進行操作,形式為(key,value)。SharedPreferences

sp = get SharedPreferences(文件名,權限);

權限:MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 例:

//1打開XML文件 SharedPreferences

//2更改數據

Editor editor = sp.eidt();

//更改數據

sp = get SharedPreferences(“myconfig”,MODE_PRIVATE);

editor.putString(“name”, “賀昌峰373780592”);editor.putInt(“age”, 48);editor.putFloat(“salary”, 2048.5);//putLong,putBoolean等;

editor.commit();

//保存數據

//3讀取數據

String myname = sp.getString(“name”, “”);

//4刪除數據

editor.remove(“name”);//刪除數據 editor.commit();

editor.clear();//刪除全部數據 editor.commit();

//5簡寫形式如下: Editor editor = sp.eidt()

//更改數據

//讀取數據

.putString(“name”,.commit();

“賀昌峰”)23.使用TXT文件保存數據 FileOutPutStream

fout = openFileOutput(文件名, 文件權限);文件權限: MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE

1.在文件中寫入數據

try { //打開TXT文件 FileOutPutStream

BufferedOutputStream

String

//向文件中寫入數據

bufferoutput.write(s.getBytes());s = “大家跟我學習android”;

bufferoutput = new BufferedOutputStream(fout);fout = openFileOutput(“myconfig.txt”, MODE_PRIVATE);

//關閉文件 bufferoutput.close();fout.close();} Catch(Exception e){

2.從文件中讀取數據

try { FileInputStream

BufferedInputStream

byte[] bufferbytes = new byte[20];int flag = bufferoutput.read(bufferbytes);if(flag==-1){ //文件讀取到文件末尾,否則可以繼續讀出

}

//僅讀取長度為20個字節的數據

bufferoutput = new BufferedInputStream(fout);

fout = openFileInput(“myconfig.txt”);

//打開文件

e.printStackTrace();} bufferoutput.close();fout.close();} Catch(Exception e){

24.使用數據庫保存數據 1.數據庫相關類

//關閉緩沖區 //關閉文件

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類

注意:數據庫操作時,要求捕獲異常,此處省略。

SQLiteDataBase db = openOrCreateDatabase(“databasename.db”, MODE_PRIVATE);//說明:數據庫權限同文件權限

// Context就是this指針 db.execSQL(sql_exp): 執行SQL語句

Cursor cs = db.rawQuery(select_exp, null): 返回數據集。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中,顯示數據集(有綁定功能嗎?):

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個參數的作用

listview1.setAdapter(cs);

//在ListView組件顯示數據集

25.時間組件

1.常用組件AnalogClock,DigitClock 用法比較簡單,無需過多設置,僅僅顯示當前時間:機械式,數字式

2.計時組件:Chronometer 常用方法:start開始計時, stop停止計時, setBase設置時間 setFormat(“秒表:%s”):設置組件時間顯示格式。

附:與時間格式有關的函數 SimpleDateFormat String

sformat = new SimpleDateFormats(“hh:mm:ss”);

//得得當前時間 s = sformat.format(new Date());

例,Chronometer對象是chroTime: chroTime.setOnChronometerTickListeter(chrolisteten);

private Chronometer.onChronometerTickListeter Chronometer.onChronometerTickListeter(){ @Override public

void OnChronometerTickListeter(Chronometer chronomoter){ //每秒執行一次該方法 } }

3.計時組件Timer和TimerTask

chrolisteten = new 常用函數:schedule(TimerTask對象, Timer對象延遲時間, TimerTask對象間隔時間);

TimerTask對象用法: private TimerTask { public void run(){ //按設定間隔調用執行 handle.sendMessage(msg);//特別注意:此處不能對界面進行更新,因為影響計時精度,所有需要使用Handle配合。見下。} }

4.Handle和Message的配合使用 Handle handle { public void handleMessage(){ super.handleMessage();//進行其它處理 }

= new Handle()

timetask = new TimerTask()} Message

msg.what = “******”;handle.sendMessage(msg);

26.線程Thread

1.Thread的定義

public class ClockThread extends Thread{ @Override public void run(){ //進行其它處理

//注意:不會自動重復執行多次的 } } 2.Thread的啟動、延時啟動、停止 使用Handle對線程進行控制: msg = new Message();Handle handle = new Handle();

ClockThread clock = new ClockThread();

handle.post(clock);

//啟動線程 5000);

//延時5000ms啟動線程 //停止線程 handle.postDelayed(clock, handle.removeCallbacks(clock);

問題:使用Handle有什么優點? 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.視頻準備播放事件

videoview.setOnPreparedListener(videoPreparedListener);videoview.setOnCompletionListener(videoCompletionListener);

private MediaPlayer.onPreparedListener videoPreparedListener = new MediaPlayer.onPreparedListener(){ @Override public

void onPrepared(MediaPlayer

mp){ //視頻準備播放 } }

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();//此組件可視化設計,無需這里聲明 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();

//準備播放視頻 //播放視頻

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卡的權限,在AndroidManifest.xml文件中:

//準備錄音 //開始錄音

mediaRecorder = new MediaRecorder(); :

1.附1:ImageView.setAlpha(50)的含義?設置透明色 2.附2:遍歷目錄下所有文件: private File pathfile;pathfile = Environment.getExternalStorageDirectory();

//疑問:pathfile + ”/myfilename.txt” 這個用法正確嗎? for(File file: pathfile.listFiles()){ if {(file.getName().toLowerCase().endsWith(“.amr”))……

// File.getAbsolutePath(), File.getName()的區別 } } 30.菜單組件 //添加系統菜單 protected protected static final int MENU_ABOUT

= Menu.FIRST;static final int MENU_QUIT = Menu.FIRST + 1;

//得到SD卡路經 protected

@Override static final int MENU_EDIT = Menu.FIRST + 2;public boolean onCreateOptionsMenu(Menu menu){ menu.add(0,MENU_ABOUT,0,“關于本軟件...”).setShortcut('0','A');

menu.add(0,MENU_QUIT,1,“結束”).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);} //添加菜單響應事件 @Override public boolean onOptionsItemSelected(MenuItem switch(item.getItemId()){ case MENU_ABOUT: // 響應處理 break;case MENU_QUIT: // 響應處理 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){ //注意:父類函數先調用,或最后調用? super.onCreateOptionsMenu(menu, v, menuInfo);

if(v == txtview1)menu.add(0, MENU_BACKCOLOR,0,“設置背景顏色”); if(v == txtview2)menu.add(0, MENU_SMALLSIZE,1,“較小字體”);

}

//添加菜單響應事件 @Override public boolean onContextItemSelected(MenuItem switch(item.getItemId()){ case MENU_BACKCOLOR: // 響應處理

layout.setBackgroundColor(Color.BLUE);break;case MENU_SMALLSIZE: // 響應處理

txtview2.setTextSize(12);break;}

return super.onContextItemSelected(item);}

item){

第四篇:Qualcomm平臺android開發總結

1、高通平臺android開發總結.7 1.1 搭建高通平臺環境開發環境.7 1.2 搭建高通平臺環境開發環境.7 1.2.1 高通android智能平臺概述.7

1.2.1.1 什么是L4,REX,BREW,AMSS以及相互之間的關系.7 1.2.2 選擇合適的源代碼以及工具.8

1.2.2.1 獲取經過高通打補丁的android 源代碼.8 1.2.2.2 獲取高通針對不同處理器的vendor源代碼.9 1.2.2.3 獲取 modem 源代碼.9

1.2.2.3.1 高通 modem 源代碼編譯前的修正.13 1.2.3 建立 Android 開發環境.14 1.2.4 建立 modem 開發環境.15 1.2.4.1 補充.16

1.2.4.1.1 獲取 licenses 16

1.2.4.1.2 Flex 簡單使用指南.16 1.2.4.1.3 啟動 license 服務器.18

1.2.4.1.4 license 沒有辦法從服務器獲取的幾種情況.18 1.2.4.1.5 破解 rvds 的license 19 1.2.5 在高通開發板上燒錄文件系統.19

1.3 高通平臺,android和 modem 編譯流程分析.21 1.3.1 android代碼編譯流程分析.21 1.3.1.1 編譯工具檢測.22 1.3.1.1.1 22

1.3.1.2 appsboot.mbn 生成過程解析.22

1.3.1.3 boot.img 生成過程解析,怎樣手動生成 boog.img 28 1.3.1.4 編譯過程存在的問題.32

1.3.1.4.1 prelinkmap 的時候 base 0xaff00000 out of range 32 1.3.1.4.2 LOCAL_SDK_VERSION 使應用程序不能訪問hide的api 32 1.3.1.4.3 armv5te-vfp 導致一些游戲運行不了.32 1.3.2 分布式編譯 android 代碼.33 1.3.3 modem 代碼編譯流程分析.33

1.3.3.1 單獨編譯某個模塊(如:qcsbl oemsbl).34 1.3.3.2 $(TARGETDIR)/exist 規則解析.36 1.3.3.3 setup規則解析.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規則解析.38

1.3.3.5 corebsp_build規則解析.38 1.3.3.5.1 corebsp_build_action 38 1.3.3.5.1.1 corebsp_scons 規則.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規則解析.47 1.3.3.8 exe規則解析.47

1.3.3.8.1 CORELIBS_AABBQOLYM.mbn生成過程解析.47 1.3.3.8.2 amss.mbn 生成過程解析.47 1.3.3.9 bldprod規則解析.48

1.3.3.10 create_mem_feat_html規則解析.48 1.3.3.10.1 50

1.3.3.11 partition規則解析.50

1.3.3.11.1 eMCC 啟動和 NAND 啟動的分區格式是不一樣的,如果是 eMCC 啟動,多了編譯選項:.50

1.4 高通平臺 7630 啟動流程分析.52 1.4.1 啟動流程概述.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 過程分析(需要側重關心的部分).58 1.4.5.1.1 fastboot 模式分析.61

1.4.5.1.1.1 什么是 fastboot 模式.61

1.4.5.1.1.2 fastboot 模式與 recovery 模式的區別.61 1.4.5.1.1.3 怎樣進入 fastboot 模式.62

1.4.5.1.1.4 android 系統手機刷機過程分析(補充知識)62 1.4.5.1.2 appsbl 引導 android 系統.63

1.4.5.1.2.1 Android 系統啟動過程中存在的問題.67 1.4.5.1.1.1.1 linker 問題導致系統無法啟動.67 1.4.6 AMSS 流程.69

1.5 android 系統重啟關機流程分析.82 1.5.1 c語言中調用 reboot 函數.82 1.5.2 通過 adb 讓系統重啟.82

1.5.3 fastboot 模式下系統重啟.83 1.5.4 系統關機.84

1.5.5 內核中的系統調用 reboot 85 1.6 軟件調用流程分析.89 1.6.1 設置sim卡狀態.89 1.6.2 設置背光.90 1.6.3 獲取電池信息.90

1.7 python scons 語法學習.94 1.8 python 語法學習.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 系統更新升級總結.104 4.1 刷機基本知識.104

4.1.1 各品牌代表手機刷機模式進入方法.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 命令選項 –w –s-p –c 106 4.1.2.3 手機端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 軟件升級包.109

4.1.3.3 recovery v1跟recovery v2的區別.109 4.1.3.4 軟件升級腳本語法解析.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 函數解析.117 4.1.3.5 Recovery 流程分析.118 4.1.3.5.1 恢復出廠設置.118 4.1.3.5.2 系統更新流程.119

4.1.3.5.3 通過sd卡實現刷機.121 4.1.3.6 系統升級包案例分析.122 4.1.4 工程模式(HBoot)模式.122 4.1.4.1 HBOOT降級方法.122

4.2 如何制作升級包 update.zip 123 4.2.1 手動制作升級包.123 4.2.2 自動制作升級包.123 4.3 Android 簽名機制.125

4.4 android 文件系統權限概述.125 4.4.1 獲取手機root權限.127 4.4.2 adb默認權限分析.128

4.4.3 adb root命令切換到 root 權限.129 4.4.4 掛載系統分區為讀寫(remount)130

4.4.5 通過修改 boot.img 獲取 Nexus One 權限.132 4.5 系統應用移植.132

4.5.1 Android 2.2在線升級的移植.132

4.5.2 解決donut Gtalk、Market登錄不了的問題.133 4.5.3 apk反編譯問題總結.133

4.5.4 系統重啟.133

5、高通linux內核驅動開發.133 5.1 添加串口調試.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、程序安裝與調試.138

8、android 框架流程分析.138 8.1 屏幕顯示相關.138 8.1.1 屏幕分辨率.138 8.1.2 屏幕模式.139

8.2 Android 開機充電.141 8.3 Android 開機動畫.141 8.3.1 內核開機畫面.141 8.3.2 文件系統開機畫面.141

8.3.2.1 開機顯示的 ANDROID 文字.141 8.3.2.2 ANDROID 發光動畫.142

8.3.2.3 initlogo.rle 文件分析.143

8.3.2.4 bootanimation.zip 文件分析.143 8.3.3 三星I9000 開機動畫.144 8.4 JNI調用流程.145

8.5 Android 開機鈴聲.145 8.6 GPS 導航.145

8.6.1 GPS導航原理.145 8.6.2 GPS導航軟件.145

9、高通modem框架流程分析.146 9.1.1 添加自定義rpc調用.146

9.1.1.1 從AP端獲取modem的系統分區信息.146 9.1.2 添加自定義 AT命令.146

10、linux 應用.146

10.1 嵌入式Linux通過幀緩存截圖包括Scheduling(調度), File system(文件系統), Networking(網絡), Device driver(設備驅動程序), Memory management(存儲管理), Paging(存儲頁面管理)-都在內核中完成.一直到現在廣泛應用的操作系統,如UNIX,Linux,和Windows還大都是monolithic kernel操作系統.但隨著操作系統變得越來越復雜(現代操作系統的內核有一兩百萬行C程序是很常見的事情),把所有這些功能都放在內核中使設計難度迅 速增加.微內核是一個與Monolithic Kernel相反的設計理念.它的目的是使內核縮到最小,把所有可能的功能模塊移出內核.理想情況下,內核中僅留下Address Space Support(地址空間支持),IPC(Inter-Process Communication,進程間通訊),和Scheduling(調度),其他功能模塊做為用戶進程運行。

REX 是在 L4 之上封裝的服務,是一個搶占式,多任務的RTOS,所有的任務都以task的形式存在,REX提供包括任務創建,同步,互斥,計時器,中斷控制等功能的 API,這里的task實際上就是我們的線程,每個 task對應著一個線程。REX維護一個task list(雙向鏈表),始終運行高優先級的task。products里面所有的服務包括3g協議棧等都是以task的形式跑在rex之上的。而Brew的話是運行的環境,跟Java 有點兒類似,相當于是一個虛擬機。AMSS――高級的移動用戶軟件(Advanced Mobile Subscriber Software)技術,是一種新的軟件架構,是對原來軟件架構 DMSS 的升級。AMSS源代碼實際上是QC BREW(Binary Runtime Environment For Wireless)平臺的的底層部分,去掉了為應用程序提供接口的AEE(application execution environment)部分,高通在Dual Proc芯片上的其他平臺基本上都是采用的這樣的架構。

參考文檔:

微內核操作系統及L4概述

http://wenku.baidu.com/view/90929762caaedd3383c4d311.html MSM平臺上的AMSS http://blog.csdn.net/yili_xie/archive/2010/01/04/5129469.aspx

1.2.2 選擇合適的源代碼以及工具 要編譯出可供燒寫使用的鏡像文件需要三部分代碼: 1)獲取經過高通打補丁的 android 源代碼 2)獲取高通針對不同處理器的 vendor 源代碼 3)獲取 modem 源代碼

1.2.2.1 獲取經過高通打補丁的android 源代碼 網址:

http://www.tmdps.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 源代碼編譯前的修正

從高通獲取的源代碼直接編譯會存在一些問題,以下為可能的問題以及解決方法:

1)為相應的腳本加上編譯選項

vim./AMSS/products/7x30/build/ms/xxxxxx.cmd 加上: BUILD_UNIX=yes

2)如果編譯過程出現.pl 文件沒有執行權限而退出,那么為工程下面所有的 pl 文件加上可執行屬性,命令:

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)如果出現錯誤:

“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 內容:

#if($line =~ /^# makefile(from/)為:

if($line =~ /^# makefile /)原因分析:

genpaths.pl 會對編譯過程的中間信息 :...line=# makefile(from'incpaths.min',line 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc...等信息進行解析,由于我們使用的是中文系統,所以以上內容變為: line=# makefile(從'incpaths.min',行 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc 所以導致:

#if($line =~ /^# makefile(from/)判斷條件為為 false 無法正確生成 incpathsaaabqmlym.py,python 在解析該文件的時候認為存在語法錯誤。

在 modem 代碼 M7630AABBQMAZM2020(HY11-N2280-2.zip)中開始使用 genincpaths.py 產生

./AMSS/products/7x30/core/bsp/build/data/incpathsaaabqoazm.py 文件,所以修改文件 amend-source-code-qualcomm-modem.sh 在腳本中需要加入以下內容: 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)如果出現 make: execvp:../../../../platform/cs/bin/cifc: Permission denied 錯誤,執行以下命令:

chmod-R 755 AMSS/platform/cs/bin/*

1.2.3 建立 Android 開發環境(略)

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 將會安裝下面的包 sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre sun-java5-plugin 如果ubuntu 發布版本中沒有 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,那么用手動安裝: 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 開發環境

與android 源代碼不同,modem 編譯工具使用的是 RVDS ,實際上只用到其中的 RVCT 編譯器,高通不提供該工具,我們必須從arm公司獲取相應的授權,RVDS 是 ADS 的升級版本,從 ADS 1.2 開始到 RVDS 3.1 我們公司都有其授權,按照高通的要求我們目前必須使用 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的安裝程序為:

./rvds2.2_linux-pentium/setuplinux.bin 執行以上命令,按照默認步驟安裝,安裝路徑為:~/ARM 注意事項:

安裝過程如果出現錯誤:

..................java.lang.UnsatisfiedLinkError: /tmp/ismp001/6073753.tmp: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory 從網上下載 libstdc++-libc6.2-2.so.3 拷貝到 /usr/lib 目錄 ,或者從下面地址獲取:

http://172.20.127.15/repositories/DocsAndTools/Tools/Qualcomm/RVDS-2.2-patch/patch/libstdc++-libc6.2-2.so.3 工具的安裝通過腳本進行了簡化,具體過程請參考文檔: 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/下執行命令:./setup-patch-rvct2.2-bin593-lib349.sh

目前版本只支持 32 位的系統 1.2.4.1 補充

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 官方網站下載評估版本

https://silver.arm.com/browse http://www.tmdps.cn/wiki/QAEP#Branch_Releases http://www.tmdps.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 以上兩部分代碼已經下載并且合并,共享在:

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代碼從高通網站: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 ======== 編譯結果分別如下:------------其中 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 啟動使用的是 ext3 文件系統,需要使用鏡像 system.img.ext3 userdata.img.ext3 補充說明:

partition.mbn 文件的原始數據來自配置文件:

./AMSS/products/7x30/tools/jsdcc/partition_load_pt/partition.xml

1.3 高通平臺,android和 modem 編譯流程分析 android 代碼編譯流程分析 modem 代碼編譯流程分析 1.3.1 android代碼編譯流程分析

1.從服務器下載 android 源碼到當前目錄

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 設置環境變量 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 內核,通過 linux 的引導來完成 android 系統的加載,appsboot.mbn 被燒寫在相應的分區,它的加載由 osbl.mbn 來完成,osbl.mbn 程序來自 modem。

7x30 7x27 系列 appsboot 不一樣,7x30 的 appsboot.mbn 是 7x27 appsboothd.mbn appsboot.mbn 兩個文件的合并

1)appsboot.mbn 生成過程解析

2)boot.img 生成過程解析,怎樣手動生成 boog.img

1.3.1.1 編譯工具檢測

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 分別執行:

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 因為

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]: 正在進入目錄

`/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]: 正在進入目錄

/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 然后把 appsboothd.mbn 和 lk.bin 合并為文件 appsboot.mbn,刪除 appsboothd.mbn 文件 appsboothd.mbn 大小 40K./bootable/bootloader/lk/target/msm7630_surf/tools/mkheader out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin out/target/product/msm7630_surf/appsboothd.mbn 合并 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 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 生成過程解析,怎樣手動生成 boog.img boot.img 包括兩個部分: kernel 和 ramdisk,通過命令: make out/target/product/msm7630_surf/boot.img showcommands 會自動生成 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 的拷貝

編譯內核之前必須獲取一個默認的配置文件.config ,此配置文件可以生成,或者來自默認配置,高通中 msm7630_surf 的

默認配置文件名為: msm7630-perf_defconfig 在文件: vendor/qcom/msm7630_surf/AndroidBoard.mk:45 中通過: KERNEL_DEFCONFIG := msm7630-perf_defconfig 進行了指定。我們可以通過命令:

make-j3 ARCH=arm CROSS_COMPILE=arm-eabi-kernel showcommands 或者通過如下命令一步步完成:

1.獲取默認的內核配置并生成.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 進入 kernel 工作目錄,到其下面尋找 makefile 文件

O 內核編譯的中間文件以及編譯結果等都存儲在該目錄下,此做法的好處是不會在kernel源代碼目錄下生成垃圾文件

ARCH=arm 告訴系統到./kernel/arch/$ARCH/configs/ 目錄下找文件 msm7630-perf_defconfig,生成的.config 保存在:

out/target/product/msm7630_surf/obj/KERNEL_OBJ/.config 2.手動編譯內核

make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ/ 3.如果需要配置內核,使用下面的命令 make kernelconfig 他首先會進入 menuconfig 界面,用戶配置完成以后,會把修改后的配置文件$(KERNEL_OUT)/.config 更新為默認的配置文件

cp out/target/product/msm7627_ffa/obj/KERNEL_OBJ/.config kernel/arch/arm/configs/msm7627-perf_defconfig kernel/arch/arm/configs/$(KERNEL_DEFCONFIG)

4.手動生成 ramdisk 執行命令

make out/target/product/msm7630_surf/ramdisk.img showcommands 會用到命令:

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.手動生成 boot.img 需要使用命令 mkbootimg ,語法如下: mkbootimg--kernel 內核--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 =================== 因為有:

bootable/bootloader/lk/AndroidBoot.mk:3: TARGET_BOOTLOADER := $(PRODUCT_OUT)/appsboot.mbn INSTALLED_BOOTLOADER_TARGET := $(PRODUCT_OUT)/bootloader file := $(INSTALLED_BOOTLOADER_TARGET)

第五篇:Android開發優勢總結

Android開發優勢總結

來源:扣丁學堂

目前市場上的移動端有兩種形式,一種是Android開發,另一種是ios開發,其中Android開發方面的人員要多一些,今天我們就一起來看一下扣丁學堂Android培訓講師解讀的Android開發的優勢。

Android開發優勢:

1、Android價格占優,價廉性能并不低

消費者選擇產品,價格是必然要考慮的一大因素,iphone雖好,但是價格讓一般人望而卻步。蘋果就像是寶馬、奔馳,雖然大家都認為它很好,但是一般人消費不起,只有看的份。而Android,如同大眾,滿大街跑的都是,不僅如此,還有一些型號是可以與寶馬、奔馳相媲美的。雖然Android平臺的手機價廉,但是其性能卻一點也不低廉,觸摸效果并不比蘋果差到哪里去。Android平臺簡單實用,無論是功能還是外觀設計,都可以與蘋果一決高下。當消費者考慮價格因素之后,在數量眾多的android手機中,消費者總是會找到一款滿意的Android手機取代價格高昂的 iPhone。

2、應用程序發展迅速

智能機玩的就是個應用,雖然現在Android的應用還無法與蘋果相競爭,但是隨著Android的推廣與普及,應用程序數在成數量級增長,Android應用在可預見的未來是有能力與蘋果相競爭的。而來自Android應用商店最大的優勢是,不對應用程序進行嚴格的審查,在這一點上優于蘋果。

3、智能手機廠家助力

蘋果的自我中心是它成功的一大法寶,從硬件到軟件,到其獨特的推廣方式。蘋果形成了一個很好的很完整的產業鏈。在一個封閉的圈子中創造一個又一個的奇想,讓消費者的體驗得到了很大的滿足。但是這樣并不能使其長期占據有利位置。現在,世界很多智能手機廠家幾乎都加入了Android陣營,并推出了一系列的Android智能機。摩托羅拉、三星、HTC、LG、Lumigon等廠家都與谷歌建立了Android平臺技術聯盟。廠商加盟的越多,手機終端就會越多,其市場潛力就越大。

4、運營商的鼎力支持

在國內,三大運營商是卯足了勁的推出Android智能機。聯通的“0元購機”,電信的千元3G,移動的索愛A8i定制機,都顯示了運營商對Android智能機的期望。在美國,T-Mobile、Sprint、AT&T和Verizon全部推出了Android手機。此外,日本的KDDI,NTT DoCoMo,Telecom Italia(意大利電信)、T-Mobile(德

國)、Telefónica(西班牙)等眾多運營商都是Android的支持者。有這么多的運營商支持Android,自然會占據巨大的市場份額。相對于Android的運營商聯盟,只有AT&T一家運營商銷售iPhone。而蘋果其特有的自我封閉性,無論是對手機廠商還是對運營商,都帶來了一定的威脅性。手機聯盟的形成,在一定程度上直指蘋果。

5、機型多 硬件配置優

自從谷歌推出Android系統以來,各大廠家紛紛推出自己的Android平臺手機,HTC、索尼愛立信、魅族、摩托羅拉、夏普、LG、三星、聯想等等,每一家手機廠商都推出了各自的Android手機,機型多樣,數不勝數。摩托羅拉的Droid X、三星的Galaxy,HTC從開始的T-Mobile G1到當前的 EVO 4G,每一款都有著優秀的配置,都有可說之處。

6、系統開源 利于創新

蘋果的自我封閉性,使其創新必須源自內部。而Android是開源的,允許第三方修改,這在很大程度上容許廠家根據自己的硬件更改版本,從而能夠更好的適應硬件,與之形成良好的結合。

扣丁學堂Android視頻教程講師:相比于蘋果的封閉,開源能夠提供更好的安全性能,也給開發人員提供了一個更大的創新空間,從而使Android版本升級更快。扣丁學堂有大量的的Android視頻教程可供Android開發者觀看學習,喜歡的話就關注扣丁學堂吧。

下載Android開發Info類總結word格式文檔
下載Android開發Info類總結.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    android開發實習報告總結

    Android開發實習總結 有一名話叫做:不經過風雨,怎么見彩虹?我想改一下:不真正進入社會,怎能了解社會呢? 在這次實習中,給我收獲最大的是我覺得很多工作需要我去摸索和探討,要不怕吃......

    Android應用程序開發-個人總結(最終定稿)

    《Android應用開發》個人總結報告 一、 項目簡介: 送祝福App是一款逢年過節為方便發送祝福信息的軟件,并且介紹各種節日的相關情況。包含節日祝福短信,支持直接發送短信給好友......

    android 開發心得

    即 使你的應用程序是快速且響應靈敏的,但一些設計仍然會給用戶造成問題——與其它應用程序或對話框未事先計劃的交互,意外的數據丟失,意料之外的阻塞等等。 避免這些問題,有助于......

    android教程JNI開發疑點總結

    android教程JNI開發疑點總結 很多Android新手對于JNI開發過程中的疑問不是很清楚,根據android123@163.com郵箱中反饋的內容我們整理如下: 1. JNI中,什么情況才處理jstring、ji......

    Android開發知識點總結(共5則)

    由麥可網整理,轉載請注明出處Android開發知識點總結 1. 如何讓你的應用優先安裝到SD卡上? 從Android 2.2 SDK開始多出了一個屬性在AndroidManifest.xml中,在manifest節點加入a......

    Eclipse android開發環境搭建總結

    環境組成:Eclipse4.2+JDK 1.6+Android SDK v21+ ADT 一、安裝Eclipse + JDK Eclipse是一款免費開源的開發工具,它提供的僅僅是一個框架,其特點在于插件開發,即它可以添加插件,根......

    Android NDK C++開發注意事項總結

    由麥可網整理,轉載請注明出處 Android NDK C++開發注意事項總結 相信Android開發者都喜歡用C++編寫一些高效的應用,有關Android NDK的C++開發相關知識Android123總結如下: 1.......

    Android開發分享講稿(修改)

    講清楚,do better Android開發入門分享 今天要給大家分享的是Android開發入門,小青青_Lo是我的微博昵稱,如果覺得我講得好,求互粉(*^__^*) 嘻嘻~~ 講解大綱 這個是今天講解的大......

主站蜘蛛池模板: 少妇特黄a一区二区三区| 亚洲国产精品久久久久秋霞小说| 首页 综合国产 亚洲 丝袜日本| 人人爽人人澡人人高潮| 国产成人无码免费视频麻豆| 成人三级a视频在线观看| 日韩一卡2卡3卡4卡乱码网站导航| 亚洲 日韩 欧美 有码 在线| 亚洲一卡久久4卡5卡6卡7卡| 亚洲最新版av无码中文字幕一区| 亚洲性夜夜天天天| 乱人伦xxxx国语对白| 欧美俄罗斯乱妇| 伊人大香人妻在线播放| 亚洲精品乱码久久久久久| 久久精品夜夜夜夜夜久久| 国产欧美日韩亚洲一二三区| 精品国产一区二区三区免费| 国产精品国产亚洲区艳妇糸列短篇| 精品国产自线午夜福利| 欧美综合区自拍亚洲综合绿色| 又大又长粗又爽又黄少妇视频| 欧洲国产在线精品手机版| 国产成人精品午夜二三区波多野| 无码中文人妻视频2019| 国产99久一区二区三区a片| 午夜福利视频网站| 无码日本精品一区二区片| 国内精品视这里只有精品| 欧美人与zoxxxx另类| 成人午夜福利视频后入| 精品国产乱码久久久人妻| 女的扒开尿口让男人桶30分钟| 四虎永久在线精品免费下载| 免费黄色电影在线观看| 国产精品久久久亚洲| 国产精品毛片va一区二区三区| 国内精品国产三级国产av| 亚洲 欧美 日韩 国产综合 在线| 偷偷色噜狠狠狠狠的777米奇| 色八区人妻在线视频免费|