Android 移植技术
Android 移植技術移植技術
Android Porting Highlights
Text
陳俊宏(Jollen Chen)
Asia-Pacific 1st Android Technology Conference
May 15 16 Beijing Shanghai ChinaMay 15-16, Beijing-Shanghai, China
• Android Background
• Android Porting Highlightsg g g
Android 里程碑
System Im...
Android 移植技術移植技術
Android Porting Highlights
Text
陳俊宏(Jollen Chen)
Asia-Pacific 1st Android Technology Conference
May 15 16 Beijing Shanghai ChinaMay 15-16, Beijing-Shanghai, China
• Android Background
• Android Porting Highlightsg g g
Android 里程碑
System Image API Level Release
d o d 里程碑
y g
Android 1.5 3 2009.4.27
Android 1.1 2 2009.2.10
Android 1.0 1 2008.9.23
2007.11.5: Android 首度現身
2007.11.12: Adnroid SDK (early look version)開放下載
2008 1 3 Ad id D l Ch ll 比賽開始2008.1.3: Adnroid Developer Challenge 比賽開始
2008.2.13: Android SDK m5-rc15 釋出
2008.5.12: Top 50 Android Application 公佈
DevicesDevices
misc...
Netbook
x86
Phone
ARMv4/v5
Cupcake 重要的新功能
MMS夾檔
W bVi 開始支援 T h
Cupca e 重要的新功能
WebView 開始支援 Touch events
WebView 支援 SquirrelFish (JavaScript engine)
加入了 IME加入了 IME
Basic x86 support
SIM Application Toolkit 1.0SIM Application Toolkit 1.0
...
Android porting 社群
Android / x86 的移植d o d / 86 的移植
android git kernel organdroid.git.kernel.org
1. Cupcake 正式加入 x86 ports
2 於 / repo/manifest xml 加入2. 於./.repo/manifest.xml 加入
eee_701 platform 取得完整 x86 ports
Android / armv4 的移植d o d / a 的移植
git koolu orggit.koolu.org
主要的 4 移植可由 K l 取得主要的 armv4 移植可由 Koolu 取得
支援 s3c2410 / s3c244x
相容於 Neo FreeRunner
Android x86 port (target product = EeePC
701)
1. Get Google Android
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
701)
$ repo sync
2. Manifest file.
...
/ if t...
3. Get EeePC platform.
$ repo s nc$ repo sync
4. Build Android image.
$ TARGET ARCH=x86 TARGET PRODUCT=eee 701$ TARGET_ARCH=x86 TARGET_PRODUCT=eee_701
DISABLE_DEXPREOPT=true make -j2 installer_img
5 Create USB boot stick5. Create USB boot stick.
Use make-live script. https://review.source.android.com/Gerrit#change,6475
Build EeePC 701 Product Tips # Google API
issueissue
$(call inherit-product,
$(SRC_TARGET_DIR)/product/generic.mk)PRODUCT_NAME :=
eee_701PRODUCT_DEVICE := eee_701PRODUCT_POLICY :=
O C O O S \android.policy_midPRODUCT_PROPERTY_OVERRIDES += \
ro.com.android.dataroaming=true
Cupcake 將 Google APIs 放到 add-onsCupcake 將 Google APIs 放到 add ons
Build EeePC 701 Product Tips # e2fsprogs
issueissue
external/e2fsprogs/Android.mk:
--- a/Android.mk
+++ b/Android mk+++ b/Android.mk
@@ -1,3 +1,3 @@
ifneq ($(TARGET_SIMULATOR),true)-# include $(call all-subdir-
makefiles)makefiles)
+ include $(call all-subdir-makefiles)endif
$ mkdir koolu-android
$ cd koolu-android
$ repo init u git://git koolu org/freerunner/platform/manifest git b koolu 1 0$$ repo init -u git://git.koolu.org/freerunner/platform/manifest.git -b koolu-1.0$
repo sync
• Android Background
• Android Porting Highlightsg g g
Android 移植重要項目d o d 移植重要項目
Build system (toolchain).
Dalvik::JNI
Dalvik::Interpreter
Bionico c
System call
Android BuildAndroid Build
System
G O C GSGLOBAL CFLAGS
$(combo_target)GLOBAL_CFLAGS += \ -
march=armv5te -mtune=xscale \ -msoft-float -fpic
$(combo_target)GLOBAL_CFLAGS += \ -
march=armv5te -mtune=xscale \ -msoft-float -fpic
\ -mthumb-interwork \ -ffunction-
sections \ -funwind-tables \ -fstack-
protector \ -fno-short-enums \ -
\ -mthumb-interwork \ -ffunction-
sections \ -funwind-tables \ -fstack-
protector \ -fno-short-enums \ -p
D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ \ -
D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
include $(call select android config h linux arm)
p
D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ \ -
D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
include $(call select android config h linux arm)-include $(call select-android-config-h,linux-arm)-include $(call select-android-config-h,linux-arm)
G O C GS fGLOBAL CFLAGS for ARMv4
$(combo_target)GLOBAL_CFLAGS += \ -
march=armv4t -mcpu=arm920t -mtune=xscale \ -
$(combo_target)GLOBAL_CFLAGS += \ -
march=armv4t -mcpu=arm920t -mtune=xscale \ -
msoft-float -fpic \ -mthumb-interwork \
-ffunction-sections \ -funwind-tables \
-fstack-protector \ -fno-short-enums \
msoft-float -fpic \ -mthumb-interwork \
-ffunction-sections \ -funwind-tables \
-fstack-protector \ -fno-short-enums \p
-D__ARM_ARCH_4__ -D__ARM_ARCH_4T__ \ -
D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
include $(call select android config h linux arm)
p
-D__ARM_ARCH_4__ -D__ARM_ARCH_4T__ \ -
D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
include $(call select android config h linux arm)-include $(call select-android-config-h,linux-arm)-include $(call select-android-config-h,linux-arm)
JNI Porting
DalvikDalvik
Interpreter
Bionic
Small and custom C library for the Android platform.
A i l t f BSD C libA mainly port of BSD C library.
Its own small implementation of pthreads based on Linux
futexesfutexes.
Support for x86, ARM and ARM thumb.
Bionic
Bionic::libc
Android Generated Kernel Header
bionic/libc/kernel/ 並非標準的 kernel header files
Android 的 kernel header 是利用工具由 Linux kernel header 所
產生的
目的是只保留使用到的常數、資料結構與巨集
給 使用給 userspace 使用
External Library
Android 所採用的 library(shared library)
y
Android 所採用的 library(shared library)
有些 library 的實作使用到 assembly 需再花工夫
例如 opencore 的實即為一例
/ l d id/ l/ $ fi d / "* "/ l d id/ l/ $ fi d / "* "~/google-android/external/opencore$ find ./ -name "*.s" -
print./codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window_gcc.s./codecs_
v2/audio/mp3/dec/src/asm/pvmp3_mdct_18.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_
dct_9.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_9_gcc.s./codecs_v2/audio/mp3/de
~/google-android/external/opencore$ find ./ -name "*.s" -
print./codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window_gcc.s./codecs_
v2/audio/mp3/dec/src/asm/pvmp3_mdct_18.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_
dct_9.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_9_gcc.s./codecs_v2/audio/mp3/deg
c/src/asm/pvmp3_mdct_18_gcc.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_f
ilter_window.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_16_gcc.s
g
c/src/asm/pvmp3_mdct_18_gcc.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_f
ilter_window.s./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_16_gcc.s
sonivox & OpenSSLp
./sonivox/arm-hybrid-22k/lib_src/ARM-E_filter_gnu.s./sonivox/arm-hybrid-22k/lib_src/ARM-
E_mastergain_gnu.s./sonivox/arm-hybrid-22k/lib_src/ARM-
E_voice_gain_gnu.s./sonivox/arm-hybrid-22k/lib_src/ARM-
E interpolate noloop gnu.s./sonivox/arm-hybrid-22k/lib src/ARM-
./sonivox/arm-hybrid-22k/lib_src/ARM-E_filter_gnu.s./sonivox/arm-hybrid-22k/lib_src/ARM-
E_mastergain_gnu.s./sonivox/arm-hybrid-22k/lib_src/ARM-
E_voice_gain_gnu.s./sonivox/arm-hybrid-22k/lib_src/ARM-
E interpolate noloop gnu.s./sonivox/arm-hybrid-22k/lib src/ARM-E_interpolate_noloop_gnu.s./sonivox/arm hybrid 22k/lib_src/ARM
E_interpolate_loop_gnu.s./sonivox/arm-wt-22k/lib_src/ARM-E_filter_gnu.s./sonivox/arm-
wt-22k/lib_src/ARM-E_mastergain_gnu.s./sonivox/arm-wt-22k/lib_src/ARM-
E_voice_gain_gnu.s./sonivox/arm-wt-22k/lib_src/ARM-E_interpolate_loop_gnu.s
/openssl/crypto/bn/asm/pa risc2W s /openssl/crypto/bn/asm/pa
E_interpolate_noloop_gnu.s./sonivox/arm hybrid 22k/lib_src/ARM
E_interpolate_loop_gnu.s./sonivox/arm-wt-22k/lib_src/ARM-E_filter_gnu.s./sonivox/arm-
wt-22k/lib_src/ARM-E_mastergain_gnu.s./sonivox/arm-wt-22k/lib_src/ARM-
E_voice_gain_gnu.s./sonivox/arm-wt-22k/lib_src/ARM-E_interpolate_loop_gnu.s
/openssl/crypto/bn/asm/pa risc2W s /openssl/crypto/bn/asm/pa./openssl/crypto/bn/asm/pa-risc2W.s./openssl/crypto/bn/asm/pa-
risc2.s./openssl/crypto/bn/asm/mips3.s./openssl/crypto/0.9.9-dev/aes/aes-
armv4.s./openssl/crypto/0.9.9-dev/bn/armv4-mont.s./openssl/crypto/0.9.9-dev/sha/sha256-
armv4.s./openssl/crypto/0.9.9-dev/sha/sha512-armv4.s./openssl/crypto/0.9.9-
d / h / h 1 4 l
./openssl/crypto/bn/asm/pa-risc2W.s./openssl/crypto/bn/asm/pa-
risc2.s./openssl/crypto/bn/asm/mips3.s./openssl/crypto/0.9.9-dev/aes/aes-
armv4.s./openssl/crypto/0.9.9-dev/bn/armv4-mont.s./openssl/crypto/0.9.9-dev/sha/sha256-
armv4.s./openssl/crypto/0.9.9-dev/sha/sha512-armv4.s./openssl/crypto/0.9.9-
d / h / h 1 4 ldev/sha/sha1-armv4-large.sdev/sha/sha1-armv4-large.s
Android & Kernel 的考量項目的考量項目
SurfaceHolder 的 type 為 SURFACE_TYPE_GPU 時、須考量
GPU(Graphics Processing Unit)的支援
SurfaceHolder 的 type 為 SURFACE_TYPE_HARDWARE 時、
須考量 DMA 與硬體加速的支援
目的是只保留使用到的常數、資料結構與巨集
給 userspace 使用
Android 多媒體支援的考量多媒體支援的考量
Surface Manager 與 Media Framework
SurfaceHolder 的 type 為 SURFACE TYPE GPU 時 須考量SurfaceHolder 的 type 為 SURFACE_TYPE_GPU 時、須考量
GPU(Graphics Processing Unit)的支援
SurfaceHolder 的 type 為 SURFACE_TYPE_HARDWARE 時、
須考量 DMA 與硬體加速的支援
MediaPlayer 使用 OpenCore 程式庫
Surface Managerg
private SurfaceView mPreview;
private SurfaceHolder holder;
private SurfaceView mPreview;
private SurfaceHolder holder;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.mediaplayer_2);
mPreview = (SurfaceView) findViewById(R id surface);
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.mediaplayer_2);
mPreview = (SurfaceView) findViewById(R id surface);mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}}}
Surface Manager 部份要考量底層硬體Surface Manager 部份要考量底層硬體
Media Framework
private MediaPlayer mMediaPlayer;
public void surfaceCreated(SurfaceHolder holder) {
private MediaPlayer mMediaPlayer;
public void surfaceCreated(SurfaceHolder holder) {public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);y p ( );
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
y p ( );
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
Media Framework 考量 OpenCore 的移植工作Media Framework 考量 OpenCore 的移植工作
Android Porting Map
Text
還有哪些其他的移植工作?Q&A
陳俊宏(Jollen Chen)
本文档为【Android 移植技术】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。