《android开发教程》PPT课件.ppt_第1页
《android开发教程》PPT课件.ppt_第2页
《android开发教程》PPT课件.ppt_第3页
《android开发教程》PPT课件.ppt_第4页
《android开发教程》PPT课件.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android开发杂谈,广州网易,闻波 wenbob,了解系统 了解程序 优化与混淆 Hacking,内容提要,了解系统,系统组成与特点 系统启动过程,典型的手机硬件方案,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 Android JNI Android Dalvik VM Userspace drivers Linux Kernel 精简版的IPC补丁:Binder 更积极的电源管理:没有人宣布要用的部件,就关掉,函数调用关系,Android的重要特色,HAL 许多驱动程序以用户态的方式运行,依赖内核的HAL机制。CameraService、SurfaceFlinger、AudioFlinger等都位于用户态。 Bionic 精简版的C/C+运行库,类似于嵌入式系统中常用的uCLib。 被重复发明的轮子。为什么不用uCLib?商业用途的版权考虑,不想被LGPL限制。 Surface Flinger 表面渲染,目前是比较低效的C代码实现,有待芯片厂商来改善。,Android的重要特色,Browser Webkit移植版,并不是Chrome,无Plugins接口 内置Google gears(无源代码) 2.x提供了更多的HTML5特性,如本地存储等 不支持文件上传 input type=“file“. Dalvik VM 为什么又发明了轮子 : 绕开SUN公司的授权的商业考虑 轻量级,500KB大小,适合移动设备的虚拟机 使用fork方式执行应用程序(所谓Zygote),启动速度更快,了解系统,系统组成与特点 系统启动过程,系统引导过程,Initial Program Loader Second Program Loader Linux kernel 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,Linux内核启动过程,内核文件为boot.img,是gzip压缩包,分为两部分: ramdisk.img + system.img 启动过程和普通桌面Linux类似: 首先只读加载ramdisk.img。ramdisk中包括init程序以及配置文件/etc/init.rc。加载后执行init程序。 init进程负责解析init.rc,完成整个操作系统的启动。 init在处理过程中加载驱动,建立目录树和设备节点, $ lsmod sec 4760 0 - Live 0xbf01b000 modem_pm_driver 2768 2 - Live 0xbf018000 netmux_linkdriver 10376 0 permanent, Live 0xbf013000 netmux 56088 19 netmux_linkdriver, Live 0xbf000000 加载system分区,装载初始系统文件。 然后加载userdata分区,装载初始用户数据。 最后启动各种系统服务,1号进程init的处理过程:daemons,假定共64MB内存,此时剩余40MB,1号进程init的处理过程:services,1号进程init的处理过程:services,1号进程init的处理过程:注册服务,剩余系统内存:20MB,启动后创建的进程:root用户,kthreadd, ksoftirqd, events, khelper, suspend, kblockd, cqueue, kseriod, aio, rpciod, /基础服务 mtdblockd, pdflush, kswapd, mountd, kmmcd, mmcqd, /磁盘与文件系统需要 debuggerd, adbd, /调试与usb辅助功能 installd, /软件安装服务 qemud , /有这个,那么本手机必定虚拟的反破解程序应该检测 zygote / 受精卵,启动后创建的进程,radio rild 手机模块的后台服务 com.android.phone 手机功能的java层包装 bluetooth dbus-daemon 可怜的dbus只用来做蓝牙消息传递 media mediaserver 多媒体服务 system servicemanager, / 服务管理器 system_server, /各种系统功能的总服务程序(相当于MS-DOS的 INT 21H,2FH) com.android.settings, / 系统设置菜单 app_xxx cess.acore, cess.gapps, com.android.mms, com.android.alarmclock, cess.media,1号进程init的处理过程:GUI,假设一个极端的硬件环境: 中低端手机CPU:250-500MHz L1缓存: 16-32K(无L2) 总线:100MHz 此时,系统里至少有40个必备的进程在运行 应用程序可用内存:20MB Home现在还没启动,了解程序,虚拟机运行机制 GUI机制 进程与线程,虚拟机的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,侦听和处理运行字节码程序的请求 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类: ernal.os.ZygoteInit,Zygote服务器,zygote在完成了虚拟机的初始化后,启动UNIX domain socket服务,循环接受命令,提供创建虚拟机的服务。 void run() throws ZygoteInit.MethodAndArgsCaller int loopCount = ZygoteInit.GC_LOOP_COUNT; while (true) if (loopCount ,和中的类时,就会通过socket向zygote发送启动命令。 进程的执行主要有两种情况: receiver收到特定的响应动作后,自动运行(例如开机自动运行的ent.action.BOOT_COMPLETED动作) 手动运行(实质是被其他程序通过StartActivity等函数启动的),Java程序的进程创建与执行,进程的创建是通过向Zygote服务器提交请求来实现的。 frameworks/base/core/java/android/os/Process.java 542: pid = zygoteSendArgsAndGetPid(argsForZygote); 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),把传入的命令行参数作为类名加载,执行其main函数。这样,用户的java程序最终运行起来。,注意:Dalvik不是JVM,相同点: 都使用Java语法 不同点: 字节码格式定义不同(dex格式 vs class格式) 运行库不同 多虚拟机并发运行优化:共用dex,大量使用mmap 启动机制不同:预加载、预初始化 编译过程不同 Dalvik不能运行.class和.jar Dalvik不具备JavaME的API Dalvik的大部分函数库来自Apache Harmony项目 ,Dalvik的并发执行改进:共享dex,内存限制,内存使用过分,就会被杀掉。 可用内存一旦太少,就开始杀掉 没显示但还滞留的程序。 C/C+语言编写的程序 不受限制。,了解程序,虚拟机运行机制 GUI机制 进程与线程,GUI机制,栈式的场景(Activity) 同一个程序,调用其他apk的功能Activity,则每个场景都运行在独立的进程中。采用IPC机制,而不是运行库机制(除非两个apk的UID一模一样)。,Android的图形用户界面,不一样的任务概念,A task is what the user experiences 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),那就是多进程的,合起来组成了一个Task,如下图。,apk与任务,APK Package,Process,Activity,ContentProvider,Process,Service,APK Package,Process,ContentProvider,Service,Task,Activity,Activity,Activity,Task由一组嵌套启动的Activity组成,但右侧的子Activity并不是父Activity的子进程。这些进程都由 zygote fork出来乱,了解程序,虚拟机运行机制 GUI机制 进程与线程,Android中的进程,进程的生命周期,Activity结束后进程仍然存在,开发者不需要编写结束进程的代码,系统自动判断何时该终止。 当然也可以主动结束本Activity: 正常方式(进程未必会结束) finish(); 传统方式(真正结束进程): System.exit(0); 自杀方式(真正结束进程): android.os.Process.killProcess( android.os.Process.myPid();,默认的线程为主线程,主线程负责 UI 及事件处理。每个线程中都有一个 Looper,循环处理本线程的消息队列。线程之间通过消息通讯。主线程中也可以创建辅助线程,但辅助线程不能直接操作UI,可以线程中创建Looper ,通过消息进行。,进程中的线程,APK Package,Process,Thread,Looper,Message Queue,Thread,External Service Calls,Intent Receiver,Activity,Activity,UI Events,System Events,Local Service Call,IPC: binder & Parcelables,binder:轻量级的IPC机制,仅依赖内核中的binder driver。 优点:通过mmap()共享内存,不执行序列化,不复制内存。 Parcelables指的是可通过共享内存进行IPC传递的对象,与Java对象的序列化相似但不同,序列化是相当消耗CPU的。父子Activity间就是用binder传递数据的。,Kernel,Process,Binder,Bundle,Intent Receiver,Activity,Custom Objects,Service,Parcel,Parcelable,优化与混淆,省电 程序优化 编译与混淆,电池,现状 大多数资费套餐都限制流量 基本没有Wifi 假设下载一首6MB的音乐: EDGE (90kbps): 300mA * 9.1 min = 45 mAh 3G (300kbps): 210mA * 2.7 min = 9.5 mAh WiFi (1Mbps): 330mA * 48 sec = 4.4 mAh 动作/磁力传感器耗电量: 普通(用来判断方向等): 10-15 mA 游戏(作为输入设备): 80 mA 频繁使用: 90 mA 提示: 外部网络(Wifi)、GPS都是很省电的,减少用电量,建立连接前按Wifi-3G-2G顺序检查网络 不要保持2G/3G连接 wifi可用时,尽量用push,不要用定时查询 优化应用程序的设计和算法 使用简单高效的数据 使用gzip压缩 数据流树-节点层次结构 Ex, protobufjsonxml,优化与混淆,省电 程序优化 编译与混淆,程序优化:关心时间代价,0.04 ms:向pipe里写1字节(A-B, B-A),或者简单的从/proc文件里读1字节 0.12 ms:void/void参数的Binder RPC调用(A-B, B-A) 5-25 ms:无缓存从flash读取1字节 5-200+(!) ms:无缓存向flash写入少量数据 16 ms:60 fps 视频的一帧 41 ms:24 fps 视频的一帧 100-200 ms:人类可以觉察到的延迟 108/350/500/800 ms:在3G网络上ping,延时变化大 1-6+ seconds:TCP设置 + 用HTTP通过3G下载6k数据,算法与界面的优化,调整程序的进程结构 减少进程数量(善用ViewStub、ViewSwitch等) 减少进程周期循环次数,及时让进程休眠 不编写长寿代码,只在需要时运行,服务应快速完成并立即结束 调整算法,取消不必要的环节,减少对CPU和内存的需求 减少函数调用次数 适当使用JNI 精心设计界面 避免复杂布局。控制嵌套和View数量,善用Merge、inflate()、RelativeLayout等 去除不必要的背景、动画 执行长时间、耗电的任务之前检查电量、提示用户,应用程序的优化,代码优化的关键 少用浮点运算、文件、pipe、数据库访问 用高效的方式:StringBuffer代替大量临时String,SoundPool代替多个MediaPlayer,texture代替canvas, Log.d() 代替System.out.print(),避免invalidate() 重视onMeasure/onLayout/onDraw/onTouchEvent/getView等函数的效率 游戏开发 少用new()/enum/Iterator/HashMap/Arrays.sort()/Class.getXXX() 多用private、final、局部变量, 2D善用draw_texture、3D善用VBO顶点缓冲 触屏事件时,暂停接受运动感应事件 用NDK实现关键代码 不要求速度时,可用WebView和网页实现界面 编译时执行代码优化,不重复发明轮子,动画特效,用Animation,不要用定时器自绘 异步UI操作,用AsyncTask,不要用自定义消息 定时器,用Alarm,不要用Timer、Thread 访问网站,用HttpClient,不要用Socket 即时通讯,用gtalkservice,不要自定通讯协议,优化与混淆,省电 程序优化 混淆,apk的编译生成,Dex文件的改进:在apk内共享常量池,代码优化与混淆:方法,使用工具: proguard 网址: adt的编译过程是固定死的,无法定制,不能在Eclipse里直接完成。 实现方法有两种: 1、编写编译脚本 2、用ant,编写xml 二者没有实质的不同。,代码优化与混淆:实现脚本,aapt package -f -m -J gen -M AndroidManifest.xml -S res -A assets -I path/to/android.jar -F bin/resources.ap_ javac -d bin/classes -classpath bin/classes:xxx.jar -sourcepath src:gen -target 1.5 -bootclasspath path/to/android.jar “gen/xxx/R.java src/xxx/*.java .“ #替换jar cvfm bin/xxx.jar manifest.mf bin/classes java -jar proguard.jar -injars bin/classes -outjar bin/xxx.jar -libraryjars path/to/android.jar proguard.txt dx -dex -output=bin/classes.dex bin/xxx.jar apkbuilder bin/xxx_unalign.apk -u -z bin/resources.ap_ -f bin/classes.dex jarsigner -keystore path/to/keystore -storepass 存储密码 -keypass 密码 bin/xxx-unalign.apk zipalign -f 4 bin/xxx-unalign.apk bin/xxx.apk,proguard.txt:混淆指令(1),-keep public class * extends 需要保留的类 必须保留的类: android.app.Activity android.app.Service android.content.BroadcastReceiver android.content.ContentProvider android.view.View 因为这些类和Framework代码直接耦合,被抹去名字,程序就无法运行。 其它可能需要保留的(视程序实现代码而定) #-keep interface * #-keep enum * #-keepclassmembers public enum * #-keepclassmembers enum * # public static * values(); # public static * valueOf(java.lang.String); # static * $VALUES; #,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()等函数也依赖动态特性 -optimizations !code/simplification/arithmetic #优化选项 -optimizationpasses 7 #优化等级 #-allowaccessmodification # 是否允许动态HACK代码? #-overloadaggressively # 不能加此选项(积极重载导致类成员重名) -dontpreverify -dontshrink -dontskipnonpubliclibraryclasses -mergeinterfacesaggressively -flattenpackagehierarchy,用ant完成编译和混淆,最佳范例:ZXing 网址:/p/zxing/ 文件: /zxing-1.6/android/build.xml 位置:,Hacking,破解 手机DIY 奇技淫巧,破解(请自重!),目前的主要手段:反编译成smali汇编+XML+资源,然后修改后再编译、打包、重签名 工具:反编译利器 apktool /p/android-apktool,反编译示例,反破解,反编译、单步调试都是无法阻止的 破解无法实现的地方: 伪造数字签名 通过Android License Verification Library验证 反破解的最有力做法: 代码混淆 重要数据不用明文存储,常量字符串、xml、资源文件是弱点,LVL不能保护程序,LVL只是一个检查程序是否被授权的功能库,没有任何加密措施,修改者可以直接绕过LVL验证步骤。 混淆代码,让修改者 无法读懂代码, 找不到关键点, 才能有效的保护程序。,Hacking,破解 手机DIY 奇技淫巧,Android手机DIY,不考虑财力,山寨起来很容易 选择开发板 必须是ARMv4以上的CPU,越高频越好,但要防止高频低能,Cache很重要 至少128M RAM, 256 MB Flash 外设:MMS卡、至少QVGA的TFT LCD,16位以上 摄像头:至少2MP 按键:至少5个导航键+5个程序键+电源、摄像头、音量键 USB:最好是标准mini-B接口 蓝牙:这个其实无所谓 其它:高端得追求一下视频回放能力 开发、编译 指南:/porting, , /wiki 从下载内核和android等全部源代码; 修改makefile,设置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论