哈工大计算机科学与技术学院软件基础教研室 第二部分 Android 与工程和科研 授课教师:李治军 综合楼 411 室 第 6 讲 进入 Android 内核 Lecture 6: Get Into the Android Kernels.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第 2 章 Java 运行环境搭建 2.1 Java 的运行系统 2.1 Java 的运行系统 2.2 JDK 的安装与配置2.2 JDK 的安装与配置 2.3 Java 开发工具包 2.4 Java 源文件编辑环境的选择 2.5 Application 和 Applet 程序的编写与运行.
Java 程序分类 Java Application :是完整程序,需要独立的解 释器解释运行;以 “.java” 为后缀的文件,以 main() 方法作为程序入口,由 java 编译器编译生 成字节码,由 Java 解释器加载执行字节码。 Java Applet 没有 main() 方法作为程序入口,是嵌在.
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
第四章 类、对象和接口.
第二章:行動裝置與擴增實境.
项目6 通用堆栈.
南山中學 102學年度 性別平等教育週性別教育 性騷擾防治.
《 Java开发环境配置》 主讲人:耿力.
課程地圖 (104年入學-日間部) 校通識核心 專業課程 必修與選修 與管理模組 網路技術 App設計與應用模組 學院通識核心 學院專業核心
Java程序设计教程 第一讲 Java概述.
浅谈我与Android相处的点滴 一、个人自动化经验分享 二、Android基本架构了解 三、MonkeyTest指令学习
四資二甲 第三週作業 物件導向程式設計.
Android移动应用安全 加固方案介绍 北京大学 软件与微电子学院 2017年3月.
面向对象的程序设计(一).
實驗五:多媒體播放器選單介面.
北京市科普项目社会征集指南及 项目建议方案解读
OUTLINE Android app Devolpment Flow App反組譯解說 實例 簽名詳解 DalvikByteCode
基于Android的开源平板电脑 (FSPAD723)系统构成分析
基于ARM和linux的开发 华中科技大学 武汉创维特 2017/3/20.
基于操作系统的编程复习 张玉宏
Activity之间的数据传递.
Android App 系統開發教學 Luna 陳雯琳 2014/12/18
建立Android新專案 建國科技大學 資管系 饒瑞佶 2010/10.
厦门大学数据库实验室 报告人:谢荣东 导师:林子雨 2014年8月30日
APP課程:Android程式設計開發環境與工具介紹
Review: Android简介.
實驗四:單位轉換程式.
實驗十三:顯示目前經緯度位置.
ANDROID與OSGI平台整合.
配置编译内核.
使用Android控制Arduino 史先强
Introduction on Smartphone Platform
Android SDK工具 Android智慧型手機程式設計 建國科技大學 資管系 饒瑞佶 2012/4 V1 2012/8 V2
第11章 Android GPS位置服务与地图编程
第一个Android程序 本讲大纲: 1、创建Android应用程序 2、Android项目结构说明 3、运行Android应用程序
本單元介紹何謂變數,及說明變數的宣告方式。
第14章 Bootloader基本概念與燒錄.
第4章 Android生命周期.
Android 课程讲义 智能手机开发
Native Development Kit
實驗十四:顯示與控制地圖.
第2讲 移动应用开发基础知识(二) 宋婕
在專用的嵌入式板子運行 GNU/Linux 系統已經變得越來越流行。一個嵌入式 Linux 系統從軟體的角度看通常可以分為四個層次:
Java基础入门 第1章 Java开发入门 · Java语言的特点 · Java开发环境的搭建 · 环境变量的配置 · Java的运行机制.
建立Android新專案 Android智慧型手機程式設計 程式設計與應用班 建國科技大學 資管系 饒瑞佶 2012/4 V1
第8章 Service解析.
Android手动测试实践 ——绮珠.
嵌入式系统的Boot Loader技术 陈文智 浙江大学计算机学院 2009年5月.
作業系統實習課(三) -建造新的System Call-
(第2版).
C/C++/Java 哪些值不是头等程序对象
第10章 GPS位置服务与地图编程.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3.
利用ICE通信中间件构建分布式应用程序开发框架
Author:BobZhang Copy Right 2007
JAVA 编 程 技 术 主编 贾振华 2010年1月.
(第2版).
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab3.
嵌入式Linux开发流程 成都研究所操作系统团队.
Location Based Services - LBS
第二章 Java语法基础.
实验一:编译运行Linux内核并使用gdb进行调试
實驗十六:匯出APK安裝檔與軟體上架.
第二章 Java基本语法 讲师:复凡.
实验二:添加Linux系统调用及熟悉常见系统调用
辅导课程十二.
第2章 Java语言基础.
Android进程间通讯.
Part 8 Broadcast Receiver、Service和App Widget
Presentation transcript:

哈工大计算机科学与技术学院软件基础教研室 第二部分 Android 与工程和科研 授课教师:李治军 综合楼 411 室 第 6 讲 进入 Android 内核 Lecture 6: Get Into the Android Kernels

- 2 - Android Development Android 的内部结构 应用程序层 应用程序框 架层 系统运行库 层 Linux 内核层

- 3 - Android Development Android 的应用程序层 就是我们用到的各种手机应用程序 … 如主屏、短信收发、通信录、浏览器等等 … 这些程序都是用 Java 语言编写、调用应用程序框架层 (Application Framework) 提供的 API 编写,如 getSystemService, getScanResultsdeng 等 … 前面写的程序都是应用程序,关键在于 Activity , Intent 等机制、各类 Manager 以及重要 API 的调用

- 4 - Android Development Android 的应用程序框架层 用来给上层程序提供 API 框架,就是常说的 Manager… 有 ActivityManager , WifiManager ,等等 这一层之上代码是用 Java 写的,之下使用 C 写的,所 以这是一个从 Java 到 C 的一个过度,就是 JNI Java Native Interface (JNI) 允许 Java 代码和其他语 言写的代码进行交互

- 5 - Android Development Android 的运行库层 包括核心库和 Dalvik 虚拟机两个部分 核心库是用 C 语言写的一些库功能,比如 Media Framework 采用 OpenCORE 提供视频编、解码功能 每一个 Android 应用程序都在自己的进程中运行,拥 有一个独立的 Dalvik 虚拟机 整个系统采用虚拟 机结构

- 6 - Android Development Android 的 Linux 内核层 基于 Linux 操作系统的核心:进程管理、内存管理、网 络栈、各种设备的驱动等 Android 对内核有了一定的增强,如日志设备,电源管 理, Android IPC(Binder) 机制等 在 Android 中,这个层是硬件层和其他层之间的抽象层, 该系统并非 GNU/Linux 的,其初始化、接口都和标准 的 Linux 有所不同

- 7 - Android Development 一个例子来这些模块之间的关系 Application Location Manager Service libgps.so Gps 设备驱动 应用层 框架层 库层 内核层 Binder IPC JNI 系统调用

- 8 - Android Development 学习 JNI 就是看一看如何使用 JNI 来调用 C 库中的函数 public class TrackActivity extends Activity { static { System.loadLibrary("track"); } 首先需要有一个 C 库, libtrack.so ,并导入 … 需要告诉 Java ,要调用 C 库中的哪些函数 public native String GetTrack(); public void onCreate() { String str = GetTrack(); // 进行地图展示 这样声明以后就可 以 Java 编译了 现在可以开始写 C 函数了 javah -classpath bin -d jni 包名.TrackActivity

- 9 - Android Development 有了.h 文件才可以编写.c 文件 javah 可以自动生成 JNI 对应的 C 头文件 #include JNIEXPORT jstring JNICALL Java_com_hit_os_Trac kActivity_GetTrack(JNIEnv *, jobject); 现在可以写 C 库中的函数了 #include "com_hit_os_track.h" JNIEXPORT jstring JNICALL Java_com_hit_os_TrackA ctivity_GetTrack(JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env,(char *) “ 轨迹数据 ”);} 现在可以编译了,要使用 NDK(Native Development Kit) 编译,不是 gcc ,因为是 arm 结构,并且有 jint…

Android Development 现在开始编译 C 库、使用 C 库 编译使用命令 ndk-build ,类似 make 命令 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtrack LOCAL_SRC_FILES:= com_hit_os_track.c include $(BUILD_SHARED_LIBRARY) 将这个.so 文件拷贝到工程的根目录下 需要写 Makefile 文件: Android.mk 会编译成 libtrack.so 文件 会放在.apk 中,然 后拷到 /data/data/ 你的包 也可以 adb push 到 /system/lib 下

Android Development 开始修改 Linux 内核,给内核加系统调用 思路和 Linux 0.11 基本上一样 CALL(sys_gettrack) 在函数表中增加一个函数,就是系统调用处理函数 建立一个号 ( 整数 ) 来标识新的系统调用 #define __NR_gettrack (__NR_SYSCALL_BASE+322) 实现 sys_gettrack ,新建 track 目录和其下的 track.c SYSCALL_DEFINE1(gettrack, char *, retstr) { return do_sys_gettrack(retstr); } 这个宏在 #include 中 在 arch/arm/kernel/calls.S 中 在 include/asm-arm/unistd.h 中

Android Development 实现函数 do_sys_gettrack 并编译 gettrack 的功能是从内核中返回一个包含 gps 坐 标序列的字符串 #include int do_sys_gettrack(char * retstr){ char kernelstr[20] = "kernel track"; copy_to_user(retstr, kernelstr, 12); return 12; } 开始编译内核,首先写 Makefile core-y += kernel/ mm/ fs/... track/ objs-y += track.o

Android Development 开始编译 Linux 内核 定义两个宏,在 Makefile 中使用 export ARCH=arm export CROSS_COMPILE=/home/lizhijun/android- ndk-r6b/toolchains/arm-linux-androideabi /prebuilt/linux-x86/bin/arm-linux- androideabi- arm 体系结构 配置内核,需要哪些模块等 交叉编译环境 make herring_defconfig 开始编译 make 或者是 make –j4 // 表示用几核编译 grep -c processor /proc/cpuinfo 编译后的结果是 /arch/arm/boot/zImage

Android Development 有了内核就可以刷机了 首先需要知道你的手机的 boot 在哪个分区 adb shell cat /proc/mtd | awk -F’[:"]‘ ‘$3 == "boot" {print $1}’ 结果是 mtd2 ,根据手 机型号而不同 取出你的手机的 boot 分区内容 adb shell # su # dd if=/dev/mtd/mtd2 of=/sdcard/boot.img bs= records in records out bytes transferred in secs ( bytes/sec) 需要有 root 权限, 需要破解

Android Development 需要产生你的 boot.img 先把那个 sdcard 上的 boot.img 弄过来 adb pull /sdcard/boot.img 会放到当前目录下 拆开这个 img 文件 unbootimg boot.img 这些工具都能下到 拆开以后有三个文件 boot.img-mk : containing the mkbootimg options required to produce a working boot image boot.img-kernel : containing the kernel image boot.img-ramdisk.cpio.gz : containing the gzipped ramdisk, which we will reuse as-is

Android Development 用 zImage 替换 boot.img-kernel 用我们编译形成的 zImage 替换其中 boot.img- kernel 就产生可以刷机的 boot.img 了 eval./mkbootimg $(sed s,boot.img- kernel,./zImage, boot.img-mk) 产生完 boot.img 就可以刷机了 adb reboot bootloader // 让手机会进入 fastboot 模式./fastboot boot boot.img // 载入新的 boot.img 并启动./fastboot flash boot boot.img // 将新的 boot.img 写入 mtd2 ,并启动

Android Development 启动了新内核以后 … 新内核的 “ 某个函数表 ” 中有了函数 sys_gettrack JNIEXPORT jstring JNICALL Java_xxx (JNIEnv *env, jobject obj){ char str[20]; int size = gettrack(str); str[size] = 0; return (*env)->NewStringUTF(env, str); } 在上层调用这个函数 ( 在 JNI 的那个 C 函数中 ) 用宏展开实现 gettrack /*#define _syscall1(name, type, arg1) \ int name(type arg1) { \ return syscall(__NR_##name, arg1); } \ syscall1(gettrack, char*, str)

Android Development syscall 在 ndk 的头文件 中定义了原型 实质是使用 swi 软中断指令进管理模式 syscall(int number, …) , number 是一个编号, … 是 可以扩展的参数列表 … 在 ndk 的库中有实现:根据 number 编号跳到内核函数 表中的某个位置,然后将参数一个一个拷贝过去 #include #define __NR_gettrack (__NR_SYSCALL_BASE+376) 在 eabi(Embedded application binary interface) 中 是连接规范 mov r0, #num swi 0x00 // 调用软件中断