欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      總結(jié)android項目的基本開發(fā)步驟

      時間:2019-05-12 12:47:53下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關的《總結(jié)android項目的基本開發(fā)步驟》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《總結(jié)android項目的基本開發(fā)步驟》。

      第一篇:總結(jié)android項目的基本開發(fā)步驟

      http://004km.cn/

      總結(jié)android項目的基本開發(fā)步驟

      做了幾個android企業(yè)應用項目后,總結(jié)了項目的基本開發(fā)步驟,希望能夠交流。一 應用規(guī)劃:

      -確定功能。

      -必須的界面及界面跳轉(zhuǎn)的流程。

      -需要的數(shù)據(jù)及數(shù)據(jù)的來源及格式。

      -是否需要服務端支持。

      -是否需要本地數(shù)據(jù)庫支持。

      -是否需要特殊權限。

      -是否需要后臺服務。二 架構(gòu)設計:

      -分層。

      -網(wǎng)絡連接。

      -數(shù)據(jù)處理-xml、domain。

      -封裝Activity。三 界面設計:

      -主界面確定。

      -模塊界面、列表、查看、編輯界面。

      -菜單、按鈕、對話框、提示信息。

      -界面總體顏色。四 數(shù)據(jù)操作和存儲:

      -數(shù)據(jù)來源。

      -數(shù)據(jù)類型。

      -存儲方式。五 業(yè)務實現(xiàn):

      -客戶端業(yè)務解析。六 頁面跳轉(zhuǎn):

      -每個頁面間的跳轉(zhuǎn)。

      -菜單、按鈕、事件等。

      #開發(fā)之前還需要做一些準備工作

      1.技術儲備

      a.Java

      重要程度:?????-框架,編程思想,編碼規(guī)范,設計模式等 b.Xml

      重要程度:????-布局,選擇器,配置文件等

      c.數(shù)據(jù)庫

      重要程度:???-關系型數(shù)據(jù)庫,SQLite

      http://004km.cn/ 2.開發(fā)工具

      a.Eclipse或者AndroidStudio

      b.Android SDK

      c.其他:svn / git,JDK,資源,數(shù)據(jù)庫,模擬器,真機等

      #開發(fā)過程中還有以下的一些流程 1.多種開源框架和優(yōu)秀源碼的引用

      -xUtils,Volley,Vitamio,SlidingMenu等 2.數(shù)據(jù)訪問-訪問框架-傳遞方式

      3.多種API的接入-短信服務-即時通信

      -消息推送-第三方登錄等 4.后臺開發(fā)

      -后臺的開發(fā),為app提供接口-后臺的云服務器

      5.內(nèi)存優(yōu)化

      -垃圾回收-

      一、二級緩存-適配器的優(yōu)化

      -圖片框架及資源的優(yōu)化

      6.多線程異步

      -Handler-Asynctask

      7.屏幕適配

      #開發(fā)基本結(jié)束之后還有很多需要流程 1.多型號真機實測 2.云服務器優(yōu)化 3.APK加密 4.數(shù)字簽名 5.用戶協(xié)議 6.應用平臺 7.項目上線

      8.應用推廣和廣告插入 9.版本更新和維護

      http://004km.cn/

      第二篇:Android項目開發(fā)總結(jié)

      項目開發(fā)總結(jié)報告

      1引言

      1.1編寫目的

      總結(jié)開發(fā)經(jīng)驗與學習中的不足

      1.2背景

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

      2實際開發(fā)結(jié)果

      2.1產(chǎn)品

      2.2主要功能和性能

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

      3開發(fā)工作評價

      3.1對產(chǎn)品質(zhì)量的評價

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

      3.3對技術方法的評價

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

      3.4出錯原因的分析

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

      4經(jīng)驗與教訓

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

      第三篇:Android開發(fā)基本知識總結(jié)-Android課件

      Android開發(fā)基礎教程

      2015-4-13周一2CJ02 目錄

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

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

      21.日志文件在程序調(diào)試中的使用 22.使用XML文件保存數(shù)據(jù)

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

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

      其它的手機操作系統(tǒng)有:iPhone系統(tǒng)等。

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

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

      Android軟件開發(fā)工具SDK

      4.0。

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

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

      (1)安裝Java

      JDK。甲骨文

      網(wǎng)站: http://004km.cn ”);Intent in = new Intent(Intent.ACTIN_VIEW, uri);startActivity(in);(2)調(diào)用系統(tǒng)撥號界面

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

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

      = 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);在第二個界面中: Intent in = this.get Intent();Bundle bundle

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

      在第一個界面中,重寫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,在第二個界面中:

      讀取第一個界面?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ù)直接返回(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()

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

      //判斷是否正在播放

      //音樂播放完成觸發(fā)事件

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

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

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

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

      //釋放存儲空間

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

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

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

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

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

      權限: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簡寫形式如下: Editor editor = sp.eidt()

      //更改數(shù)據(jù)

      //讀取數(shù)據(jù)

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

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

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

      1.在文件中寫入數(shù)據(jù)

      try { //打開TXT文件 FileOutPutStream

      BufferedOutputStream

      String

      //向文件中寫入數(shù)據(jù)

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

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

      //關閉文件 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ù)讀出

      }

      //僅讀取長度為20個字節(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ù)庫相關類

      //關閉緩沖區(qū) //關閉文件

      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ù)庫操作時,要求捕獲異常,此處省略。

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

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

      Cursor cs = db.rawQuery(select_exp, null): 返回數(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個參數(shù)的作用

      listview1.setAdapter(cs);

      //在ListView組件顯示數(shù)據(jù)集

      25.時間組件

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

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

      附:與時間格式有關的函數(shù) 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){ //每秒執(zhí)行一次該方法 } }

      3.計時組件Timer和TimerTask

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

      TimerTask對象用法: private TimerTask { public void run(){ //按設定間隔調(diào)用執(zhí)行 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(){ //進行其它處理

      //注意:不會自動重復執(zhí)行多次的 } } 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有什么優(yōu)點? 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()的區(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,“關于本軟件...”).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);} //添加菜單響應事件 @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){ //注意:父類函數(shù)先調(diào)用,或最后調(diào)用? 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開發(fā)總結(jié)

      1、高通平臺android開發(fā)總結(jié).7 1.1 搭建高通平臺環(huán)境開發(fā)環(huán)境.7 1.2 搭建高通平臺環(huán)境開發(fā)環(huán)境.7 1.2.1 高通android智能平臺概述.7

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

      1.2.2.1 獲取經(jīng)過高通打補丁的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 開發(fā)環(huán)境.14 1.2.4 建立 modem 開發(fā)環(huán)境.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 在高通開發(fā)板上燒錄文件系統(tǒng).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 規(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 啟動和 NAND 啟動的分區(qū)格式是不一樣的,如果是 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 過程分析(需要側(cè)重關心的部分).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 怎樣進入 fastboot 模式.62

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

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

      1.5 android 系統(tǒng)重啟關機流程分析.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)關機.84

      1.5.5 內(nèi)核中的系統(tǒng)調(diào)用 reboot 85 1.6 軟件調(diào)用流程分析.89 1.6.1 設置sim卡狀態(tài).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 系統(tǒng)更新升級總結(jié).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的區(qū)別.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 函數(shù)解析.117 4.1.3.5 Recovery 流程分析.118 4.1.3.5.1 恢復出廠設置.118 4.1.3.5.2 系統(tǒng)更新流程.119

      4.1.3.5.3 通過sd卡實現(xiàn)刷機.121 4.1.3.6 系統(tǒng)升級包案例分析.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 文件系統(tǒng)權限概述.125 4.4.1 獲取手機root權限.127 4.4.2 adb默認權限分析.128

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

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

      4.5.1 Android 2.2在線升級的移植.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ū)動開發(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 屏幕顯示相關.138 8.1.1 屏幕分辨率.138 8.1.2 屏幕模式.139

      8.2 Android 開機充電.141 8.3 Android 開機動畫.141 8.3.1 內(nèi)核開機畫面.141 8.3.2 文件系統(tǒng)開機畫面.141

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

      8.3.2.3 initlogo.rle 文件分析.143

      8.3.2.4 bootanimation.zip 文件分析.143 8.3.3 三星I9000 開機動畫.144 8.4 JNI調(diào)用流程.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調(diào)用.146

      9.1.1.1 從AP端獲取modem的系統(tǒng)分區(qū)信息.146 9.1.2 添加自定義 AT命令.146

      10、linux 應用.146

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

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

      參考文檔:

      微內(nèi)核操作系統(tǒng)及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)獲取經(jīng)過高通打補丁的 android 源代碼 2)獲取高通針對不同處理器的 vendor 源代碼 3)獲取 modem 源代碼

      1.2.2.1 獲取經(jīng)過高通打補丁的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 源代碼編譯前的修正

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

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

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

      2)如果編譯過程出現(xiàn).pl 文件沒有執(zhí)行權限而退出,那么為工程下面所有的 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)錯誤:

      “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 會對編譯過程的中間信息 :...line=# makefile(from'incpaths.min',line 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc...等信息進行解析,由于我們使用的是中文系統(tǒng),所以以上內(nèi)容變?yōu)椋?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 產(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 錯誤,執(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 將會安裝下面的包 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,那么用手動安裝: 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 ,實際上只用到其中的 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 執(zhí)行以上命令,按照默認步驟安裝,安裝路徑為:~/ARM 注意事項:

      安裝過程如果出現(xiàn)錯誤:

      ..................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 工具的安裝通過腳本進行了簡化,具體過程請參考文檔: 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 補充

      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)站下載評估版本

      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 啟動使用的是 ext3 文件系統(tǒng),需要使用鏡像 system.img.ext3 userdata.img.ext3 補充說明:

      partition.mbn 文件的原始數(shù)據(jù)來自配置文件:

      ./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 設置環(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 的引導來完成 android 系統(tǒng)的加載,appsboot.mbn 被燒寫在相應的分區(qū),它的加載由 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 分別執(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 因為

      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 的拷貝

      編譯內(nèi)核之前必須獲取一個默認的配置文件.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.獲取默認的內(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 進入 kernel 工作目錄,到其下面尋找 makefile 文件

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

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

      out/target/product/msm7630_surf/obj/KERNEL_OBJ/.config 2.手動編譯內(nèi)核

      make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ/ 3.如果需要配置內(nèi)核,使用下面的命令 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 執(zhí)行命令

      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 內(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 =================== 因為有:

      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)勢總結(jié)

      Android開發(fā)優(yōu)勢總結(jié)

      來源:扣丁學堂

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

      Android開發(fā)優(yōu)勢:

      1、Android價格占優(yōu),價廉性能并不低

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

      2、應用程序發(fā)展迅速

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

      3、智能手機廠家助力

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

      4、運營商的鼎力支持

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

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

      5、機型多 硬件配置優(yōu)

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

      6、系統(tǒng)開源 利于創(chuàng)新

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

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

      下載總結(jié)android項目的基本開發(fā)步驟word格式文檔
      下載總結(jié)android項目的基本開發(fā)步驟.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


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

      相關范文推薦

        android開發(fā)實習報告總結(jié)

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

        Android開發(fā)Info類總結(jié)

        Android開發(fā)Info類總結(jié)首先我們來看一下PackageItemInfo,它是包含了一些信息的基類,它的直接子類有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupI......

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

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

        android 開發(fā)心得

        即 使你的應用程序是快速且響應靈敏的,但一些設計仍然會給用戶造成問題——與其它應用程序或?qū)υ捒蛭词孪扔媱澋慕换?,意外的?shù)據(jù)丟失,意料之外的阻塞等等。 避免這些問題,有助于......

        學車基本步驟總結(jié)

        學車的基本步驟總結(jié) 一、上車前: 在上車以前,你得圍繞車輛轉(zhuǎn)一周,檢查車輛周圍和底部有無障礙物,及車輛外部的完好情況,然后,開門上車。 上車后: 上車后,調(diào)整座位和三鏡,系好安全帶,發(fā)......

        android教程JNI開發(fā)疑點總結(jié)

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

        Android開發(fā)知識點總結(jié)(共5則)

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

        Eclipse android開發(fā)環(huán)境搭建總結(jié)

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