valgrindandroid
⑴ Android studio如何分析内存泄漏,是否有自带的分析工具
cpu资源耗尽:估计是机器没有反应了,键盘,鼠标,以及网络等等。这个在windows上经常看见,特别是中了毒。 进程id耗尽:没法创建新的进程了,串口或者telnet都没法创建了。 硬盘耗尽: 机器要死了,交换内存没法用,日志也没法用了,死是很正常的。 内存泄漏或者内存耗尽:新的连接无法创建,free的内存比较少。发生内存泄漏的程序很多,但是要想产生一定的后果,就需要这个进程是无限循环的,是个服务进程。当然,内核也是无限循环的,所以,如果内核发生了内存泄漏,情况就更加不妙。内存泄漏是一种很难定位和跟踪的错误,目前还没看到有什么好用的工具(当然,用户空间有一些工具,有静态分析的,也会动态分析的,但是找内核的内存泄漏,没有好的开源工具) 内存泄漏和对象的引用计数有很大的关系,再加上c/c++都没有自动的垃圾回收机制,如果没有手动释放内存,问题就会出现。如果要避免这个问题,还是要从代码上入手,良好的编码习惯和规范,是避免错误的不二法门。 一般我们常说的内存泄漏是指堆内存的泄漏。 堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。 应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。 (附)部分内存泄漏检测工具 1.ccmalloc-linux和Solaris下对C和C++程序的简单的使用内存泄漏和malloc调试库。 2.Dmalloc-Debug Malloc Library. 3.Electric Fence-Linux分发版中由Bruce Perens编写的malloc()调试库。 4.Leaky-Linux下检测内存泄漏的程序。 5.LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。 6.MEMWATCH-由Johan Lindh编写,是一个开放源代码C语言内存错误检测工具,主要是通过gcc的precessor来进行。 7.Valgrind-Debugging and profiling Linux programs, aiming at programs written in C and C++. 8.KCachegrind-A visualization tool for the profiling data generated by Cachegrind and Calltree. 9.IBM Rational PurifyPlus-帮助开发人员查明C/C++、托管.NET、java和VB6代码中的性能和可靠性错误。PurifyPlus 将内存错误和泄漏检测、应用程序性能描述、代码覆盖分析等功能组合在一个单一、完整的工具包中。 10.Parasoft Insure++-针对C/C++应用的运行时错误自动检测工具,它能够自动监测C/C++程序,发现其中存在着的内存破坏、内存泄漏、指针错误和I/O等错误。并通过使用一系列独特的技术(SCI技术和变异测试等),彻底的检查和测试我们的代码,精确定位错误的准确位置并给出详细的诊断信息。能作为Microsoft Visual C++的一个插件运行。 11.Compuware DevPartner for Visual C++ BoundsChecker Suite-为C++开发者设计的运行错误检测和调试工具软件。作为Microsoft Visual Studio和C++ 6.0的一个插件运行。 12.Electric Software GlowCode-包括内存泄漏检查,code profiler,函数调用跟踪等功能。给C++和.Net开发者提供完整的错误诊断,和运行时性能分析工具包。 13.Compuware DevPartner Java Edition-包含Java内存检测,代码覆盖率测试,代码性能测试,线程死锁,分布式应用等几大功能模块。 14.Quest JProbe-分析Java的内存泄漏。 15.ej-technologies JProfiler-一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。 16.BEA JRockit-用来诊断Java内存泄漏并指出根本原因,专门针对Intel平台并得到优化,能在Intel硬件上获得最高的性能。
⑵ valgrind 支持mips吗
STEP 1:
下载最新版本的valgrind:
http://www.valgrind.org/downloads/valgrind-3.9.0.tar.bz2
目前支持的平台,在官网上列表如下:
{x86,amd64,arm,ppc32,ppc64,s390x,mips32,mips64}-linux, arm-android (2.3 and later), x86-android (4.0 and later) and {x86,amd64}-darwin (Mac OS X 10.7, with limited support for 10.8).
STEP 2:
首先要配置编译选项,选择你的目标平台,因为我是在mips32平台上运行,所以配置如下:
./configure --host=mips-linux-gnu --prefix=/home/wupeng/workspace/valgrind/bin --program-prefix=mips-linux-gnu- CFLAGS="-EL" LDFLAGS="-EL"
注意:大小端的问题;刚开始配置没有注意这个,运行总是报语法错误,后来运行file命令查看,发现与正常运行的程序差异在于这块;
1 $ file mips-linux-gnu-valgrind
2 mips-linux-gnu-valgrind: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked (uses shared libs), for GNU/Linux 2.6.12, with unknown capability 0xf41 = 0x756e6700, not stripped
STEP 3:
生成Makefile后,直接编译即可;在编译过程中,会遇到卡在一个地方过不支,需将drd/Makefile中-O2修改为-O1:
复制代码
1 DRD_CFLAGS = \
2 --param inline-unit-growth=900 \
3 -O1 \
4 -Wextra \
5 -Wformat-nonliteral \
6 -Wno-inline \
7 -Wno-unused-parameter
复制代码
STEP 4:
安装,然后将执行文件到开发板上;需要注意的安装目录与你要拷贝到开发板上的路径要完全一致;
这点很重要,因为在编译时路径的hardcode已经在程序中了,如果不一致,运行时会提示找不到文件:
ex.
在host上,我编译安装valgrind的路径是:/home/wupeng/valgrind/bin, 那么将valgrind拷贝到开发板上的路径也要是这个,程序才能正确执行;
STEP 5:
运行valgrind, 后面跟上要运行的文件即可;
人生有限,要聚集你的精力到一件事情上,做到最好!
⑶ 编译android 源码需要sdk环境吗
下面是android学习手册,可以查看编译源码,360手机助手中下载,
编译环境:ubuntu9.10,widnows平台目前不被支持。
1)安装必要的软件环境
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
官方推荐的就是上面这些,如果在编译过程中发现某些命令找不到,就apt-get它。可能需要的包还有:
$ sudo apt-get install make
$ sudo apt-get install gcc
$ sudo apt-get install g++
$ sudo apt-get install libc6-dev
$ sudo apt-get install patch
$ sudo apt-get install texinfo
$ sudo apt-get install zlib1g-dev
$ sudo apt-get install valgrind
$ sudo apt-get install python2.5(或者更高版本)
需要注意的是,官方文档说如果用sun-java6-jdk可出问题,得要用sun-java5- jdk。经测试发现,如果仅仅make(make不包括make sdk),用sun-java6-jdk是没有问题的。而make sdk,就会有问题,严格来说是在make doc出问题,它需要的javadoc版本为1.5。
因此,我们安装完sun-java6-jdk后最好再安装sun-java5-jdk,或者只安装sun-java5-jdk。这里sun-java6-jdk和sun-java5-jdk都安装,并只修改javadoc.1.gz和javadoc。因为只有这两个是make sdk用到的。这样的话,除了javadoc工具是用1.5版本,其它均用1.6版本:
$ sudo apt-get install sun-java6-jdk
修改javadoc的link:
$ cd /etc/alternatives
$ sudo rm javadoc.1.gz
$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz
$ sudo rm javadoc
$ sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc
2)设置环境变量
$ emacs ~/.bashrc
在.bashrc中新增或整合PATH变量,如下:
#java 程序开发/运行的一些环境变量
JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
保存后,同步更新:
source ~/.bashrc
3)安装repo(用来更新android源码)
创建~/bin目录,用来存放repo程序,如下:
$ cd ~
$ mkdir bin
并加到环境变量PATH中,在第2步中已经加入。
下载repo脚本并使其可执行:
$ curlhttp://android.git.kernel.org/repo>~/bin/repo
$ chmod a+x ~/bin/repo
4)初始化repo
repo是android对git的一个封装,简化了一些git的操作。
创建工程目录:
$ mkdir android
$ cd android
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此过程中需要输入名字和email地址。初始化成功后,会显示:
repo initialized in /android
在~/android下会有一个.repo的隐藏目录。
5)同步源代码
$ repo sync
这一步要很久很久。
6)编译android源码,并得到~/android/out目录
$ cd ~/andoird
$ make
这一过程很久。
7)在模拟器上运行编译好的android
编译好android之后,emulator在~/android/out/host/linux-x86/bin下,ramdisk.img,system.img和userdata.img则在~/android/out/target/proct/generic下。
$ cd ~/android/out/host/linux-x86/bin
增加环境变量
$ emacs ~/.bashrc
在.bashrc中新增环境变量,如下
#java 程序开发/运行的一些环境变量
export ANDROID_PRODUCT_OUT=~/android/out/target/proct/generic
ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};
最后,同步这些变化:
$ source ~/.bashrc
$ cd ~/android/out/target/proct/generic
$ emulator -system system.img -data userdata.img -ramdisk ramdisk.img
最后进入android桌面,就说明成功了。
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 moles in the current directory.
- mmm: Builds all of the moles 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/proct/generic/data/app/ContactsTests.apk
out/target/proct/generic/system/app/Contacts.apk
可以使用
$ make snod
重新生成system.img,再运行模拟器。
9)编译SDK
直接执行make是不包括make sdk的。make sdk用来生成SDK,这样,我们就可以用与源码同步的SDK来开发android了。
a)修改/frameworks/base/include/utils/Asset.h
‘UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024’ 改为 ‘UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024’
原因是eclipse编译工程需要大于1.3M的buffer;
b)编译ADT
由于本人不使用eclipse,所以没有进行这步;
c)执行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移出来。
此后的应用开发,就在该SDK上进行,所以把7)对于~/.bashrc的修改注释掉,增加如下一行:
export PATH=${PATH}:~/android/out/host/linux-x86/sdk/android-sdk_eng.xxx_linux-x86/tools
注意要把xxx换成真实的路径;
d)关于环境变量、android工具的选择
目前的android工具有:
A、我们从网上下载的Android 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,因为一般来说它比较旧,也源码不同步。其次,也不会用C选项的工具和img,因为这些工具和img没有经过SDK的归类处理,会有工具和配置找不到的情况;事实上,make sdk产生的很多工具和img,在make编译出来out目录的时候,已经编译产生了,make sdk只是做了而已。
e)安装、配置ADT
略过;
f)创建Android Virtual Device
编译出来的SDK是没有AVD(Android Virtual Device)的,我们可以通过android工具查看:
$ android list
创建AVD:
$ android create avd -t 1 -n myavd
可以android –help来查看上面命令选项的用法。创建中有一些选项,默认就行了。
再执行android list,可以看到AVD存放的位置。
以后每次运行emulator都要加-avd myavd或@myavd选项:
$ emulator -avd myavd
10)编译linux内核映像
a)准备交叉编译工具链
android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。
b)设定环境变量
$ emacs ~/.bashrc
增加如下两行:
export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
export ARCH=arm
保存后,同步变化:
$ 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 -Wl$(comma)%,%,
$(call ld-option, -Wl$(comma)–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
⑷ 【科普】互联网公司中的几种常见职位
做为软件学院的同学大多数要去软件公司、游戏公司和互联网公司。我就我比较了解的互联网公司的几个跟技术有关的职位做一定的科普,希望对大家有一定的帮助,大牛请绕道。RD(Research&Development),即研发,其实就是软件工程师,或者叫程序员、码农。我们软件学院的大多数人都将从事这个职位,主要任务就是写代码,当然还有调研等工作,但都离不开编码。需要掌握的技能包编程语言、算法、脚本等。这个职位大概可以分为两个方向,一个是前端,另外一个就是后台。前端即UI,可以是网站的前端,也可以是应用程序的前端。对于网站的前端需要掌握HTML/CSS/JS、JSP/PHP/ASP.NET等东西,也可能用到JAVA等编程语言。对与应用程序的前端也分手机和桌面。手机需要了解Android呀、IPhone、Windows mobile、塞班那些个程序的开发,具体不是很了解,工资也很高。应用程序的前端的话,主要是Windows程序的开发了,那些Api什么的要比较熟,算法功底也是要有的。后台用的主要是C/C++、JAVA,算法要求更高一些,后台一般用Linux操作系统,对Linux要求比较了解。对于不同的系统,还有一定的业务门槛,这些只能在工作的过程中学习了。对于某些后台技术,可能还需要掌握一些数据挖掘、信息检索、自然语言处理等方面的高级知识,研究生可能要求对这些要有一定的了解,甚至是精通。QA(Quality Assurance),即测试。可能很多搞技术的都不怎么看得上测试。但我不这么认为,而且公司也都越来越重视测试了,测试拿的薪水也不比你研发的少。有的人甚至认为做测试就是简单的重复劳动,甚至可能是做点按钮的工作。但其实这都是误解,或者说前面的这些都是比较低级的测试。一般来讲,在互联网公司测试分为纯测试和开发测试两种,也可能不区分。也就是说测试并不是不要写代码,其实测试也要写代码。需要学会的技术有很多,可以说开发的那些技术你也是要懂的,还是学会使用各种测试工具,指导RD写单测,写Mock(俗称打桩),使用valgrind,搭各种测试环境,压力环境。如果高级点,还需要搞可持续化集成,要写各种各样的脚本。当然低级的反复跑程序什么的也是不可避免的。如果你懂技术,但不是那么精通的话,还是可以考虑测试职位的,尤其低于女生来说,选择测试还是比较靠谱的。说到女生,我就多插一句,女生并不是不适合做RD,RD中也有不少的MM,甚至也有很多做得非常出色的MM RD,但是你要能忍受各种各样的加班和压力。女生做QA的话,相对就要好很多,据我里了解做测试的女生还是非常多,就我所知道的网络而言,测试mm可能比测试的gg要多一些。PM(Proct Manager),即产品经理。这里的经理是管理和运营的意思。产品经理也就是产品运营与管理的工作。产品经理其实是可以不懂技术的,有说PM懂技术好的,也有说PM不懂技术好的,但到底哪个好,那就不得而知了。懂技术,可能就不会提出那些无法实现的需求来,但是懂技术也可能限制和束缚你的思想。PM的很大一项工作是分析数据,并发现数据背后所隐藏的东西,所以如果你是学数学的或是数学功底好的话,会更好。其实PM对一个产品的影响要比RD大很多,现在来看,已经不是技术的时代了,很多时候都取决于产品的工作。说白了,产品是一个了解用户需求,并替用户提需求的一个工作。怎么了解呢,主要是对数据的分析和对行业的了解了。我们软件学院的同学,做产品并不是很多,其实我觉得也是一个很好选择。尤其是女生,如果你对技术不是那么感兴趣的话,而又有敏锐的洞察力的话,还是可以考虑PM这个职位的。这个职位相比RD来讲不是很累,后续的发展可能还比RD要好一些,何乐而不为呢。具体PM要了解一些什么技术,我也不甚了解,感兴趣的可以自己去网上查。OP(Operator),即运维。说表了就是管理线上机器和程序。一般成熟的互联网公司,RD是不直接管理线上服务器的。RD的程序要上线,到线上的机器上运行,首先要经过QA的测试,然后由OP操作上线。OP需要保证线上机器安全可靠地运行,实时监控程序的运行状态,会设置各种各样的检测脚本,报警体系。另外要实时响应各种报警,不管是半夜还是凌晨,一有问题,你就要实习响应。可能这是一个真正不适合女生做的职位。OP需要对服务非常了解,对操作系统非常了解,要对Linux脚本很熟悉,有的时候也是要写程序的,比如监控程序。如果运维做的好,可能还需要写一些辅助工具,可能是网页版形式,方面运维和监控。我了解的大概就这么些东西吧,说的不对的,欢迎指正,有问题欢迎及时提出。
⑸ 如何开始的valgrind一个Android应用程序
如果要定制一个Android系统,你想用你自己的Launcher(Home)作主界面来替换Android自带的Home,而且不希望用户安装的Launcher来替换掉你的Launcher,应该如何来实现呢?
我们可以通过修改Framework层来实现这样的功能。
1) 首先了解一下Android的启动过程。
Android系统的启动先从Zygote开始启动,然后......(中间的过程就不说了).....一直到了SystemServer(framework)这个地方,看到这段代码:
/**
* This method is called from Zygote to initialize the system. This willcause the native
* services (SurfaceFlinger, AudioFlinger, etc..) to be started. Afterthat it will call back
* up into init2() to start the Android services.
*/
native public static void init1(String[] args);
public static void main(String[] args) {
if (SamplingProfilerIntegration.isEnabled()) {
SamplingProfilerIntegration.start();
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
SamplingProfilerIntegration.writeSnapshot("system_server");
}
}, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
}
// The system server has to run all of the time, so it needs to be
// as efficient as possible with its memory usage.
VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
System.loadLibrary("android_servers");
init1(args);
}
public static final void init2() {
Log.i(TAG, "Entered the Android system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
}
}
从SystemServer的main函数开始启动各种服务:
首先启动init1,然后启动init2.从上面的注释可以看到:init1这个方法时被Zygote调用来初始化系统的,init1会启动native的服务如SurfaceFlinger,AudioFlinger等等,这些工作做完以后会回调init2来启动Android的service。
这里我们主要来关注init2的过程。init2中启动ServerThread线程,ServerThread中启动了一系列的服务,比如这些:
ActivityManagerService
EntropyService
PowerManagerService
TelephonyRegistry
PackageManagerService
AccountManagerService
BatteryService
HardwareService
Watchdog
SensorService
BluetoothService
StatusBarService
ClipboardService
InputMethodManagerService
NetStatService
ConnectivityService
AccessibilityManagerService
NotificationManagerService
MountService
DeviceStorageMonitorService
LocationManagerService
SearchManagerService
FallbackCheckinService
WallpaperManagerService
AudioService
BackupManagerService
AppWidgetService
这些大大小小的服务起来以后,开始
((ActivityManagerService)ActivityManagerNative.getDefault()).systemReady()
在systemReady后开始开始启动Launcher。在寻找Launcher的时候是根据HOME的filter(在Manifest中定义的<categoryandroid:name="android.intent.category.HOME" />)来过滤。
然后根据filter出来的HOME来启动,如果只有一个HOME,则启动这个HOME,如果用户自己装了HOME,那就会弹出来一个列表供用户选择。
现在希望从这里弹出自己定制的Launcher,同时也不希望弹出选择HOME的界面,不希望用户修改的home,比如我们的home上放了好多广告,以及强制安装的程序,不希望用户把它干掉。
可以通过这样来实现:
2) 定义一个私有的filter选项,然后用这个选项来过滤HOME.
一般情况下我们使用Manifest中定义的<categoryandroid:name="android.intent.category.HOME"来过滤的,现在增加一个私有的HOME_FIRST过滤。
在Intent.java(frameworks/base/core/java/android/content/Intent.java)中添加两行代码
//lixinso:添加CATEGORY_FS_HOME
@SdkConstant(SdkConstantType.INTENT_CATEGORY)
public static final String CATEGORY_FS_HOME= "android.intent.category.FS_HOME";
3)修改和CATEGORY_HOME相关的所有的地方,都改成CATEGORY_FS_HOME,主要是framework中的这几个地方:使用grep命令查找要修改的地方:
grep CATEGORY_HOME -l * -R
将上述文件中和CATEGORY_HOME相关的所有的地方,都改成CATEGORY_FS_HOME。
4) 写一个自己的Launcher.
可以参考android sample中的Launcher,或者android源代码中的 /packages/apps/Launcher 来写。
在Launcher中标记其是不是Launcher的最关键的代码时Manifest中的filter:android:name="android.intent.category.HOME"
现在我们定义了自己的filter,那么,我们在我们自己写的Launcher中将Manifest改为:
<application android:process="android.process.acore3"android:icon="@drawable/icon"android:label="@string/app_name">
<activity android:name=".FirstAppActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category. FS_HOME" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
</intent-filter>
</activity>
</application>
然后将编译好的apk放到方式fs100_root/system/app目录下。
5)将Android自带的Launcher删除掉
包括源代码(packages/apps/Launcher)和apk(/out/target/proct/generic/system/app/Launcher.apk)。
6) 重新编译Android
做完这些工作,就可以重新编译Android了,我们可以编译修改过的几个相关的包,可以用mmm命令来编译部分的改动。这里需要这样编译:
$ source build/envsetup.sh
$ lunch
$ mmm frameworks/base
$ mmm frameworks/base/services/java
$ mmm frameworks/policies/base/mid
$ mmm frameworks/policies/base/phone
重新启动开发板,从开发板上就可以看到启动的Launcher是我们自己的Launcher,不会出现默认的Launcher了,也不会出现选择界面。
9)我们再验证一下,如果用户装上了一个其他的Launcher(Home)会怎么样。
从网上找一个一般的Launcher或者自己写一个一般的Launcher装上去,重新启动,不会出现选择界面。
按HOME键也不会出来两个HOME来选择。