??xml version="1.0" encoding="utf-8" standalone="yes"?> 1?/span>我是?/span>vmware下安?/span>ubuntu 11.10的,q个|上资料很多Q不多说了。我l?/span>ubuntu分了25g盘?/span>1g内存?/span> 2?/span>请参?/span>http://source.android.com/source?/span> 初始化编译环?/span> 查一下包是否安装Q?/span> Python 2.4-2.7 Git 1.5.4 或更高版?/span> 没有话可?/span>sudo apt-get install..安装一?/span> JDK 6 因ؓ是编译android2.3以上Q如果编?.2以下需要JDK5 安装JDK6Q?/span> $ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" 如果下蝲速度不行Q可以先?/span>ubuntu的更新源Ҏ|易的源Q可参考:http://bolg.malu.me/html/2010/279.html?/span> 其他需要安装的包: 我安装了如下包:官网上那?/span>64位需要安装的包,我是32位的有些不一栗?/span> $ sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev x11proto-core-dev libx11-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils 3?/span>下面开始下载源?/span> 首先安装repo(是一个便?/span>git理的工?/span>) $ mkdir ~/bin 初始?/span>repo client $ mkdir android2.3.7 初始?/span>repoQ我是用的下面的地址Q用官|地址时出C|络错误 $ repo init -u http://android.googlesource.com/platform/manifest.git -b android-2.3.7_r1 按照提示输入用户名和邮箱?/span> 接着 $ repo sync 开始同步源码,Ҏ你的|速,我的持箋?/span>50分钟左右?/span> q有一步验?/span>git tags可参照官|。下完后可以在刚才创徏?/span>android2.3.7文g夹下看见已下载的源码?/span> 4?/span>开始编?/span> 初始化: $ source build/envsetup.sh 上面代表~译的一?/span>targetQ?/span>full是针?/span>emulator~译全部包括app、输入法{,eng是指针对开发者编译,有最高权限。具体可参见官网?/span> 接着可以编译了Q在源码目录下直?/span>makepQ需要一D|间?/span> ~译q程中有几个问题需要指Z下: 问题1Q?/span> ׃我们?/span>32位系l,所以有些文仉要修改一下:?/span> ./external/clearsilver/cgi/Android.mk ./external/clearsilver/java-jni/Android.mk ./external/clearsilver/util/Android.mk ./external/clearsilver/cs/Android.mk 四个文g中的 LOCAL_CFLAGS += -m64 注释掉,或者将“64”换成“32” LOCAL_CFLAGS += -m32 然后Q将./build/core/main.mk 中的 ifneq (64,$(findstring 64,$(build_arch))) 改ؓQ?/span> ifneq (i686,$(findstring i686,$(build_arch))) 问题2Q?/span> frameworks/base/libs/utils/RefBase.cpp:483:67: error: passing ‘const android::RefBase::weakref_impl’ as ‘this’ argument of ‘void android::RefBase::weakref_impl::trackMe(bool, bool)’ discards qualifiers [-fpermissive] make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/RefBase.o] error 1 如下解决Q?/span> $ gedit frameworks/base/libs/utils/Android.mk 下面一?/p> LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) Ҏ LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) –fpermissive 问题3Q?/span> <command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default] <built-in>:0:0: note: this is the location of the previous definition cc1plus: all warnings being treated as errors make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1 q是׃11.10?/span>gcc版本q高造成的,可参考这文章修改:http://hi.baidu.com/designhouse/blog/item/fec5cdbf8d6a231618d81fc1.html?/span> x~译完毕?/span> make~译的ƈ不是所有内容,不包含内核和SDK?/span> 映像生成在out/target/product/generic下:android源码~译后得到system.img,ramdisk.img,userdata.img映像文g。其中, ramdisk.img是一个分区映像文Ӟ在kernel启动Ӟramdisk被用来调用initQ以及把真正的root file system mounth。system.img包括了主要系l,pȝapp{,会被挂蝲?下,可对应查?/system该目录,可以发现在其下app/下有一些系l自带的应用E序。userdata.img包括了一些用h据,被挂载到/data下,对应可查?/data/目录Qemulator加蝲q?个映像文件?/p> 5、编译SDK ~译SDK可以得到与源码同步的SDKQ还会生成一些toolsQ在源码根目录下Q?/p> $ sudo make PRODUCT-sdk-sdk ~译生成的SDK在out/host/linux-x86/SDK下。之后如果在ubuntu下用eclipseq行开发,可以使用你编译的SDK?/p> 下面在模拟器中q行镜像Q徏议切到root用户下,首先配置几个环境变量Q将自己~译的SDK设ؓ优先U最高,在源码根目录下执行: $ update-alternatives --install /usr/bin/AndroidSDK AndroidSDK ./out/host/linux-x86/sdk/android-sdk_eng.root_linux-x86 255 q样会在/etc/alternatives下生成一个指向该SDK目录的Yq接AndroidSDKQ这个目录主要存放一些系l默认打开的程序的信息和配|。那?usr/bin/AndroidSDK指向这个Yq接。接着执行: gedit ~/.bashrc 在文件末添加: export ANDROID_SDK_HOME=/usr/bin/AndroidSDK 接着可以执行: $ emulator q行的就是你~译的映像。执行emulator 命oӞ如果不带M参数Q则Linux Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文gQ? Android镜像文g则默认用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img。模拟器q行需要这四个文gQ如果你~译了内核则可以使用自己的Kernel镜像Q可用于androidUL{?/p> 6、单独编译模?/p> 如果你不想编译整个系l,想~译某一个应用程序,可以使用mmm命oQ用之前,在源码目录下先要执行Q?/p> $ build/envsetup.sh q样会生成一些命令,有m即make、mm~译当前目录下所有模块、mmm~译指定目录下所有模块。你可以把packages/apps/Music应用的application nameҎMyMusic(AndroidManifest.xml?Q然后执行: $ mmm packages/apps/Music 在out/target/product/generic/system/app中就可以看见Music.apkQ然后执行: $ make snod 重新生成system.img?/p> 7、问题:ubuntu下搭建eclipse~译android源码环境Q将会另写一文章? startActivity()或者finish()之后调用来指定一个效?/code>Q第一个参数是下一个activity出现的效果,W二个参数是该activity退出的效果?br />关于animationQ可以参考这文章:http://www.cnblogs.com/feisky/archive/2010/01/11/1644482.html?br />W二个CustomDialogActivityQ展CZ一个activity如何使用自定义themeQ其看h像一个dialogQ在ApiDemos Manifest.xml中对应该activity的标{下Q?br />有该属性:android:theme="@style/Theme.CustomDialog"Q引用了一个自定义的themeQ在styles.xml文g中:
2 <item name="android:windowBackground">@drawable/filled_box</item>
3 </style>
2 <solid android:color="#f0600000"/>
3 <stroke android:width="3dp" color="#ffff8080"/>
4 <corners android:radius="3dp" />
5 <padding android:left="10dp" android:top="10dp"
6 android:right="10dp" android:bottom="10dp" />
7 </shape>
2 android:startColor="#52adcd"
3 android:endColor="#1c87b1"
4 android:angle="0" /> <!- angle代表角度Q?是从左往x变,可以多用几个D一?nbsp;。这个标{不能和solid标签同时出现?!>
2 setContentView(R.layout.custom_title);
3 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1);
|上有很多介l,大家可以自己搜一下,l个参考文章:http://www.cnblogs.com/salam/archive/2010/11/30/1892143.html?br />W五个看下PersistentState和SaveRestoreStateQ先说SaveRestoreState展示?code>onSaveInstanceState()保存activity状态的效果Q其实本w没做什么,onSaveInstanceState()是当该activity可能会被pȝdestory旉认调用的Q默认会记录布局中每个view的状态,如edittext的内宏Vcheckedbox的选中状态,
你需要做的就是给每个控g加一个idQ没有id的话是无法保存状态的Q可以看下源码PhoneWindow.java中的saveHierarchyState()。一般情况下不需要你重写onSaveInstanceState()Q但是如果你想保存除了UI状态之外的其他附加信息Q如一个成员变量的值等可以覆写,但要注意Q一定要调用
onSaveInstanceState()Q以上都可以在官Ҏ档里扑ֈ?br />再说下PersistentStateQ这个展CZ使用SharedPreferences持久化的保存edittext的状态,包括光标的位|。主要是在onPause()里保存,onResume()里还原,super.
不多说了Q测试这两个例子Ӟ可以修改两个edittext中的值然后旋转手机,使其横屏Q这样那个activity会destory然后再create?br />W六个看下ReceiveResultQ主要展CZstartActivityForResult()的用法,q个可以用于比如从一个activity跛_另一个activity去选择一个email地址或是一张图片,
选择完毕时结果再q回l上一个activity。我按照程来介l下q个Ҏ的用法,
-->SendResultQ首先先要调?br />startActivityForResult(Intent intent, int requestCode)启动SendResultQ然后在SendResultq个activity中处理,处理完调用setResult (int resultCode, Intent data)Q?br />q回到ReceiveResult中,注意setResult()后要调用finish()。最后呢在ReceiveResult中要覆写onActivityResult(int requestCode, int resultCode, Intent data)ҎQ?br />来处理返回的l果Q一些细节大家自q看例子。关于requestCodeQ可以理解成A跌{到B同时也可以蟩转到C或DQ区分是跛_哪个activityQ而resultCodeQ可以理?br />成B可以q回多个|OK或NOT OK{,区分一个activityq回的多个|可以ȝ下Redirectionq个例子Q加强对ReceiveResult
()的理解?br />q有个知识点说下Q在receiveResult的onCreate()中,mResults.setText(mResults.getText(), TextView.BufferType.EDITABLE);关于startActivityForResult
最好结合源码来看这个方法,从TextView的setText( CharSequence text, BufferType type ) --> Editable.java --> SpannableStringBuilder.java。实际上是将原来?div>的CharSequence text扩展成SpannableStringBuilderQ以使其happend{扩展的ҎQ这儿还有个工厂模式Q有旉多读L码还是不错的?br />W七个看下QuickContactsDemoQ首先是QuickContactBadgeq个控gQ自q下配|文件。接着是ResourceCursorAdapterQ这个adapterl承在CursorAdapterQ它覆写?br />CursorAdapter的newView()ҎQ其实就一句代码,用Inflater填充指定的xml文gQ所以在q个例子的newView()Ҏ中首先调用super().newView()ҎQ将构造函C指定?br />那个layout转成viewQ然后bindView()里填充数据。最后是个viewHolder~存layout中的viewQviewHolder保证了对控g的缓存,减少了每ơfindViewById()的开销Q是优化listview的一个较好的方式?br />
2 public TextView nameView;
3 public QuickContactBadge photoView;
4 public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);
5 }
6 ContactListItemCache cache = new ContactListItemCache();
7 cache.nameView = (TextView) view.findViewById(R.id.name);
8 cache.photoView = (QuickContactBadge) view.findViewById(R.id.badge);
9 view.setTag(cache);最后那3个activityQ一个透明背景activity、一个透明q且模糊不清背景activity、一个用你的壁纸做背景的activity都用了自定义的themeQ可以自q看,攑ֈ自己的应用中?br />q篇ȝ先到q,有些乱?/code>
]]>
q个cȝcdQ便是AndroidManifest.xml ?<application> tag的name。比如在q个cMonCreate()中:
q样其他的activity、service{才能相应的使用q个配置文g?br />接着看下ApiDemos.javaQ这个类充分应用了AndroidManifest.xmlq个文g。首先这个类是程序入口,一个ListActivityQ这个类会重复利用到?br />在其onCreate()Ҏ里,W一ơ时path=""即prefix=""Q接着看getData()q个ҎQ这个方法就是给q个listview填值的Q填入的值放在myDataq个List<Map>中:
mainIntent.addCategory(Intent.CATEGORY_SAMPLE_CODE);
List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
]]>
在eclipse安装根目录下修改eclipse.ini
-Xms128m
-XX:MaxPermSize=256m
3、将 源码目录\development\ide\eclipse 中的android-formatting.xml和android.importorder导入eclipse android-formatting.xml用来配置eclipse~辑器的代码风格Qandroid.importorder用来配置eclipse的import的顺序和l构?
window->preferences->java->Code style->Organize Imports中导入android.importorder?br />4、导入源?br /> 最好重新换一个workspaceQ因为源码是比较庞大的。新建Java ProjectQ指定一个nameQ接着use default location勾掉Q指定到你源码的目录下,finish?br />
]]>
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
$ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ cd android2.3.7
$ lunch full-eng
LOCAL_LDFLAGS += -m64
LOCAL_LDFLAGS += -m32
export PATH=$ANDROID_SDK_HOME/tools:$PATH
export ANDROID_PRODUCT_OUT=~/android2.3.7/out/target/product/generic
]]>
如果只想从apk中抠一些图出来Q直接把.apkҎ.rar解压Q图片即在res下面?br />如果x看xml配置Q资源文件等Q则用下面的ҎQ先下蝲工具 http://code.google.com/p/android-apktool/ ?br />
需要系在两个工P1、dex2jar 地址Q?a >http://code.google.com/p/dex2jar/downloads/list 下蝲dex-translator-0.0.9.3.zip。作用是apk中的.dex转化?jar 2、jd-guiQ地址Q?a >http://java.decompiler.free.fr/ q个很熟悉了Q将.class反编译成.javaQ除了有windows版的.exeq有对应的eclipse插g可供下蝲?br />接着?apkҎ.rar解压得到classes.dex文gQ将其放到dex-translator-0.0.9.3.zip解压的目录,命o行下cd到该目录下,执行dex2jar.bat classes.dex。则得到一个classes_dex2jar.jarQ然后运行jd-gui打开该jar包,可以查看源码。现在很多apk都会防止被反~译Q主要是工程下proguard.cfgL作用Q具体可以google?br />
]]>
NDK 提供了一pd的工P帮助开发者快速开?/span>CQ或C++Q的动态库Qƈ能自动将so?/span>java应用一h包成apk。这些工具对开发者的帮助是巨大的?/span>NDK 集成了交叉编译器Qƈ提供了相应的mk文g隔离CPU、^台?/span>ABI{差异,开发h员只需要简单修?/span>mk 文gQ指?/span>“哪些文g需要编?/span>”?/span>“~译Ҏ要?/span>”{)Q就可以创徏?/span>so?/span>NDK 可以自动地将so?/span>Java \应用一h包,极大地减M开发h员的打包工作。比较简单的_NDK是一套交叉编译工P它可以帮你把你用C?/span>C++书写的代码,~译?/span>.soQ类g win下的.dllQ格式的文gQ你可以在你的AndroidE序当中?/span>Java语言Q?/span>JNIQ调用这些代码?/span>
二、安?/span>cygwin
׃NDK~译代码时必要用到make?/span>gccQ所以你必须先搭Z?/span>linux环境Q?/span> cygwin是一个在windowsq_上运行的unix模拟环境,它对于学?/span>unix/linux操作环境Q或者从unix?/span>windows的应用程?/span> ULQ非常有用。通过它,你就可以在不安装linux的情况下使用NDK来编?/span>C?/span>C++代码了。下面我们一步一步的安装cygwin吧?/span>
首先?/span>www.cygwin.com下蝲setup.exe?/span>
然后默认配置nextQ选择自pq的镜像站点准备下蝲安装包列表?/span>
q里列出后面开?/span>NDK用得着的包Q?/span>autoconf2.1?/span>automake1.10?/span>binutils?/span>gcc-core?/span>g++?/span>gcc4-core?/span>gcc4-g++?/span>gdb?/span>pcre?/span>pcre-devel?/span>gawk?/span>make(宁可多?/span>,不能?/span>)Q最好再装个vim?/span>search需要安装的包,?/span>skipQ把它变成数字版本格式,要确?/span>Bin变成叉P?/span>SrcҎ源码Q这个就没必要选了。就可以q行安装了。如下图举例Q?/span>
下面试一?/span>cygwin是不是已l安装好了?/span>
q行cygwinQ在弹出的命令行H口输入Q?/span>cygcheck -c cygwin命oQ会打印出当?/span>cygwin的版本和q行状态,如果status?/span>ok的话Q则cygwinq行正常?/span>
然后依次输入gcc –vQ?/span>g++ --versionQ?/span>make –versionQ?/span>gdb –versionq行试Q?/span>(注意I格?/span>-)如果都打印出版本信息和一些描qC息,非常高兴的告诉你Q你?/span>cygwin安装完成了!
三、配|?/span>NDK环境变量
1、下?/span>NDKQ我下的最新的android-ndk-r6-windows.zipQ直接解?/span>
2、首先找?/span>cygwin的安装目录,扑ֈ一?/span>home\<你的用户?/span>>\.bash_profile文g?/span>
3、可以直接用C本打开.bash_profile文gQ添?/span>NDKROOT=/cygdrive/<你的盘符>/<android ndk 目录> 例如Q?/span>NDK=/cygdrive/e/software/android-ndk-r6,然后export NDKROOT?/span>NDKROOTq个名字随意取?/span>
4、打开cygwinQ输?/span>env | grep NDKROOTQ若昄你刚才键入的|则表明配|成功。说明一下,?/span>r4版本之前Q需要输?/span>build/host-setup.sh配置环境Q这个在NDK目录中的doc目录下的OVERVIEW.TXT有说明:Previous releases required that you run the 'build/host-setup.sh'script to configure your NDK. This step has been removed completely in release 4
四、编?/span>NDK自带的例?/span>
1、运?/span>cygwinQ输?/span>cd /cygdrive/<android ndk目录>/samples/hello-jni
2、输?/span>$NDK/ndk-buildQ执行成功后Q它会自动生成一?/span>libs目录Q把~译生成?/span>.so文g攑֜里面?/span>($NDK是调用我们之前配|好的环境变量,ndk-build是调?/span>ndk的编译程?/span>)?/span>
3、此时去hello-jni?/span>libs目录下看有没有生成的.so文gQ如果有Q你?/span>ndkp行正常?/span>
4?/span>eclipse中新?/span>android工程Q选择W二,如下图,可以跑h了,然后可以研究下其他例子?/span>
五?/span>eclipse中集?/span>CDT
?/span>eclipse中集?/span>c/c++开发环境。首先登?/span>http://www.eclipse.org/cdt/downloads.phpQ找到对应你Eclipse版本?/span>CDT插g的在U安装地址?/span> 然后eclipse里点Help菜单Q找?/span>Install New Software菜单Q下面就不说了,你可能会遇到Duplicate location重复路径的错误,q时你可以选择Available Software Sites,扑ֈ那个CDT安装的地址Q把其状态设|成Enablep了?/span>
六、配|?/span>c/c++~译器下ơ说