116

Click here to load reader

From Android NDK To AOSP

Embed Size (px)

Citation preview

Page 1: From Android NDK To AOSP

FROM ANDROID NDKTO AOSP

Bekket McClane @SITCON2015

Page 2: From Android NDK To AOSP

WHO AM I ?

Page 3: From Android NDK To AOSP

WHO AM I ?

⺠民2

Page 4: From Android NDK To AOSP

WHO AM I ?

BEKKET MCCLANE

Page 5: From Android NDK To AOSP

WHO AM I ?

MSHOCKWAVE

Page 6: From Android NDK To AOSP

DEPARTMENT OF COMPUTER SCIENCE

Freshman

Page 7: From Android NDK To AOSP

VLC FOR ANDROID

Page 8: From Android NDK To AOSP

TODAY’S TOPIC

• GRAPHIC RENDERING• GAME• SECURITY

Page 9: From Android NDK To AOSP

TODAY’S TOPIC

• GRAPHIC RENDERING• GAME• SECURITY

Page 10: From Android NDK To AOSP

TODAY’S TOPIC

• GRAPHIC RENDERING• GAME• SECURITY

Page 11: From Android NDK To AOSP

TODAY’S TOPIC

• GRAPHIC RENDERING• GAME• SECURITY

Page 12: From Android NDK To AOSP

TODAY’S TOPIC

• GRAPHIC RENDERING• GAME• SECURITY

LEARNING

Page 13: From Android NDK To AOSP

• Android NDK Introduction

• AOSP Overview

• From NDK To AOSP

• Example

SYLLABUS

Page 14: From Android NDK To AOSP

ANDROID NDK INTRODUCTION

Page 15: From Android NDK To AOSP

APP

JNI

Native Library ( .so )

Page 16: From Android NDK To AOSP
Page 17: From Android NDK To AOSP

No More Interpreting!!

Page 18: From Android NDK To AOSP

• Graphic Rendering (Ex. OpenGL)

• Multi Media (Ex. OpenMAX)

• Game

Page 19: From Android NDK To AOSP

JNI PROGRAMMING

Page 20: From Android NDK To AOSP

JNI PROGRAMMING

Page 21: From Android NDK To AOSP

OFFICIAL REFERENCE

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html

Page 22: From Android NDK To AOSP

Android.mk

Page 23: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Page 24: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Page 25: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Another makefile

Page 26: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Another makefile

Page 27: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Another makefile

Compiler Options

Page 28: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Another makefile

Compiler Options

Page 29: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

Another makefile

Compiler Options

The real “builder” makefile

Page 30: From Android NDK To AOSP

1 LOCAL_PATH := $(call my-dir)

2 include $(CLEAR_VARS)

3 LOCAL_MODULE := foo

4 LOCAL_SRC_FILES := bar.c

5 #LOCAL_CFLAGS += -DDUMMY_FLAG

6 #LOCAL_LDLIBS += -llog

7 include $(BUILD_SHARED_LIBRARY)

libfoo.so (in this case)

Another makefile

Compiler Options

The real “builder” makefile

Page 31: From Android NDK To AOSP

$ ndk-build

$ ndk-build -B

Page 32: From Android NDK To AOSP

$ ndk-build

($ ndk-build NDK_DEBUG=1)

$ ndk-build -B

Page 33: From Android NDK To AOSP

AOSP OVERVIEW

Page 34: From Android NDK To AOSP

AOSP

= Android Open Source Project

(vendors’ property libraries)

Page 35: From Android NDK To AOSP

AOSP

= Android Open Source Project

NOT INCLUDED

(vendors’ property libraries)

Page 36: From Android NDK To AOSP

Zygote

Page 37: From Android NDK To AOSP
Page 38: From Android NDK To AOSP
Page 39: From Android NDK To AOSP

Zygote( Java World )

Page 40: From Android NDK To AOSP

Zygote

Requestvia Local Socket

( Java World )

Page 41: From Android NDK To AOSP

Zygotefork

app_01

app_02 app_03

Requestvia Local Socket

( Java World )

Page 42: From Android NDK To AOSP

Zygotefork

app_01

app_02 app_03

Shared address space

Requestvia Local Socket

( Java World )

Page 43: From Android NDK To AOSP

Pros: Preload Java Classes

Page 44: From Android NDK To AOSP

$ adb shell ps \

| grep -e "u0_" -e "zygote" \

| awk '{print $1,"\t",$2,"\t",$3,"\t",$9}'

Page 45: From Android NDK To AOSP

root 328 1 zygote

u0_a24 1051 328 com.android.systemui

u0_a8 1151 328 com.asus.launcher

u0_a20 1351 328 com.google.process.gapps

User PID PPID Process Name

.

.

.

Page 46: From Android NDK To AOSP

root 328 1 zygote

u0_a24 1051 328 com.android.systemui

u0_a8 1151 328 com.asus.launcher

u0_a20 1351 328 com.google.process.gapps

User PID PPID Process Name

.

.

.

Page 47: From Android NDK To AOSP

And their friends

System Services

Page 48: From Android NDK To AOSP

Service Manager

Java Services

Native Services

App

Page 49: From Android NDK To AOSP

Service Manager

Java Services

Native Services

App

addService

Page 50: From Android NDK To AOSP

Service Manager

Java Services

Native Services

App

QueryaddService

Page 51: From Android NDK To AOSP

Service Manager

Java Services

Native Services

App

QueryaddService

Communicatevia IPC

Page 52: From Android NDK To AOSP

system 979 328 system_server

root 328 1 zygote

media 331 1 /system/bin/mediaserver

system 316 1 /system/bin/servicemanager

Page 53: From Android NDK To AOSP

system 979 328 system_server

root 328 1 zygote

media 331 1 /system/bin/mediaserver

system 316 1 /system/bin/servicemanager

Most of the Java services live in here

Page 54: From Android NDK To AOSP

system 979 328 system_server

root 328 1 zygote

media 331 1 /system/bin/mediaserver

system 316 1 /system/bin/servicemanager

Most of the Java services live in here

One of native services

Page 55: From Android NDK To AOSP

Binder IPC

Page 56: From Android NDK To AOSP

HIGHLIGHT

send() / recv()-like APIs

Page 57: From Android NDK To AOSP

HIGHLIGHT

send() / recv()-like APIs

Page 58: From Android NDK To AOSP

• Still need kernel’s help

• Heavily object oriented

• Put “transmission part” and “logic part” together

Page 59: From Android NDK To AOSP

• Still need kernel’s help

• Heavily object oriented

• Put “transmission part” and “logic part” together

(Interface, Inheritance…etc)

Page 60: From Android NDK To AOSP

• Still need kernel’s help

• Heavily object oriented

• Put “transmission part” and “logic part” together(Inheritance)

(Interface, Inheritance…etc)

Page 61: From Android NDK To AOSP

EX: AIDL PROGRAMMING

IMyLight led;

led = IMyLight.Stub.asInterface(binder);

led.turnOn();

Page 62: From Android NDK To AOSP

EX: AIDL PROGRAMMING

IMyLight led;

led = IMyLight.Stub.asInterface(binder);

led.turnOn();The real “messenger”

Page 63: From Android NDK To AOSP

EX: AIDL PROGRAMMING

IMyLight led;

led = IMyLight.Stub.asInterface(binder);

led.turnOn();The real “messenger”

Page 64: From Android NDK To AOSP

EX: AIDL PROGRAMMING

IMyLight led;

led = IMyLight.Stub.asInterface(binder);

led.turnOn();Interface The real “messenger”

Page 65: From Android NDK To AOSP

From NDK To AOSP

Page 66: From Android NDK To AOSP

FACT:

Page 67: From Android NDK To AOSP

b6beb000 156K r-xp /system/lib/libbinder.so

b6b22000 4K r-xp /system/lib/libhardware.so

PMAP RESULT

Page 68: From Android NDK To AOSP

– NOT Barack Obama

“If there is a way, there’s a will”

Page 69: From Android NDK To AOSP

“If there is a way, there’s a will”

“If there is a LIBRARY in the address space, there are SYMBOLS (we can use)”

Page 70: From Android NDK To AOSP
Page 71: From Android NDK To AOSP

Normal App

Page 72: From Android NDK To AOSP

Normal App

Place we utilize

Page 73: From Android NDK To AOSP

clang -c demo.c

clang -o demoExe demo.o \

-I./include -L./lib —lmyLib

COMPILE A PROGRAM

Page 74: From Android NDK To AOSP

clang -c demo.c

clang -o demoExe demo.o \

-I./include -L./lib —lmyLib

COMPILE A PROGRAM

Page 75: From Android NDK To AOSP

clang -c demo.c

clang -o demoExe demo.o \

-I./include -L./lib —lmyLib

COMPILE A PROGRAM

Page 76: From Android NDK To AOSP

clang -c demo.c

clang -o demoExe demo.o \

-I./include -L./lib —lmyLib

COMPILE A PROGRAM

Only used for looking up for symbols(shared library)

Page 77: From Android NDK To AOSP

Example

Page 78: From Android NDK To AOSP

Goal: Control vibrator using C/C++ Binder API

Available on Github: https://github.com/mshockwave/android-binder-demo-with-vibrator

Page 79: From Android NDK To AOSP

HEADER FILES

• frameworks/native/include (binder)

• system/core/include (cutils, utils)

Page 80: From Android NDK To AOSP

• https://android.googlesource.com/platform/frameworks/native

• https://android.googlesource.com/platform/system/core

git clone

Page 81: From Android NDK To AOSP

LIBRARIES

1. adb pull /system/lib/libfoo.so

2. Build yourself

Options:

Page 82: From Android NDK To AOSP

BUILD YOURSELF

1. make -jxx

2. mm / mma

Page 83: From Android NDK To AOSP

BUILD YOURSELF

1. make -jxx

2. mm / mma

Page 84: From Android NDK To AOSP

mm: Build current modules

mmm: Build supplied modules

mma: Current modules + dependencies

mmma: Supplied modules + dependencies

Page 85: From Android NDK To AOSP

mm: Build current modules

mmm: Build supplied modules

mma: Current modules + dependencies

mmma: Supplied modules + dependencies

LOCAL_MODULE := myModuleName

Page 86: From Android NDK To AOSP

$ cd ${AOSP_ROOT}/frameworks/native/libs/binder

$ mma

$ ls ${AOSP_ROOT}/out/target/product/${DEVICE} \

system/lib

> libbinder.so libutils.so libcutils.so . . . .

Page 87: From Android NDK To AOSP

$ cd ${AOSP_ROOT}/frameworks/native/libs/binder

$ mma

$ ls ${AOSP_ROOT}/out/target/product/${DEVICE} \

system/lib

> libbinder.so libutils.so libcutils.so . . . .

Binder module’s dir

Page 88: From Android NDK To AOSP

$ cd ${AOSP_ROOT}/frameworks/native/libs/binder

$ mma

$ ls ${AOSP_ROOT}/out/target/product/${DEVICE} \

system/lib

> libbinder.so libutils.so libcutils.so . . . .

Binder module’s dir

Build binder module and its dependencies

Page 89: From Android NDK To AOSP

$ cd ${AOSP_ROOT}/frameworks/native/libs/binder

$ mma

$ ls ${AOSP_ROOT}/out/target/product/${DEVICE} \

system/lib

> libbinder.so libutils.so libcutils.so . . . .

Binder module’s dir

Build binder module and its dependencies

Page 90: From Android NDK To AOSP

$ cd ${AOSP_ROOT}/frameworks/native/libs/binder

$ mma

$ ls ${AOSP_ROOT}/out/target/product/${DEVICE} \

system/lib

> libbinder.so libutils.so libcutils.so . . . .

Binder module’s dir

Build binder module and its dependencies

Result libraries

Page 91: From Android NDK To AOSP

PART OF ANDROID.MK

LOCAL_MODULE := myVibrator

LOCAL_C_INCLUDES += $(AOSP_INCLUDE)

LOCAL_LDLIBS += -L$(AOSP_LIB)

LOCAL_LDLIBS += -llog -lbinder -lutils -lcutils

Page 92: From Android NDK To AOSP

PART OF ANDROID.MK

LOCAL_MODULE := myVibrator

LOCAL_C_INCLUDES += $(AOSP_INCLUDE)

LOCAL_LDLIBS += -L$(AOSP_LIB)

LOCAL_LDLIBS += -llog -lbinder -lutils -lcutils

Page 93: From Android NDK To AOSP

PART OF ANDROID.MK

LOCAL_MODULE := myVibrator

LOCAL_C_INCLUDES += $(AOSP_INCLUDE)

LOCAL_LDLIBS += -L$(AOSP_LIB)

LOCAL_LDLIBS += -llog -lbinder -lutils -lcutils

Page 94: From Android NDK To AOSP

PART OF ANDROID.MK

LOCAL_MODULE := myVibrator

LOCAL_C_INCLUDES += $(AOSP_INCLUDE)

LOCAL_LDLIBS += -L$(AOSP_LIB)

LOCAL_LDLIBS += -llog -lbinder -lutils -lcutils

Page 95: From Android NDK To AOSP

APP

Hardware Related Library

Hardware

system_server

Page 96: From Android NDK To AOSP

APP

Hardware Related Library

Hardware

Link

system_server

Page 97: From Android NDK To AOSP

APP

Hardware Related Library

Permission Denied

Hardware

Link

system_server

Page 98: From Android NDK To AOSP

APP

Hardware Related Library

Permission Denied

Hardware

Link

system_server

(Mostly control via sysfs)

Page 99: From Android NDK To AOSP

APP

Hardware Related Library

Permission Denied

Hardware

Link

system_server

Link

(Mostly control via sysfs)

Page 100: From Android NDK To AOSP

APP

Hardware Related Library

Permission Denied

Hardware

Link

system_server

Link

Binder IPC

(Mostly control via sysfs)

Page 101: From Android NDK To AOSP

APP

Hardware Related Library

Permission Denied

Hardware

Link

system_server

Link

Binder IPC

Actions

(Mostly control via sysfs)

Page 102: From Android NDK To AOSP

frameworks/base/core/java/android/os/IVibratorService.aidl

AIDL = Android Interface Definition Language

Page 103: From Android NDK To AOSP

WE GONNA FAKE ONE !

Page 104: From Android NDK To AOSP

class BpMyVibrator : public BpInterface<IMyVibrator> {

virtual bool hasVibrator(void) {…}

virtual void vibrate(int32_t, String16&, int64_t,

int32_t, sp<IBinder>&) {…}

virtual void cancelVibrate(sp<IBinder>& token) {…}

(vibratePattern Omitted)

}Same interface in IVibratorService.aidl

Page 105: From Android NDK To AOSP

About detailed Binder part in this example…

http://mshockwave.blogspot.tw/2015/01/using-binder-to-vibrate-android-binder.html

http://mshockwave.blogspot.tw/2015/02/using-binder-to-vibrate-android-binder.html

Page 106: From Android NDK To AOSP

IN THE PREVIOUS EXAMPLE…

Page 107: From Android NDK To AOSP

PERMISSION DENIED ?!!!

Page 108: From Android NDK To AOSP

KER KER

I’M ROOT

Page 109: From Android NDK To AOSP

Native Services:

= HIGHER permission

= Able to use MORE libraries

Page 110: From Android NDK To AOSP

Native Service

Libraries

Service Manager

App

Page 111: From Android NDK To AOSP

Native Service

Link

Libraries

Service Manager

App

Page 112: From Android NDK To AOSP

Native Service

Link

Libraries

Service Manager

App

Interact via Binder

Page 113: From Android NDK To AOSP

Native Service

Link

Libraries

Service Manager

App

joinThreadPool()

Interact via Binder

Page 114: From Android NDK To AOSP

• libstagefright.so

• libui.so

• libhardware.so (libhardware_legacy.so)

Page 115: From Android NDK To AOSP

Native Service Example…

https://github.com/mshockwave/android-native-service-demo

Page 116: From Android NDK To AOSP

QUESTIONS?

E-mail / Google account: [email protected]

Github / Bitbucket account name: mshockwave

Facebook: www.facebook.com/bekket.mcclane