最近一直想学习多媒体,作为初学者,只能慢慢分析android 源码。这里我会从Music播放器入手开始一步一步分析。
Music.apk的代码所在目录为packages/apps/Music/
首先看一下Android.mk文件(Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等)
<span style="font-family:Times New Roman;">
1LOCAL_PATH:= $(call my-dir) /*用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径*/
2include $(CLEAR_VARS) /*清除一些变量的值,但是LOCAL_PATH除外*/
3
4LOCAL_MODULE_TAGS := optional /*模块在所有版本eng、user和tests下都编译*/
5
6LOCAL_SRC_FILES := $(call all-java-files-under, src) \ /*编译的源文件,src目录下的所有java文件和指定aidl文件*/
7 src/com/android/music/IMediaPlaybackService.aidl
8
9LOCAL_PACKAGE_NAME := Music /*编译成的包名,即apk文件名*/
10
11LOCAL_PROGUARD_FLAG_FILES := proguard.flags
12
13include $(BUILD_PACKAGE) /*编译成应用包*/
14
15# Use the folloing include to make our test apk.
16include $(call all-makefiles-under,$(LOCAL_PATH)) /* 编译当前路径下的所有.mk文件*/
</span>
这里特别说明下LOCAL_PROGUARD_FLAG_FILES
Java的字节码一般是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。proguard在Android中的几种使用方法:
(1).指定不需要混淆的native方法与变量的proguard.flags文件
如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
(2). 制定编译的工程,不要使用代码混淆的工具进行代码混淆
如:LOCAL_PROGUARD_ENABLED := disabled
接下来分析AndroidManifest.xml文件
39 <activity android:name="com.android.music.MusicBrowserActivity" /*主控制界面*/
40 android:theme="@android:style/Theme.NoTitleBar"
41 android:exported="true"
42 >
43 <intent-filter>
44 <action android:name="android.intent.action.MAIN" /> /*Music应用的入口*/
45 <action android:name="android.intent.action.MUSIC_PLAYER" />
46 <category android:name="android.intent.category.DEFAULT" />
47 <category android:name="android.intent.category.LAUNCHER" />
48 <category android:name="android.intent.category.APP_MUSIC" />
49 </intent-filter>
50 </activity>
接下来简单介绍下AndroidManifest.xml文件中的几种比较重要的组件,后面分析java代码时再详细介绍。
TrackBrowserActivity.java 音乐列表界面
PlaylistBrowserActivity.java 播放列表界面
AlbumBrowserActivity.java 专辑浏览界面
ArtistAlbumBrowserActivity.java 艺术家浏览界面
上面这几个都是关于列表显示UI界面。下面两个是音乐播放器较为重要的两个组件:
MediaPlayerbackActivity.java 音乐播放界面
MediaPlaybackService.java 音乐播放器服务
另外还有一些以对话框形式呈现出来的UI界面显示组件:
RenamePlaylist.java 重命名播放列表界面
CreatePlaylist.java 新建播放列表界面
DeleteItems.java 删除提示框界面
ScanningProgress.java 音乐描扫进度显示界面
剩下的比较重要的就是
MediaAppWidgetProvider.java Widget实现类
MusicPicker.java 音乐选择界面,这是给其它应用程序调用的界面。
MusicUtils.java 播放器公共方法类