Android开发基本知识总结-Android课件

时间:2019-05-11 21:27:47下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《Android开发基本知识总结-Android课件》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《Android开发基本知识总结-Android课件》。

第一篇: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.xiexiebang.com ”);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.xiexiebang.com ”);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){

第二篇:Android项目开发总结

项目开发总结报告

1引言

1.1编写目的

总结开发经验与学习中的不足

1.2背景

以方便用户记录日常学习心得,生活体会为目的,进行主题为“随心笔记”的应用开发

2实际开发结果

2.1产品

2.2主要功能和性能

能够查看笔记的目录,记录笔记完成时间。能够改变主题颜色,目录排版方式,拥有简洁的主题。对于涂鸦功能,插入图片,密码锁等功能未能实现。

3开发工作评价

3.1对产品质量的评价

本应用拥有简单实用的功能,能够满足一般用户的需要

3.3对技术方法的评价

开发中使用了软件工程中的增量开发模型,黑盒测试等技术,使开发逐步向前发展

3.4出错原因的分析

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

4经验与教训

通过这次开发,我们体验了开发不易,需要很多人员的合作。开发过程中,必须明确整体目标,不能东一榔头,西一棒槌。另外由于学习时间短,对很多东西都不太了解,还好通过CSDN等一些网站能够找到有益的帮助,感谢那些博客,论坛。

第三篇:android 开发心得

即 使你的应用程序是快速且响应灵敏的,但一些设计仍然会给用户造成问题——与其它应用程序或对话框未事先计划的交互,意外的数据丢失,意料之外的阻塞等等。避免这些问题,有助于理解应用程序运行的上下文和系统的交互过程,而这些又正影响着你的应用程序。简而言之,你应该竭尽全力去开发一个与系统和其它应用程 序流畅交互的应用程序。

一 个常见的流畅问题是,一个应用程序的后台处理——例如,一个 Service或者

BroadcastReceiver——弹出一个对话框来响应一些事件。这可能看起来没啥大碍,尤其是你在模拟器上单独地构建和测试你 的应用程序的时候。然而,当你的应用程序运行在真机上时,有可能你的应用程序在没有获得用户焦点时后台处理显示了一个对话框。因此,可能会出现在活跃的应 用程序后方显示了你的应用程序的对话框,或者从当前应用程序夺取焦点显示了一个对话框,而不管当前用户正在做什么(例如,正在打电话)。那种行为,对应用 程序或用户来说,就不应该出现。

为了避免这些问题,你的应用程序应该使用合适的系统资源来通知用户——Notification类。使用Notification,你的应用程序可以在状态栏显示一个 icon来通知用户已经发生的事情,而不是夺取焦点和打断用户。

另 一个流畅问题的例子是未能正确实现Activity的 onPause()和其它生命周期方法而造成意外丢失了状态或用户数据。又或者,如果你的应用程序想暴露数据给其它应用程序使用,你应该通过 ContentProvider来暴露,而不是(举例)通过一个可读的原始文件或数据库来实现。

这 些例子的共同点是它们都应该与系统和其它应用程序协作好。Android系统设计时,就把应用程序看作是一堆松散耦合的组件,而不是一堆黑盒代码。作为开 发者来说,允许我们把整个系统看作是更大的组件集合。这有益于我们可以与其它应用程序进行清晰无缝的集成,因此,作为回报,我们应该更好的设计我们的代 码。

下面将讨论常见的流畅问题以及如何避免它们:

一 定要记住Android是一个移动平台。可以显而易见地说,其它Activity(例如,“Incoming Phone Call”应用程序)可能会在任何时候弹出来遮盖你的Activity,记住这个事实很重要。因为这个过程将触发 onSaveInstanceState()和 onPause()方法,并可能导致你的应用程序

被杀死。

如 果用户在你的应用程序中正在编辑数据时,其它 Activity出现了,这时,你的应用程序被杀死时可能丢失那些数据。当然了,除非你事先保存了正在进行的工作。“Android方式”是这样做的:能 接收和编辑用户输入的 Android应用程序应该重写 onSaveInstanceState()方法,并以恰当的方式保存它们的状态。当用户重新访问应用程序时,她能得到她的数据。进行这种处理方式最经典的例子是 mail应用程序。如果用户正在输入 email,这时其它 Activity启动了,mail应用程序应该把正在编辑的email以草稿的方式保存起来。

如果你不想穿着内衣在大街上溜达的话,你的数据也不应该这样。尽管可能存在暴露应用程序的某种形式给其它应用程序,但这通常不是最好的主意。暴露原始数据,要求其它应用程序能够理解你的数据的格式;如果你变更了格式,那么,你将破坏那些没有进行同步更新的应用程序。

“Android 方式”是创建一个 ContentProvider,以一种清晰的、深思熟虑的和可维护的API方式暴露你的数据给其它应用程序。使用 ContentProvider,就好像是插入Java接口来分离和组装两片高耦合的代码。这意味着你可以修改数据的内部格式,而不用修改由 ContentProvider暴露的接口,这样,也不会影响其它应用程序。

如果用户正在运行一个应用程序(例如,Phone程序),断定对用户操作的目的才是安全的。这也就是为什么必须避免创建Activity,而是直接在当前的 Activity中响应用户的输入。那 就是说,不要在 BroadcastReceiver或在后台运行的 Service中调用 callActivity()。这么做会中断当前运行的应用程序,并导致用户恼怒。也许更糟糕的是,你的 Activity可能成为“按键强盗”,窃取了用户要提供给前一个 Activity的输入。视乎你的应用程序所做的事情,这可能是个坏消息。

不 选择在后台直接创建 Activity UI,取而代之的是,应该使用NotificationManager来设置 Notification。它们会出现在状态栏,并且用户可以在他空闲的时候点击它们,来查看你的应用程序向他显示了什么。(注意,如果你的 Activity已经在前台了,以上将不适用:这时,对于用户的输入,用户期望的是看到下一个 Activity来响应)

如果你的应用程序需要执行一些昂贵或耗时的计算的话,你应该尽可能地将它挪到线程里。这将阻止向用户显示可怕的“Application Not Responding”对话框,如果不这样做,最终的结果会导致你的应用程序完全终止。

一 般情况下,Activity中的所有代码,包括它的 View,都运行在相同的线程里。在这个线程里,还需要处理UI事件。例如,当用户按下一个按键,一个 key-down事件就会添加到 Activity的主线程队列里。事件处理系统需要很快让这个事件出列并得到处理;如果没有,系统数秒后会认为应用程序已经挂起并为用户提供杀死应用程序 的机会。

如果有耗时的代码,内联在Activity上运行也就是运行在事件处理线程里,这在很大程度上阻塞了事件处理。这会延迟输入处理,并导致ANR对话框。为了避免这个,把你的计算移到线程里。

任 何值得使用的应用程序都可能有几个不同的屏幕。当设计UI屏幕时,请一定要使用多个Activity对象实例。依赖于你的开发背景,你可能理解 Activity类似于 Java Applet,它是你应用程序的入口点。然而,那并不精确:Applet子类是一个 Java Applet的单一入口点,而一个Activity应该看作是你的应用程序多个潜在入口点之一。你的“main”Activity和其它之间的唯一不同点 是“main”Activity正巧是在AndroidManifest.xml文件中唯一对“android.intent.action.MAIN”动作感兴趣的Activity。因此,当设计你的应用程序的时候,把你的应用程序看作是Activity对象的 集合。从长远来看,这会使得你的代码更加方便维护。

当 谈到 UI观感时,巧妙地交融非常重要。用户在使用与自己期望相反的 UI的应用程序时,会产生不愉快的感觉。当设计你的 UI时,你应该尽量避免太多自己的主题。相反的,使用同一个主题。你可以重写或扩展你需要的主题部分,但至少在与其它应用程序相同的 UI基础上开始。

不 同的 Android设备可能支持不同的屏幕分辨率。甚至一些可以自己变更分辨率,例如,切换到风景模式。确保你的布局和图片能足够灵活地在不同的设备屏幕上正 常显示。幸运的是,这很容易做到。简而言之,你需要做的是为主要分辨率提供不同版本的作品,然后为不同的尺寸设计你的布局。(例如,避免使用硬编码位置而 使用相对布局。)如果那样做的话,系统会处理剩下的部分,而且你的应用程序在任何设备上都看起来很棒。

Android设备会有多种网络连接选项。所有的都提供数据访问,但之间肯定有更快的。其中,速度最慢的是GPRS,GSM网络的非 3G数据服务。即使具备 3G能力的设备在非3G的网络上也会花费很多的时间,所以,网络很慢仍然是一个长期存在的事实。

这 就是为什么你应该按照最小化的网络访问和带宽来编写你的代码。你不能假设网络是快速的,所以,你应该总是计划它是慢的。如果你的用户碰巧在一个快速的网络 上,那很好——他们的用户体验会提升。你要避免相反的情形:在不同的地点和不同时间,应用程序有时可用,有时慢得令人抓狂,这样的程序可能不会受欢迎。

还 有一个潜在的地方是,如果你正在使用模拟器,那么你很容易受它迷糊,因为模拟器使用电脑的网络连接。这比手机网络快很多,所以,你需要修改模拟器设定来模 拟较低的网络速度。你可以在 Eclipse中做到这点,在启动选项的模拟器设置页里设置或者在启动模拟器时通过命令行选项设置。

Android 可以支持多种外观形状。也就是说,一些Android设备拥有全“QWERTY”键盘,而其它可能会有40键、12键或其它键盘设置。同样的,一些设备可 能有触摸屏,但一些也会没有。当创建你的应用程序的时候,记住这一点。不要假定特定的键盘布局——除非你真的想限定你的应用程序只运行在某些设备上。

如 果移动设备经常插在墙上,那么,它也就不是很“移动”。移动设备是电池供电的,如果我们能让每次充电的电池使用得更持久一些,那么每个人都会更加开心—— 尤其是用户。

其中两大耗电硬件是处理器和无线;这也就是我们为什么要写尽可能少做工作、尽可能少去使用网络的应用程序的重要原因。

如 何让你的应用程序最小化的占用处理器,归根结底还是要写高效代码。为了减少无线的电量消耗,确保对错误条件进行正确的处理,并只获取你要的东西。例如,如 果某一个网络操作失败了,不要不断地进行重试。如果失败了一次,有可能是用户不受欢迎,因此,如果你再以正确的方式操作,有可能还会失败;所有你做的都是 在浪费电池。

用户是相当聪明的:如果你的程序高耗电,他们是一定会发现的。到那个时点,你唯一可以确定的是,你的程序将很快被卸载掉。

第四篇:Android总结

Android四大组件:

Activity—表现屏幕界面

Service—后台服务

BroadcastReceiver—实现广播机制

ContentProvider—实现数据存储

Intent类:用来启动程序并传递信息的类

用于Activity、Receiver、Service之间进行交互的类,通过无参构造方法创建对象,增加其action、category、data、extra等属性进行信息传递,并通过Activity中的startActivity(Intent intent)进行界面的跳转;通过Context中的StartService(Intent intent)进行服务跳转;通过Context中的registerReceive(Intent intent)对广播进行注册,并通过sendBroadcast()进行无序消息发送,或可以通过SendOrderedBroadcast()进行有序的消息发送。Handler类:

用来发送和处理消息,并配合主线程完成UI的更新;消息Message/Runnable传递通过MessageQueue(消息队列,先进先出)进行传递,并通过Lopper进行接收,传递的消息可以为Message对象,也可以是Runnable对象;接收方法通过HandleMessage(Message msg)进行获取。SharedPreferences类:

一般用于第一次登录时的设置,或者是各个界面的一些小型格式设置,如字体等。是本地的小型共享数据库,可以通过Context的静态方法getSharedPreferences获得其对象,对象内的值均为键值对进行储存。通过SharedPreferences对象调用editor()获取SharedPreferences.Editor对象,向共享数据库中增加数据,putString(),并提交数据,commit();通过SharedPreferences对象获取共享数据库中的数据,getString()。

ViewPager:实现界面滑动的类;

通过设置OnPagerChangedListener设置ViewPager的监听事件;

实现流程:

①布局文件中设置ViewPager控件;

②代码中进行绑定控件;

③通过继承PagerAdapter抽象类进行设置适配器,并传递数据源;

④适配器中实现两个抽象方法,两个重写方法:getCount()—获取滑动界面的数量,isViewFromObject()—判断视图是否是来自于Object文件中;重写两个方法,分别为destoryItem—销毁指定位置的视图;InstantiateItem(),设置指定位置的视图;

Timer与TimerTask类:

Timer为计时器的类,通过无参构造方法可以获取对象,通过Timer.schedule(TimerTask task,long time)进行设置多久后执行某任务,当任务执行完后,取消计时的功能,Timer.cancle();TimerTask类为抽象类,实例化时,必须重写run方法;执行的内容,均在run方法中进行设置,并且执行时,已在子线程中进行执行。自定义View:用到的类有Paint、Canvas、Spec、SpecF、Path、View.MeasureSpec、Timer、TimerTask;

抽象类,通过子类继承,获取对象;在布局文件中绑定后,通过代码,设置自定义View的属性;自定义View中,通过重写OnMeasure方法,对布局文件中的尺寸进行测量,并由View中的setMeasureDimenson()方法,进行数据的保存;通过重写Ondraw方法,进行绘图;当需要绘制动态图形时,使用计时器Timer的schedule(TimerTask,long time,delay time2)方法,在time时间后,每隔time2时间,重写执行run方法中的内容;将耗时的操作设置在run方法中,并通过View中的invalidate()方法刷新主线程中的绘的图形,通过postInvalidate()刷新子线程中的图形。数据库:

常用的数据库有Oracle,需要安装和配置的大型收费数据库;MySQL是中型数据库,同样需要安装配置,但不需要收费;Sqlite是小型免费的嵌入式数据库,占用内存低,最新版本为3.0。Sqlite数据库需要通过SqliteDatabaseOpenHelper进行创建数据库,并通过SqliteDatabase进行数据库的操作。辅助类是抽象类,通过继承,重写两个方法,并在子类的构造方法中通过OpenHelper的构造方法(Context context,String SqlName,SqliteDatabase.CursorFactory factory,int version)进行数据库的创建,在onCreate方法中,进行数据库表的创建,在onUpdate中进行数据库的版本更新。在数据库的操作类中,执行exect方法,通过sql语句对数据库进行操作。Create table student(_id integer primary key auto increament ,name text);insert into student(_id,name)values(1,zx);delete from student where _id=1;update student set _id=2 where name=zx;select *from student;ListView、GridView适配器的优化:

将布局文件中的控件进行封装,当视图加载时,判断可变视图是否存在,当不存在时,通过布局文件获取视图,并新建封装类,将地址通过setTag()进行发送;当视图存在时,重复利用地址—getTag()。反射:

存储数据的方式:

共享数据库、数据库、文件、网络、内容提供者

广播:

广播传播时,需要接收者、发送者、广播频道;根据发送者的发送方式不同,分为有序广播、无序广播;有序广播为接收者有接收顺序,根据设置的优先级不同,确定先后顺序,接收者同时也是发送者,向后面的广播发送消息,发送过程中,可以添加信息,也可以停止广播的传输;无序广播,接收者之间无联系,均从发送者处接收信息;广播在传输过程中,不能被添加信息,也不可能被停止。广播在发送前,需要对接收者进行注册,注册方式有两种,动态注册、静态注册。动态注册,是在代码中进行,通过Context对象调用静态方法进行注册,所有的广播均可以用动态注册,其生命周期依赖于应用,相对于静态注册,比较节省内存;静态方法在清单文件中进行注册,部分系统广播不能通过静态注册进行,其生命周期依赖于系统,当系统启动,即运行接收广播,较耗内存。广播接收者需要继承BroadcastReceiver,并实现抽象方法onReceive(),通过回调接口,进行数据的传输。注意:广播发送前,必须进行接收者的注册,并且,当显示跳转时,不需要意图过滤器。安卓布局:九种布局

线性布局,水平或垂直方向两种格式,主要特点为权重,即规定各控件在视图中的占有的比例;

相对布局,相对于父控件或兄弟控件的布局,各控件需指定相对位置; 绝对布局,指定各控件在视图中的绝对位置,几乎不再使用; 表格布局,子布局放在行中,列由控件表示(TableRow); 帧布局:覆盖前面布局的布局,一般用于暂停按钮等; 风格布局:可以跨行、跨列的布局,占满换行;

左右侧滑:可以实现左右侧滑,通过设置主菜单和二级菜单设置左右两个菜单; 下拉刷新:设置下拉刷新、上拉加载的功能; 抽屉布局;

安卓版本及对应的API:

1.6—4;2—7;3—11;4—15;4.3—18;5—20;5.1—21;6—23;7—25; 安卓四层架构:

应用层:Java语言开发,主要从事App开发;

运行库层:Java语言与C语言,View视图、管理类等的开发; 架构层:C语言与Linux语言,各种框架、浏览器等; 内核层:Linux、C语言,开发各种驱动; 安卓四大组件:

Activity:界面,实现程序与用户之间的交换,有自己的生命周期,七个生命周期;4种启动模式 Service:

BroadcastReceive:三要素,发送者、接收者、发送频道(Intent);类型:有序(接收有序,有数据传送,可以拦截数据)、无序广播(相对);注册方式:静态注册,持久监听,占用内存比较高生命周期跟随系统,动态注册(代码中),所有广播都可以动态注册,部分系统广播不能动态注册,临时监听,占用内存较少,生命周期随应用进行;

ContentProvide:不能存放数据,五种存放数据方式之一,特点为:①为数据的获取等操作添加一个统一的接口②可以实现跨应用访问数据;③可以实现Android中通讯录、消息、音频、视频等的访问或操作;通过ContentReceive进行数据的访问,可以对数据进行增删改查操作。

动画: IO流: 序列化: AlertDialog:

Set实现类: 手机电量检测:

自定义SurfaceView:

自定义View:三个构造方法的区别

Message:Handler.obtain/new/Message.obtain

HttpUriConnection访问网络

gride 异步任务 动画

抽象类和接口 反射 克隆 序列化 侧滑的实现 数据库 Socket:

Gson解析

异步任务和子线程区别 WebView 版本更新 照片的圆角化

Collection与Collections Sql语句

MVP框架与MVC: TCP与UDP的区别: 一键分享的流程: Http协议的理解: 不使用框架访问网络: List集合与set集合: 自定义View的流程: 线性布局的特点: ViewPager的原理: 服务的启动方式:

Activity的启动方式: Xml数据解析:

第五篇: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 源代码 网址:

https://www.xiexiebang.com1312 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.xiexiebang.com/wiki/QAEP#Branch_Releases https://www.xiexiebang.com/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课件word格式文档
下载Android开发基本知识总结-Android课件.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    Android开发优势总结(推荐五篇)

    Android开发优势总结 来源:扣丁学堂 目前市场上的移动端有两种形式,一种是Android开发,另一种是ios开发,其中Android开发方面的人员要多一些,今天我们就一起来看一下扣丁学堂Andr......

    android开发实习报告总结

    Android开发实习总结 有一名话叫做:不经过风雨,怎么见彩虹?我想改一下:不真正进入社会,怎能了解社会呢? 在这次实习中,给我收获最大的是我觉得很多工作需要我去摸索和探讨,要不怕吃......

    Android开发Info类总结

    Android开发Info类总结首先我们来看一下PackageItemInfo,它是包含了一些信息的基类,它的直接子类有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupI......

    Android应用程序开发-个人总结(最终定稿)

    《Android应用开发》个人总结报告 一、 项目简介: 送祝福App是一款逢年过节为方便发送祝福信息的软件,并且介绍各种节日的相关情况。包含节日祝福短信,支持直接发送短信给好友......

    Android开发分享讲稿(修改)

    讲清楚,do better Android开发入门分享 今天要给大家分享的是Android开发入门,小青青_Lo是我的微博昵称,如果觉得我讲得好,求互粉(*^__^*) 嘻嘻~~ 讲解大纲 这个是今天讲解的大......

    Android 嵌入式开发心得体会

    Android 嵌入式开发心得体会 刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发......

    Android蓝牙开发小结

    学习之前先了解两个基本概念: 一、RFCOMM协议: 一个基于欧洲电信标准协会ETSI07.10规程的串行线性仿真协议。此协议提供RS232控制和状态信号,如基带上的损坏,CTS以及数据信号......

    android教程JNI开发疑点总结

    android教程JNI开发疑点总结 很多Android新手对于JNI开发过程中的疑问不是很清楚,根据android123@163.com邮箱中反馈的内容我们整理如下: 1. JNI中,什么情况才处理jstring、ji......