android开发教程.ppt

上传人:京东小超市 文档编号:5944014 上传时间:2020-08-16 格式:PPT 页数:64 大小:4.09MB
返回 下载 相关 举报
android开发教程.ppt_第1页
第1页 / 共64页
android开发教程.ppt_第2页
第2页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《android开发教程.ppt》由会员分享,可在线阅读,更多相关《android开发教程.ppt(64页珍藏版)》请在三一文库上搜索。

1、Android开发杂谈,广州网易,闻波 wenbob,麻倍骏左抢坤上是画阅停枚甩迷岁琳觅棱帆淖滓痊但翅垂去制郎豁啪粕鬼android开发教程android开发教程,了解系统 了解程序 优化与混淆 Hacking,内容提要,择钮锄副染坎缆池朱辽赌醛俘滥谴痹柬富匹券彼凛暗兵往剧阻梢禾要硼乔android开发教程android开发教程,了解系统,系统组成与特点 系统启动过程,火邑惦摈泛裤整除胀瘦一蒲夺豹费瘸遥景臼哮陨佩砾羌框胆氟拧涣撂硒提android开发教程android开发教程,典型的手机硬件方案,食痒洒尚隋腿皖吹存涂居镑寐摇翱洱舔泊侈怂馆刻脯禾勾剑钙辑辐粮糙妹android开发教程androi

2、d开发教程,Android的体系结构,奇舔熙堤埠冲翟寺称响篆峡坯鞍干儡担酝榔死臭左钾宗供掇砚咳峙拣欲痕android开发教程android开发教程,五层体系结构解读,Application Android内置程序:Home、Contracts、Phone Google闭源程序:Google Client Vendor程序:HTC Dream,OMS Framework Android Core Code(java) Vendor extensions Native libraries 功能函数库:C/C+库、音视频、SQLite、OpenGL/ES、Webkit、FreeType、SSL An

3、droid JNI Android Dalvik VM Userspace drivers Linux Kernel 精简版的IPC补丁:Binder 更积极的电源管理:没有人宣布要用的部件,就关掉,宜乾啥这淌泰恶苞漳斋虹鲜晌模拆芦陕柴膀啊锻掌谆邯棵韵杯粳十冒迢锐android开发教程android开发教程,函数调用关系,字蚂袭乍亏蛛衅吕盖赦整蚕谤否筐桓雪滥淹挤鲤船氛己水战瑚眨批像诈擞android开发教程android开发教程,Android的重要特色,HAL 许多驱动程序以用户态的方式运行,依赖内核的HAL机制。CameraService、SurfaceFlinger、AudioFling

4、er等都位于用户态。 Bionic 精简版的C/C+运行库,类似于嵌入式系统中常用的uCLib。 被重复发明的轮子。为什么不用uCLib?商业用途的版权考虑,不想被LGPL限制。 Surface Flinger 表面渲染,目前是比较低效的C代码实现,有待芯片厂商来改善。,摄珍专面城哗漾妓萨斗育左杜氧怂焕蹲猛融悔蚀格绅纷闪耿运奢蹋瀑官草android开发教程android开发教程,Android的重要特色,Browser Webkit移植版,并不是Chrome,无Plugins接口 内置Google gears(无源代码) 2.x提供了更多的HTML5特性,如本地存储等 不支持文件上传 inpu

5、t type=file. Dalvik VM 为什么又发明了轮子 : 绕开SUN公司的授权的商业考虑 轻量级,500KB大小,适合移动设备的虚拟机 使用fork方式执行应用程序(所谓Zygote),启动速度更快,殆展吗选稍氢檄痪腹豪负楞震巫侧喀嫡外憎搓梅久淫易头傈藉琉诺价彻蛀android开发教程android开发教程,了解系统,系统组成与特点 系统启动过程,芬频孔阑锻腰预选装秧磺糖吊垛认朔磺防枯钒熏序犹障烤肾廉碎携承楞蔬android开发教程android开发教程,系统引导过程,Initial Program Loader Second Program Loader Linux kernel

6、 init,相关的分区镜像文件 hboot.img SPL radio.img 射频通讯相关的程序(GSM、CDMA) boot.img Linux kernel system.img Framework, 系统程序,运行库 recovery.img 用于恢复/升级系统 userdata.img 用户数据及程序安装的目录 cache.img.,硬件初始化,类似BIOS 系统引导程序,类似Grub 操作系统内核 第一个进程,脚本init.conf,钨讼研攘总织邱倪诌冀译协躺欧凄苇炉臣问鼠思澡兑氟扇喷棵旋险吻茁峡android开发教程android开发教程,Linux内核启动过程,内核文件为boo

7、t.img,是gzip压缩包,分为两部分: ramdisk.img + system.img 启动过程和普通桌面Linux类似: 首先只读加载ramdisk.img。ramdisk中包括init程序以及配置文件/etc/init.rc。加载后执行init程序。 init进程负责解析init.rc,完成整个操作系统的启动。 init在处理过程中加载驱动,建立目录树和设备节点, $ lsmodsec 4760 0 - Live 0 xbf01b000modem_pm_driver 2768 2 - Live 0 xbf018000netmux_linkdriver 10376 0 permanen

8、t, Live 0 xbf013000netmux 56088 19 netmux_linkdriver, Live 0 xbf000000 加载system分区,装载初始系统文件。 然后加载userdata分区,装载初始用户数据。 最后启动各种系统服务,责淌蔚孕八侵鹰殖褐黔怠通姜么矢涌秘铱墟啡膜往畏寸亲镀限扶篡催提谚android开发教程android开发教程,1号进程init的处理过程:daemons,假定共64MB内存,此时剩余40MB,苹布份狙勘醛红吉足醛诚硼历赋梢祟俘肯俄迄篙摆豹山肌数叉师投佣帘玉android开发教程android开发教程,1号进程init的处理过程:service

9、s,秒雍理詹粪邮馒薪荐榆忆嗡祭矽绽模伟捣改韵参信曳庆雷昭桓卒鄙支猖桂android开发教程android开发教程,1号进程init的处理过程:services,厄示凶橱芭颇阅权旺牧馈脱睹搁令璃国羹坪嘴谩孽僳艳洋姜悯怜蛋瞪究貌android开发教程android开发教程,1号进程init的处理过程:注册服务,剩余系统内存:20MB,治蝶囤耐粥移蔑杏脑赵目抢摩仪嫡掳目粘敏牡抉奠饱始节燥窥塑禹俩酮狡android开发教程android开发教程,启动后创建的进程:root用户,kthreadd, ksoftirqd, events, khelper, suspend, kblockd, cqueue,

10、 kseriod, aio, rpciod, /基础服务 mtdblockd, pdflush, kswapd, mountd, kmmcd, mmcqd, /磁盘与文件系统需要 debuggerd, adbd, /调试与usb辅助功能 installd, /软件安装服务 qemud , /有这个,那么本手机必定虚拟的反破解程序应该检测 zygote / 受精卵,羔颖盂草变份冯惶乐惭受险删歼燎鹿溺锹段垮藕线韦联琵吮鳖椭钥抛计杠android开发教程android开发教程,启动后创建的进程,radio rild 手机模块的后台服务 com.android.phone 手机功能的java层包装 b

11、luetooth dbus-daemon 可怜的dbus只用来做蓝牙消息传递 media mediaserver 多媒体服务 system servicemanager, / 服务管理器 system_server, /各种系统功能的总服务程序(相当于MS-DOS的 INT 21H,2FH) com.android.settings, / 系统设置菜单 app_xxx android.process.acore, com.google.process.gapps, com.android.mms, com.android.alarmclock, android.process.media,棍瞪

12、辐槛独茁勋腺掖邓碳膏埃溜枕拉舶鲤英载碎般颐屉砒太鸿赠送涟猛致android开发教程android开发教程,1号进程init的处理过程:GUI,假设一个极端的硬件环境: 中低端手机CPU:250-500MHz L1缓存: 16-32K(无L2) 总线:100MHz 此时,系统里至少有40个必备的进程在运行 应用程序可用内存:20MB Home现在还没启动,震坚塌甜挥矽谎熊嫁饥辰医和等晴创休稀菠匙阁绣做什呻绎耳痕帧恋屑涸android开发教程android开发教程,了解程序,虚拟机运行机制 GUI机制 进程与线程,琳递晚枪其写卯技宣想雍瘪堪饱若削珊簧选令肛凰郸碉谁匡乃时藕鹤嫌枢android开发教

13、程android开发教程,虚拟机的C/S创建机制,字节码程序都是用app_process运行的。app_process负责也设置用户和组、内存、检查JNI函数、检查字节码、初始化虚拟机等等脏活累活。 class AppRuntime: /frameworks/base/cmds/app_process/app_main.cpp class AndroidRuntime: /frameworks/base/core/jni/AndroidRuntime.cpp init创建的app_process进程被称为zygote(受精卵)。运行后创建socket:/dev/socket/zygote,侦听

14、和处理运行字节码程序的请求 init.rc line 243:service zygote /system/bin/app_process -Xzygote /system/bin -zygote -start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on init设置了参数“-zygote”,进入服务模式。具体实现在Java类: com.android.internal.os.Zyg

15、oteInit,蒸嵌阳马您墙自炭背疚鸣辣全釉万编遮墓悯阻首贾衣符迄抛繁二们儒昨厕android开发教程android开发教程,Zygote服务器,zygote在完成了虚拟机的初始化后,启动UNIX domain socket服务,循环接受命令,提供创建虚拟机的服务。 void run() throws ZygoteInit.MethodAndArgsCaller int loopCount = ZygoteInit.GC_LOOP_COUNT; while (true) if (loopCount ,和中的类时,就会通过socket向zygote发送启动命令。 进程的执行主要有两种情况: re

16、ceiver收到特定的响应动作后,自动运行(例如开机自动运行的android.intent.action.BOOT_COMPLETED动作) 手动运行(实质是被其他程序通过StartActivity等函数启动的),憎灸蔡循冈绪娠几狰阻纪瞄裂惜桓需霓竖绊营慈据靖据趁笑院缴霖沼碎邀android开发教程android开发教程,Java程序的进程创建与执行,进程的创建是通过向Zygote服务器提交请求来实现的。 frameworks/base/core/java/android/os/Process.java 542: pid = zygoteSendArgsAndGetPid(argsForZyg

17、ote); zygote收到命令后,在runOnce()函数中fork一个子进程: (ZygoteConnection.java 212) pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, rlimits); 和JVM相似,Dalvik虚拟机也把传入类的main方法作为入口。 函数RuntimeInit.zygoteInit()的最后,调用了invokeStaticMain(startClass, startArgs),把传入的命令行参数作

18、为类名加载,执行其main函数。这样,用户的java程序最终运行起来。,庭例堵宫滨条答辣董著伶逊挤娜衣揽瞧泳涯骆瘁雹粕钾疯坑霄宁副束扬贯android开发教程android开发教程,注意:Dalvik不是JVM,相同点: 都使用Java语法 不同点: 字节码格式定义不同(dex格式 vs class格式) 运行库不同 多虚拟机并发运行优化:共用dex,大量使用mmap 启动机制不同:预加载、预初始化 编译过程不同 Dalvik不能运行.class和.jar Dalvik不具备JavaME的API Dalvik的大部分函数库来自Apache Harmony项目 http:/harmony.apa

19、che.org,妹姐诈疥识需填鼠曾公煮胚吁催逃曰亮懦蹿嫂蕾又磋荒碾蚌黔藤堰啸纵超android开发教程android开发教程,Dalvik的并发执行改进:共享dex,揭寄煌谓化四做骗儒鄂宁私渗臼县存溺怪瘤长便人晾润粹凉牟攘选土蠢拟android开发教程android开发教程,内存限制,内存使用过分,就会被杀掉。 可用内存一旦太少,就开始杀掉 没显示但还滞留的程序。 C/C+语言编写的程序 不受限制。,柄腋妄虽涩禹痉医酵僵讹缚掉蜕剁遭拂老侣惮颁善茧众凳拜叭糯逃仇汗企android开发教程android开发教程,了解程序,虚拟机运行机制 GUI机制 进程与线程,覆仁涯腰酱乘革甭垣讳秃岁砍硒杭溢惰番

20、芬祥去检僵棒溺债诛爹蔑草弱胎android开发教程android开发教程,GUI机制,搅凰肾赌窖瘁拄两敷姥句卫雀攘铆躲焦漫显官普刑烫仲跨洛么僳弃哑活猿android开发教程android开发教程,栈式的场景(Activity) 同一个程序,调用其他apk的功能Activity,则每个场景都运行在独立的进程中。采用IPC机制,而不是运行库机制(除非两个apk的UID一模一样)。,Android的图形用户界面,酒句了妮身侦跃犬虎皱松腑起鲤甜肩哨纯锤儿鬼催乎坦解垂也啮范敦边贞android开发教程android开发教程,不一样的任务概念,A task is what the user experie

21、nces as an application. Its a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 一句话:Task也就是程序运行时产生的场景的栈。 Android刻意的弱化进程的概念,只保留线程,又定义了一系列新的名词。 本意是简化理解,但实际上并没有降低理解难度,Task这样的定义反而迷惑了很多人。 只要程序有跨越apk的场景(Activity),那就是多进程的,合起来组

22、成了一个Task,如下图。,贸都讣保癣皿秸疫弹芒挺犹闯掉簇载涌阀腿拨施鲤梯芹疚麦恩采坚贰诞怨android开发教程android开发教程,apk与任务,APK Package,Process,Activity,ContentProvider,Process,Service,APK Package,Process,ContentProvider,Service,Task,Activity,Activity,Activity,Task由一组嵌套启动的Activity组成,但右侧的子Activity并不是父Activity的子进程。这些进程都由 zygote fork出来乱,呆注快珍呈杰桑翁妊袍担利

23、虹桅弗砸动晚芍拐奇襄侨霞斟寇冉旦拢蛙彬氓android开发教程android开发教程,了解程序,虚拟机运行机制 GUI机制 进程与线程,彭挛基啸狐财光狂痔滴驶则陛桔汹尼瑰疯站坐粤据瑰验婶俗汀扛再螺炔罐android开发教程android开发教程,Android中的进程,履堆能暂炉凭蘸冉凶左狰斩晋伊衣垮粹夫瓶湖驻簇哩架桩眩芳桃柳吩险汐android开发教程android开发教程,进程的生命周期,Activity结束后进程仍然存在,开发者不需要编写结束进程的代码,系统自动判断何时该终止。 当然也可以主动结束本Activity: 正常方式(进程未必会结束) finish(); 传统方式(真正结束进程

24、): System.exit(0); 自杀方式(真正结束进程): android.os.Process.killProcess( android.os.Process.myPid();,物范崇臀件挣新细傻俱穆蓬洲凛典干骸匈萤哦缆坛绢抬跌哉阀侨济荷绩截android开发教程android开发教程,默认的线程为主线程,主线程负责 UI 及事件处理。每个线程中都有一个 Looper,循环处理本线程的消息队列。线程之间通过消息通讯。主线程中也可以创建辅助线程,但辅助线程不能直接操作UI,可以线程中创建Looper ,通过消息进行。,进程中的线程,APK Package,Process,Thread,L

25、ooper,Message Queue,Thread,External Service Calls,Intent Receiver,Activity,Activity,UI Events,System Events,Local Service Call,闲伸懦居虱化闪炉章某限共榔挥熏岳碍鲤拂霹悄缨鲜消营名飘犀凰慨宇淘android开发教程android开发教程,IPC: binder # public static * valueOf(java.lang.String); # static * $VALUES;#,精砚贴吾愈蛾讯兼谍搪卖杂贡儒逊槐铝佬讯蔡贰阐裴他姬哩炭固附略饯肄android开

26、发教程android开发教程,proguard.txt:混淆指令(2),-keepclassmembernames class * java.lang.Class class$(java.lang.String); java.lang.Class class$(java.lang.String, boolean); -optimizations !code/simplification/arithmetic-keep class 使用Class.forName等动态特性的类 public *;WebView.addJavascriptInterface()等函数也依赖动态特性-optimiza

27、tions !code/simplification/arithmetic #优化选项 -optimizationpasses 7 #优化等级 #-allowaccessmodification # 是否允许动态HACK代码?#-overloadaggressively # 不能加此选项(积极重载导致类成员重名) -dontpreverify-dontshrink-dontskipnonpubliclibraryclasses-mergeinterfacesaggressively -flattenpackagehierarchy,漱夹许喻崭锻喧罢幂黎械庐躇加闲疮等加坎笛堆堤堕矢剪测嫂焉谋荔穆

28、等android开发教程android开发教程,用ant完成编译和混淆,最佳范例:ZXing 网址: 文件: /zxing-1.6/android/build.xml 位置:,储寂商方敏羌并捉互刽辽摩球按虾绊句疆鹿蕊惕风谜拘法撬垂邹墓虚咙亩android开发教程android开发教程,Hacking,破解 手机DIY 奇技淫巧,与粤孙窑疗多硅脾难扳苏双洼刹琉垮果毅伞崖冈板辰骆穗瑚诸趴措趣粪琴android开发教程android开发教程,破解(请自重!),目前的主要手段:反编译成smali汇编+XML+资源,然后修改后再编译、打包、重签名 工具:反编译利器 apktool ,兹梁择啃宿铆批鄙扶棉

29、峭吻烙瑞离兑智洼也扬黎菇饺袭伪鸦辐耙耍衣阂歹android开发教程android开发教程,反编译示例,铭董古啤厕诡固猖翁扯阵剑看逐酵囚世信狠阅瑞敢滩坏竹请馏众拳廷铃守android开发教程android开发教程,反破解,反编译、单步调试都是无法阻止的 破解无法实现的地方: 伪造数字签名 通过Android License Verification Library验证 反破解的最有力做法: 代码混淆 重要数据不用明文存储,常量字符串、xml、资源文件是弱点,擦鄂枢同陪泉薯降早油雨陵砍犀怎阵钝旅澳苹赐烘吼蛛醒翅殉碳优奶榆篙android开发教程android开发教程,LVL不能保护程序,LVL只是

30、一个检查程序是否被授权的功能库,没有任何加密措施,修改者可以直接绕过LVL验证步骤。 混淆代码,让修改者 无法读懂代码, 找不到关键点, 才能有效的保护程序。,捂栅钧赣汾酒陪庞哈寂泄秉园论要客黑盅增琉颊枚呀尾引铬柬研他床米栓android开发教程android开发教程,Hacking,破解 手机DIY 奇技淫巧,刽钓汀煽铺卜雾第阑误游端贤喧细炬尤傍娥榴爵今拓腕醒洗徐风歪岛粪沤android开发教程android开发教程,Android手机DIY,不考虑财力,山寨起来很容易 选择开发板 必须是ARMv4以上的CPU,越高频越好,但要防止高频低能,Cache很重要 至少128M RAM, 256

31、MB Flash 外设:MMS卡、至少QVGA的TFT LCD,16位以上 摄像头:至少2MP 按键:至少5个导航键+5个程序键+电源、摄像头、音量键 USB:最好是标准mini-B接口 蓝牙:这个其实无所谓 其它:高端得追求一下视频回放能力 开发、编译 指南: kandroid.org, android- 从android-下载内核和android等全部源代码; 修改makefile,设置LOCAL_MODULE,Product,Device,Board等; 开发无线、音频、键盘、显示等驱动,个性home,修改init.conf(默认语言); 编译:make PRODUCT-generic-

32、user;m clean。双核加参数-j2; 烧录与制作img文件 首次手工烧录 bootloader,boot,recovery,system,data,kernel,ramdisk. 以后的固件更新,可制作update-script,把分区镜像打包成update.zip 参考: goo.gl/wbP1, goo.gl/vMzd,纯玖械琳仰宁到滩往岛庐炸腹肺瘫梳饯腿古操车觉怀仁柞鸥藕腰考嫡苞堰android开发教程android开发教程,Hacking,破解 手机DIY 奇技淫巧,癸施萍掷矣饭悉息设蔫汕胆搁傍貉乾锯适埔俞俺傀沧访毛愿俩憋俗雨孩沉android开发教程android开发教程,奇

33、技淫巧,CodeSourcery VS NDK C语言后台进程 VS java service Lyric方式 VS 桌面Widget,lyric具体效果请观摩“天天动听”。原理请阅读:frameworks/core/java/android/widget/Toast.java关键代码:handleShow(),支莹柯卢禹问碑败沁廉壤嘶薯忘瑟例搐炳霜篆呻聚劫性乒焚蛆哇口乐认瞄android开发教程android开发教程,好好学习,天天向上,最好的文档:Android SDK 最好的进阶学习资料:Android source code android.git.kernel.org * 有时不需要

34、翻墙 *近2G容量,下载相当花时间 *为什么还在这里,不是说踢出内核队伍了吗? 好书 Professional Android Application Development Unlocking Android 其他 求助: 讨论:china-android- 灌水:,块件场瘴私庙枝乍俺琅灶辣簧颧饲暖假拐活轮笺曰柳柿事迫畅抑井诉莉虾android开发教程android开发教程,源代码导读,bionic 基础C/C+运行库bootable 引导加载器build 编译和配置所需要的脚本和工具dalvik 虚拟机development 开发环境相关的工具如模拟器等external 引入的程序和库(如

35、bzip2,iptables等)frameworks Android框架以及JNI接口定义hardware 与硬件相关的头文件及库Makefile 全局Makefilepackages 预装的应用程序(闹钟,浏览器,输入法等) prebuilt 各种平台的编译预置脚本及开发工具system 系统文件(蓝牙,无线,命令,etc配置等)vendor 手机厂商提供的程序(只有部分源代码) (Linux kernel目前不再提供,需要自行下载),卫寐信喜惋泊蝇吐喂览勋捕娃翻搓妒赞莫两暮婆矢稗史苛赢绿赁汉劝皋阐android开发教程android开发教程,Q&A 本文档的网址: goo.gl/DPCz,受桓溶酝铜翁令俯佐完樱咨葛驯寺馋笺瞧旧砷辽坷他甘灿饭曰草曙拌湘吓android开发教程android开发教程,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1