【Android源码 栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Android源码 -Ubuntu-32位机安装编译Android2 3源码及内核 - 操作系统的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
Ubuntu10.04系统 32位机上安装编译Android2.3源码其步骤和注意事项遇见问题如下 1.安装JDK6 对于Android2.3系统不要安装JDK5应该安装最新的JDK6。
如果安装了JDK6Android会自动按64位编译如果系统是32位的会有编译错误后面会说如何修改这个错误。
sudo add-apt-repository deb http://archive.canonical.com/ lucid partner sudo add-apt-repository deb-src http://archive.canonical.com/ubuntu lucid partner sudo apt-get update sudo apt-get install sun-java6-jdk sudo update-java-alternatives -s java-6-sun 安装完后需要手动设置JAVA_HOME JRE_HOME CLASS_PATH为JDK6的安装路径。
如----在etc/profile文件最后添加如下宏 JAVA_HOME/usr/lib/jvm/java-6-sun-1.6.0.24 export CLASSPATH.:JAVA_HOME/lib:CLASSPATH exprot PATHJAVA_HOME/bin:PATH exprot ANDROID_JAVA_HOMEJAVA_HOME 2. 安装各种包 sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev 3. 安装repo mkdir /bin export PATH/bin:PATH curl http://android.git.kernel.org/repo /bin/repo chmod ax /bin/repo 4. 下载
Android源码 mkdir /android2.3 cd /android2.3 repo init -u git://android.git.kernel.org/platform/manifest.git repo sync 这一步持续时间很长整个源码SDK共5G左右我是下载了一个晚上才搞定网速不给力啊。
。
。
5. 编译Android2.3 先export ANDROID_JAVA_HOMEJAVA_HOME cd /android2.3 source build/envsetup.sh lunch make 6、在模拟器上运行编译好Android Android SDK的emulator程序在Android-sdk-linux_x86-1.0_r2/tools/下 emulator是需要加载一些image的 默认加载Android-sdk-linux_x86-1.0_r2/tools/lib/images下的 kernel-qemu内核 ramdisk.img system.img userdata.img 编译好Android之后emulator在/Android/out/host/linux-x86/bin下 ramdisk.img system.img userdata.img则在/Android/out/target/product/generic下 通过命令到该目录cd /Android/out/host/linux-x86/bin 增加环境变量 vi /.bashrc 在.bashrc中新增环境变量该文件隐藏在/home/yangqiang目录下如下 java 程序开发/运行的一些环境变量 export ANDROID_PRODUCT_OUT/Android/out/target/product/generic ANDROID_PRODUCT_OUT_BIN/Android/out/host/linux-x86/bin export PATHPATH:Android_PRODUCT_OUT_BIN 最后同步这些变化 source /.bashrc emulator -system system.img -data userdata.img -ramdisk ramdisk.img 最后进入android桌面模拟器启动并进入android界面就说明成功了。
out/host/linux-x86/bin下生成许多有用工具包括Android SDK/tools的所有工具 因此可以把eclipse中Android SDK的路径指定到out/host/linux-x86/bin进行开发 7、编译linux kernel 直接make
Android源码时并没有make linux kernel。
因此是在运行模拟器 所以不用编译 linux kernel。
如果要移值Android或增删驱动则需要编译 linux kernel linux kernel的编译将在以后的文章中介绍。
8、编译模块 Android中的一个应用程序可以单独编译编译后要重新生成system.img 在源码目录下执行 . build/envsetup.sh .后面有空格 就多出一些命令 - croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/.xml files. - godir: Go to the directory containing a file. 可以加—help查看用法 我们可以使用mmm来编译指定目录的模块如编译联系人 mmm packages/apps/Contacts/ 编完之后生成两个文件 out/target/product/generic/data/app/ContactsTests.apk out/target/product/generic/system/app/ Contacts.apk 可以使用make snod重新生成system.img 再运行模拟器。
9、编译SDK 直接执行make是不包括make sdk的。
make sdk用来生成SDK这样 我们就可以用与源码同步的SDK来开发 Android了。
1修改/frameworks/base/include/utils/Asset.h ‘UNCOMPRESS_DATA_MAX 1 1024 1024’ 改为 ‘UNCOMPRESS_DATA_MAX 2 1024 1024’ 原因是Eclipse编译工程需要大于1.3M的buffer 2编译ADT。
注意我们是先执行2再执行3。
因为在执行./build_server.sh时会把生成的SDK清除了。
用上了新的源码adt这个调试工具也得自己来生成步骤如下 进入cupcake源码的development/tools/eclipse/scripts目录执行 export ECLIPSE_HOME你的eclipse路径 ./build_server.sh 你想放ADT的路径 3执行make sdk。
注意这里需要的javadoc版本为1.5所以你需要在步骤1中同时安装sun-java5-jdk make sdk 编译很慢。
编译后生成的SDK存放在out/host/linux-x86/sdk/ 此目录下有Android-sdk_eng.xxx_linux-x86.zip和Android-sdk_eng.xxx_linux-x86目录。
Android-sdk_eng.xxx_linux-x86就是SDK目录 实际上当用mmm命令编译模块时一样会把SDK的输出文件清除因此 最好把Android-sdk_eng.xxx_linux-x86移出来 4关于环境变量、android工具的选择 目前的android工具有 A、我们从网上下载的SDK tools下有许多android工具lib/images下有img映像 B、我们用make sdk编译出来的SDK tools下也有许多android工具lib/images下有img映像 C、我们用make编译出来的out目录 tools下也有许多android工具lib/images下有img映像 那么我们应该用那些工具和img呢 首先我们不会用A选项的工具和img因为一般来说它比较旧也源码不同步。
测试发现如果使用B选项的工具和imgandroid模拟器窗口变小可能是skin加载不了 而用C选项的工具和img则不会有此问题。
有些android工具依赖android.jar比如android因此 我们在eclipse中使用B选项的工具SDK使用C选项的img。
其实 从emulator -help-build-images也可以看出ANDROID_PRODUCT_OUT是指向C选项的img目录的 不过除了用A选项的工具和img用B或C的模拟器都不能加载sdcard原因还不清楚。
5安装、配置ADT 安装、配置ADT请参考官方文档 6创建Android Virtual Device 编译出来的SDK是没有AVDAndroid Virtual Device的我们可以通过android工具查看 android list 输出为 Available Android targets: 1 Android 1.5 API level: 3 Skins: HVGA-P QVGA-L HVGA-L HVGA default QVGA-P Available Android Virtual Devices: 表明没有AVD。
如果没有AVDeclipse编译工程时会出错 Failed to find a AVD compatible with target Android 1.5. Launch aborted. 创建AVD android create avd -t 1 -c /sdcard.img -n myavd 可以android –help来查看上面命令选项的用法。
创建中有一些选项默认就行了 再执行android list可以看到AVD存放的位置 以后每次运行emulator都要加-avd myavd或myavd选项 这里eclipse才会在你打开的emulator中调试程序 注意 这样SDK和ADT就生成了就按照官方文档把他们整合到Eclipse这里不再细说了。
建个android的新工程试试你自己编译的sdk。
10编译linux内核映像 a准备交叉编译工具链 android代码树中有一个prebuilt项目包含了我们编译内核所需的交叉编译工具。
b设定环境变量 vi /.bashrc 增加如下两行 export PATHPATH:/Android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin export ARCHarm 保存后同步变化 source /.bashrc c获得合适的内核源代码 cd /android 获得内核源代码仓库 git clone git://android.git.kernel.org/kernel/common.git kernel cd kernel git branch 显示 android-2.6.27 说明你现在在android-2.6.27这个分支上也是kernel/common.git的默认主分支。
显示所有head分支 git branch -a 显示 android-2.6.27 remotes/origin/HEAD - origin/android-2.6.27 remotes/origin/android-2.6.25 remotes/origin/android-2.6.27 remotes/origin/android-2.6.29 remotes/origin/android-goldfish-2.6.27 remotes/origin/android-goldfish-2.6.29 我们选取最新的android-goldfish-2.6.29其中goldfish是android的模拟器模拟的CPU。
git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29 git branch 显示 android-2.6.27 android-goldfish-2.6.29 我们已经工作在android-goldfish-2.6.29分支上了。
d设定交叉编译参数 打开kernel目录下的Makefile文件把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器 CROSS_COMPILE arm-eabi- 把 LDFLAGS_BUILD_ID patsubst -Wlcomma call ld-option -Wlcomma–build-id 这一行注释掉并且添加一个空的LDFLAGS_BUILD_ID定义如下: LDFLAGS_BUILD_ID e编译内核映像 cd /android/kernel make goldfish_defconfig make f测试生成的内核映像 emulator -avd myavd -kernel /android/kernel/arch/arm/boot/zImage Android tools adb 运行monkey程序进行随机输入测试 adb shell monkey -v -p com.android.email 500 查看systems log buffers adb logcat Viewing stdout and stderr adb shell stop adb shell setprop log.redirect-stdio true adb shell start view a log buffer containing radio and telephony messages adb logcat -b radio radio events main is default Filtering Log Output adb logcat ActivityManager:I MyApp:D :S emulator 运行模拟器 emulator -system system.img.orig -data userdata.img -ramdisk ramdisk.img my_avd emulator my_avd 运行模拟器并显示Linux kernel启动时的message emulator -show-kernel my_avd enable root shell on current terminal emulator -shell my_avd -wipe-data delete the emulators user-data partition emulator -wipe-data my_avd emulator -partition-size 256 -system D:romsystem.img -data d:romuserdata.img -kernel d:romkernel-qemu -ramdisk d:romramdisk.img -sdcard D:androidsdk1.6sd64.img -cpu-delay 0 -scale 160dpi -dpi-device 240 -skin WVGA800 -skindir D:androidsdk1.6platformsandroid-2.1skins -memory 512 -prop dalvik.vm.heapsize32m 具体解释一下 -partition-size 可以设置分区的大小是system和data两个分区一起设置 -cpu-delay 可以模拟速度慢的cpu -scale 可以缩小或扩大其显示dpi -dpi-device 可以设置hdpi或者mdpi等 -skin必须配合-skindir使用 -memory是设置内存大小缺省是96m如果不设置大一些大家都很看到不停地kill and start -prop dalvik.vm.heapsize32m 这个是非常重要的设置在我们的hdpi下不设置成24m就会系统无法启动 trace tracing // start tracing to /sdcard/calc.trace onCreate Debug.startMethodTracingcalc // ... // stop tracing onDestroy Debug.stopMethodTracing adb pull /sdcard/calc.trace /tmp traceview /tmp/calc 按F9启动/停止trace记录在/.android/avd/my_avd.avd/traces/目录下可以找到trace文件 emulator -trace trace_log 进入android源代码目录 cd ANDROID_HOME source build/envsetup.sh 运行envsetup.sh中的tracedmdump函数 tracedmdump /.android/avd/my_avd.avd/traces/trace_log 会在/.android/avd/my_avd.avd/traces/trace_log下产生dmtrace和dmtrace.html文件 apk 将apk/目录下的所有文件打包成apk apkbuilder jfo.apk -rf apk/ 或者使用aapt aapt p -F jfo2.apk apk/ 打印APK包信息 aapt dump badging jfo.apk add a file aapt a jfo.apk libcharset.so remove a file aapt r jfo.apk libcharset.so hierarchyviewer provides a visual representation of the layouts View hierarchy the Layout View hierarchyviewer astyle 代码格式化工具 astyle find ./ -name .java -exec astyle --styleansi 编译Android 2.3 源码遇见问题解决 1.使用如下命令来安装各种软件包确保所需软件都被正确安装 sudo aptitude install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev 1.因为Android2.3默认是64位的系统上编译需要手动修改build/core/main.mk 把这个判断部分注释掉 ifneq 64findstring 64build_arch warning warning You are attempting to build on a 32-bit system. warning Only 64-bit build environments are supported beyond froyo/2.2. warning error stop endif 2.这是由于clearsilver在编译时如果检测到使用Java JDK 6就使用64位编译 因为Google的一个员工更新了几个文件。
这里可以看到详细的修改记录 http://android.git.kernel.org/pplatform/external/clearsilver.gitacommitdiffhd36910a8110d8377b22301274d2b5131a732a72b 修改这几个文件该回到32位编译环境即可 external/clearsilver/cgi/Android.mk external/clearsilver/java-jni/Android.mk external/clearsilver/util/Android.mk external/clearsilver/cs/Android.mk 把编译选项-m64改成-m32即可 或者 这次修改当中Android.mk 做了如下修改 This forces a 64-bit build for Java6 ifneq filter 1.6java_version LOCAL_CFLAGS -m64 LOCAL_LDFLAGS -m64 endif 3. __dso_handle的问题解决 external/stlport/src/monetary.cpp:39: undefined reference to __dso_handle 修改yangqiang/Android/external/stlport/src加入 extern C void __dso_handle 0 要解决gnu/stubs-64.h: No such file or directory需 apt-get install libc6-dev-amd64 要解决/usr/bin/ld: cannot find -lstdc需 apt-get install g-multilib lib64stdc6 要解决/usr/bin/ld: cannot find -lz需 apt-get install lib64z1-dev