基于android源码_Android源码编译

hacker|
133

文章目录:

android源码 android系统源码 到底有什么区别

sdk只是开发工具包,这个就是我们用到的api的源码。但是,这个sdk源码为何能跑得起来?它也是依赖完整的android系统的。android系统源码是基于linux内核上的一套解决方案,针对ARM平台的做的各种适合嵌入式设备的一套代码。举个例子,你如果在windows上编程,用到它的系统api,这些api存在于一些dll中,这个dll就是你的开发所需的东东,类似android sdk,而这个dll之所以能跑起来,完全也是依赖windows系统的,windows系统源码有几千万行代码,android系统源码也不会少。

android源码里有哪些比较好的算法或框架推荐

Android中对于图形界面以及多媒体的相关操作比较容易实现。而且对于大多数

手机

用户来说,他们主要也就是根据这些方面的功能来对系统那个进行修改。我们可以通过本文介绍的Android多媒体框架的源码解读,来具体分析一下这方面的基本知识。

Android多媒体框架的代码在以下目录中:external/opencore/。这个目录是Android多媒体框架的根目录,其中包含的子目录如下所示:

* android:这里面是一个上层的库,它基于PVPlayer和PVAuthor的SDK实现了一个为Android使用的Player和Author。

* baselibs:包含数据结构和线程安全等内容的底层库

* codecs_v2:这是一个内容较多的库,主要包含编解码的实现,以及一个OpenMAX的实现

* engines:包含PVPlayer和PVAuthor引擎的实现

* extern_libs_v2:包含了khronos的OpenMAX的头文件

* fileformats:文件格式的据具体解析(parser)类

* nodes:编解码和文件解析的各个node类。

* oscl:操作系统兼容库

* pvmi: 输入输出控制的抽象接口

* protocols:主要是与网络相关的RTSP、RTP、HTTP等协议的相关内容

* pvcommon:pvcommon库文件的Android.mk文件,没有源文件。

* pvplayer:pvplayer库文件的Android.mk文件,没有源文件。

* pvauthor:pvauthor库文件的Android.mk文件,没有源文件。

* tools_v2:编译工具以及一些可注册的模块。

Splitter的定义与初始化

以wav的splitter为例,在fileformats目录下有解析wav文件格式的pvwavfileparser.cpp文件,在nodes目录下有pvmf_wavffparser_factory.cpp,pvmf_wavffparser_node.h, pvmf_wavffparser_port.h等文件。

我们由底往上看,vwavfileparser.cpp中的PV_Wav_Parser类有InitWavParser(),GetPCMData(),RetrieveFileInfo()等解析wav格式的成员函数,此类应该就是最终的解析类。我们搜索PV_Wav_Parser类被用到的地方可知,在PVMFWAVFFParserNode类中有PV_Wav_Parser的一个指针成员变量。

再搜索可知,PVMFWAVFFParserNode类是通过PVMFWAVFFParserNodeFactory的CreatePVMFWAVFFParserNode()成员函数生成的。而CreatePVMFWAVFFParserNode()函数是在PVPlayerNodeRegistry::PVPlayerNodeRegistry()类构造函数中通过PVPlayerNodeInfo类被注册到Oscl_VectorPVPlayerNodeInfo, OsclMemAllocator 的vector中,在这个构造函数中,AMR,mp3等node也是同样被注册的。

由上可知,Android多媒体框架中对splitter的管理也是与ffmpeg等类似,都是在框架的初始化时注册的,只不过Opencore注册的是每个splitter的factory函数。

综述一下splitter的定义与初始化过程:

每个splitter都在fileformats目录下有个对应的子目录,其下有各自的解析类。

每个splitter都在nodes目录下有关对应的子目录,其下有各自的统一接口的node类和node factory类。

播放引擎PVPlayerEngine类中有PVPlayerNodeRegistry iPlayerNodeRegistry成员变量。

在PVPlayerNodeRegistry的构造函数中,将 AMR, AAC, MP3等splitter的输入与输出类型标示和node factory类中的create node与release delete接口通过PVPlayerNodeInfo类push到Oscl_VectorPVPlayerNodeInfo, OsclMemAllocator iType成员变量中。

当前Splitter的匹配过程

PVMFStatus PVPlayerNodeRegistry::QueryRegistry(PVMFFormatType aInputType, PVMFFormatType aOutputType, Oscl_VectorPVUuid, OsclMemAllocator aUuids)函数的功能是根据输入类型和输出类型,在已注册的node vector中寻找是否有匹配的node,有的话传回其唯一识别标识PVUuid。

从QueryRegistry这个函数至底向上搜索可得到,在android中splitter的匹配过程如下:

android_media_MediaPlayer.cpp之中定义了一个JNINativeMethod(JAVA本地调用方法)类型的数组gMethods,供java代码中调用MultiPlayer类的setDataSource成员函数时找到对应的c++函数

1.{"setDataSource", "(Ljava/lang/String;)V", (void *)

android_media_MediaPlayer_setDataSource},

2.static void android_media_MediaPlayer_setDataSource

(JNIEnv *env, jobject thiz, jstring path)

此函数中先得到当前的MediaPlayer实例,然后调用其setDataSource函数,传入路径

3.status_t MediaPlayer::setDataSource(const char *url)

此函数通过调getMediaPlayerService()先得到当前的MediaPlayerService, const spIMediaPlayerService service(getMediaPlayerService());

然后新建一个IMediaPlayer变量, spIMediaPlayer player(service-create(getpid(), this, fd, offset, length));

在spIMediaPlayer MediaPlayerService::create(pid_t pid, const spIMediaPlayerClient client, const char* url)中

调status_t MediaPlayerService::Client::setDataSource(const char *url)函数,Client是MediaPlayerService的一个内部类。

在MediaPlayerService::Client::setDataSource中,调spMediaPlayerBase MediaPlayerService::Client::createPlayer(player_type playerType)

生成一个继承自MediaPlayerBase的PVPlayer实例。

基于Android音乐播放器源代码(正常播放、有列表)

package my.android.players;

import java.io.File;

import java.io.FilenameFilter;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageButton;

import android.widget.TextView;

public class mainActivity extends Activity {

private ListString myMusicList=new ArrayListString();

//当前播放歌曲的索引

private int currentListItem=0;

//音乐的路径

private static final String MUSIC_PATH="/sdcard/mp3";

//播放对象

private MediaPlayer myMediaPlayer;

private TextView m_TextView;

//播放按钮

private ImageButton m_start;

private ImageButton m_stop;

private ImageButton m_next;

private ImageButton m_last;

/*设定bIsPaused一开始为false */

private boolean bIsRun = false;

private boolean isplay;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.main2);

myMediaPlayer=new MediaPlayer();

musicList();

m_TextView=(TextView)findViewById(R.id.mtextview);

m_start=(ImageButton)findViewById(R.id.imgbtn_start);

m_stop=(ImageButton)findViewById(R.id.imgbtn_stop);

m_next=(ImageButton)findViewById(R.id.imgbtn_next);

m_last=(ImageButton)findViewById(R.id.imgbtn_last);

listener();

Intent intent = this.getIntent();

Bundle bundle = intent.getExtras();

currentListItem = bundle.getInt("currentListItem");

isplay=bundle.getBoolean("isplay");

if(isplay==true)

{

bIsRun=false;

playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));

}

}

//监听事件

void listener(){

//开始

m_start.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

try

{

if(myMediaPlayer.isPlaying()==true)

{

myMediaPlayer.pause();

m_start.setImageResource(R.drawable.pause);

}

else

{

playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));

}

}

catch (IllegalStateException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

//下一首

m_next.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

nextMusic();

}

});

//上一首

m_last.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

lastMusic();

}

});

//停止

m_stop.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

stopMusic();

}

});

myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

// TODO Auto-generated method stub

nextMusic();

}

});

}

//播放音乐

void playMusic(String path){

try {

if(bIsRun==false)

{

myMediaPlayer.reset();

myMediaPlayer.setDataSource(path);

myMediaPlayer.prepare();

myMediaPlayer.start();

/*

* 取出歌曲名的.mp3后缀

* */

String str=(myMusicList.get(currentListItem)).toString();

System.out.println(str);

String str1[]=str.split("\\.");

System.out.println(str1[0]);

m_TextView.setText(str1[0]);

}

else

{

myMediaPlayer.start();

}

m_start.setImageResource(R.drawable.start);

bIsRun=true;

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

}

//下一首

void nextMusic(){

if(++currentListItem=myMusicList.size()){

currentListItem=0;

}

bIsRun=false;

playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));

}

//上一首

void lastMusic(){

if(--currentListItem0)

currentListItem=myMusicList.size()-1;

bIsRun=false;

playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));

}

//停止

void stopMusic() {

if (myMediaPlayer.isPlaying()) {

m_start.setImageResource(R.drawable.pause);

myMediaPlayer.stop();// 停止

bIsRun=false;

}

else

playMusic(MUSIC_PATH+"/"+myMusicList.get(currentListItem));

}

//当用户返回时结束音乐并释放音乐对象

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// TODO Auto-generated method stub

if(keyCode==KeyEvent.KEYCODE_BACK){

new AlertDialog.Builder(mainActivity.this).setTitle("message")

.setIcon(android.R.drawable.dialog_frame)

.setMessage("你确定要离开吗?")

.setPositiveButton("确定",new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

myMediaPlayer.stop();

myMediaPlayer.release();

finish();

}

}).setNegativeButton("取消",new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

}

}).show();

}

return super.onKeyDown(keyCode, event);

}

/**

* 文件过滤器

*

* @author

*

*/

class MusicFilter implements FilenameFilter {

@Override

public boolean accept(File dir, String filename) {

return (filename.endsWith(".mp3"));

}

}

//绑定音乐

void musicList(){

try{

File home=new File(MUSIC_PATH);

if(!home.exists())

home.mkdirs();

if(home.listFiles(new MusicFilter()).length=0){

for(File file:home.listFiles(new MusicFilter())){

myMusicList.add(file.getName().toString());

}

}

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

}

package my.android.players;

import java.io.File;

import java.io.FilenameFilter;

import java.util.ArrayList;

import java.util.List;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class Activity01 extends Activity {

//播放列表

private ListString myMusicList=new ArrayListString();

//当前播放歌曲的索引

private int currentListItem;

//音乐的路径

private static final String MUSIC_PATH="/sdcard/mp3";

//播放列表

private ListView m_ListView;

private boolean isplay=true;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

m_ListView=(ListView)findViewById(R.id.lv_music);

musicList();

//当选择列表项时播放音乐

m_ListView.setOnItemClickListener(new ListView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView? arg0, View arg1, int arg2,

long arg3) {

currentListItem = arg2;

Intent intent = new Intent();

Bundle mBundle=new Bundle();

mBundle.putInt("currentListItem", currentListItem);

mBundle.putBoolean("isplay", isplay);

intent.putExtras(mBundle);

intent.setClass(Activity01.this,mainActivity.class);

startActivity(intent);

finish();

}

});

}

/**

* 文件过滤器

*

* @author

*

*/

class MusicFilter implements FilenameFilter {

@Override

public boolean accept(File dir, String filename) {

return (filename.endsWith(".mp3"));

}

}

//绑定音乐

void musicList(){

try{

File home=new File(MUSIC_PATH);

if(!home.exists())

home.mkdirs();

if(home.listFiles(new MusicFilter()).length=0){

for(File file:home.listFiles(new MusicFilter())){

myMusicList.add(file.getName().toString());

}

ArrayAdapterString musicList=new ArrayAdapterString

(Activity01.this,android.R.layout.simple_list_item_1, myMusicList);

m_ListView.setAdapter(musicList);

}

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

}

基于android的内核与系统架构源码分析怎么样

如今,大家面对市场中种类繁多的手机必然挑的眼花缭乱。不过,在智能手机占据主要地位的今天,挑选手机的主要因素就是挑选一款性能高的手机操作系统,Android就是其中的一个必然选择。Android系统架构和其操作系统一样,采用了分层的架构。Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。Android系统架构之应用程序Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。Android系统架构之应用程序框架开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。隐藏在每个应用后面的是一系列的服务和系统, 其中包括;* 丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。* 内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据* 资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件( layout files )。* 通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。* 活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。有关更多的细节和怎样从头写一个应用程序,请参考 如何编写一个 Android 应用程序.Android系统架构之系统运行库1)程序库Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:* 系统 C 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。* 媒体库 - 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。* Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。* LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。* SGL - 底层的2D图形引擎* 3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。* FreeType -位图(bitmap)和矢量(vector)字体显示。* SQLite - 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。2)Android 运行库Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。Android系统架构之Linux 内核Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。

android系统源码有多少行

大概有10G的源代码,一Byte一个字符,也就是说有超过100亿个字符,每行按标准80字符来算的话,超过1亿行。开放的WinXP系统有2亿行,从数量级上来看的话,应该差不多。Android 4.4,是由Google公司制作和研发的代号为KitKat的手机操作系统,于北京时间2013年9月4日凌晨对外公布了该Android新版本的名称,为Android 4.4(代号 KitKat 奇巧)。据悉,该代号来自雀巢的KitKat巧克力。"Kit Kat"原本是雀巢公司的一款巧克力名称。谷歌表示,他们非常感谢雀巢授权使用该名称,但使用的时候会将中间的空格去掉。Android 4.4 KitKat针对RAM占用进行了优化,甚至可以在一些仅有512MB RAM的老款手机上流畅运行。它也进一步优化了系统在低配硬件上的运行效果, 支持内核同页合并 KSM,zRAM 交换,似乎是为了更好地在众多智能穿戴设备上运行。

是指sdk的源码,还是android操作系统的源码,不过都有10G左右,另外sdk的源码是用git管理的,一次下载后,用git check就可以切换到各个版本。Android SDK是用于开发Android上JAVA应用程序的,另外发布Android NDK,可以添加一些C语言写的链接库,至于Linux代码,可以在Android源代码中找到(SDK程序中只有编译好的测试映像)。应用程序开发用不到Linux代码(搞嵌入式开发才会用到,而SDK不负责底层开发)。

如何获取android源代码

当前的Android 代码托管在两个方:  和  之前在 android.git.kernel.org 上也有托管,不过现在重定向到了  好在都支持git访问。

google 提供的 repo 工具实际上是一个内部操作git工具来简化操作Android源码的Python脚本。经过尝试,直接使用git 工具在ubuntu 下可以实现clone Android 源码。下面介绍一下方法:

1. 获取当前的在github 上托管的Android git repositories:

github页面为:  。不过这个页面不支持通过 wget "" 或者 curl "" 的方式访问, 错误信息如下:

这样一来,获取这个页面内容并解析出其中的git repositories就需要手工完成了。好在方法也很简单: 浏览器中打开这个页面,然后"查看源文件"并保存为文本文件,比如保存为"android_git.html"。最后,通过下面的一行脚本来取出 Android git repositories.

grep -o "span class=\"repo\".*/span" ./android_git.html | cut -d "" -f2 | cut -d "" -f1  android_git.txt

2. 基于第1步获取的Android git repositories 来生成clone git的脚本:

执行如下的一行awk脚本

awk 'BEGIN{i=1; print "#!/usr/bin/env bash" }{ print "\n\necho \"begin clone android git ["i"]: " $1 "\""; print "git clone 

" $1 ".git"; print "echo \"finish clone android git ["i"]: " $1 "\"" ; i=i+1; }' ./android_git.txt  

git_clone_android.sh

现在用于clone android git的脚本生成好了,一共有 103 个 git repository.

3. 执行git_clone_android.sh这个脚本即可。

整体Android 源码的代码量是相当庞大,完成所有的clone 任务后,大概占用了 7G 磁盘空间,历时20多个小时,这是在网速比较快的情况下达到的效果:

其间也有许多问题,比如多次出现如下的错误:

这个时候需能做的只能是"try again"了。

需要说明的是"不要试图同时并发执行多个git clone 命令",这样会导致大量出现上面贴图中的错误,另外,整个clone过程中耗时最多的git repository 如下:

kernel_common.git kernel_msm.git platform_frameworks_base.git platform_prebuilt.git 其中 platform_prebuilt.git 是google 提供的预编译好的二进制文件,包含: 各种库文件,jar 包,可执行程序等等,如果只是阅读Android 源代码,这个git repository 可以不用clone.

5条大神的评论

  • avatar
    访客 2022-07-06 上午 11:36:28

    ndroid系统源码有多少行6、如何获取android源代码android源码 android系统源码 到底有什么区别sdk只是开发工具包,这个就是我们用到的api的源码。但是,这个sdk源码为何能跑得起来?它也是依赖完整的android系

  • avatar
    访客 2022-07-06 上午 01:44:55

    port android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import and

  • avatar
    访客 2022-07-06 上午 07:49:15

    当前播放歌曲的索引 private int currentListItem; //音乐的路径 private static final String MUSIC_P

  • avatar
    访客 2022-07-06 上午 06:31:07

    roid.git.kernel.org 上也有托管,不过现在重定向到了  好在都支持git访问。google 提供的 repo 工具实际上是一个内部操作git工具来简化操作Android源码的Python脚本

  • avatar
    访客 2022-07-06 上午 04:58:46

    ; } } //下一首 void nextMusic(){ if(++currentListItem=myMusicList.size()){ currentListItem=0; } bIsRun=false; playMusic(MUSIC_

发表评论