Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform...

41
1 Oracle v. Google

Transcript of Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform...

Page 1: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

1

Oracle v. Google

Page 2: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

2

What Is A Patent?

• A copyright protects creative expression • A patent protects an invention

Page 3: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

3

Page 4: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

4

Android  Uses  “Dalvik”  Virtual  Machine

Android DALVIK

Java Application Developers

Android Application Developers

JVM JVM JVM

Page 5: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

5

Java Platform Components

Java Compiler

Java Application Source Code

Java Virtual Machine

Computing Device

Java bytecode

Page 6: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

6

Java Platform vs. Android Platform Components

Java Compiler

Java Application Source Code

Java Virtual Machine

Computing Device

Java bytecode Java bytecode

Java Compiler

Java Application Source Code

Physical Machine

Dalvik Virtual Machine

Computing Device

dx tool Dex code

dexopt

bytecode Interpreter

Page 7: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

7

public class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello

World!");

}

}

Compiled from "HelloWorld.java"

public class HelloWorld extends java.lang.Object

SourceFile: "HelloWorld.java"

minor version: 0

major version: 49

Constant pool:

const #1 = Method #6.#15; //

java/lang/Object."<init>":()V

const #2 = Field #16.#17; //

java/lang/System.out:Ljava/io/PrintStream;

const #3 = String #18; // Hello World!

const #4 = Method #19.#20; //

java/io/PrintStream.println:(Ljava/lang/String;)V

const #5 = class #21; // HelloWorld

const #6 = class #22; // java/lang/Object

const #7 = Asciz <init>;

const #8 = Asciz ()V;

const #9 = Asciz Code;

const #10 = Asciz LineNumberTable;

const #11 = Asciz main;

const #12 = Asciz ([Ljava/lang/String;)V;

const #13 = Asciz SourceFile;

const #14 = Asciz HelloWorld.java;

const #15 = NameAndType #7:#8;// "<init>":()V

const #16 = class #23; // java/lang/System

const #17 = NameAndType #24:#25;//

out:Ljava/io/PrintStream;

const #18 = Asciz Hello World!;

const #19 = class #26; // java/io/PrintStream

const #20 = NameAndType #27:#28;//

println:(Ljava/lang/String;)V

const #21 = Asciz HelloWorld;

const #22 = Asciz java/lang/Object;

const #23 = Asciz java/lang/System;

const #24 = Asciz out;

const #25 = Asciz Ljava/io/PrintStream;;

const #26 = Asciz java/io/PrintStream;

const #27 = Asciz println;

const #28 = Asciz (Ljava/lang/String;)V;

{

public HelloWorld();

Signature: ()V

LineNumberTable:

line 1: 0

Code:

Stack=1, Locals=1, Args_size=1

0: aload_0

1: invokespecial #1; //Method

java/lang/Object."<init>":()V

4: return

LineNumberTable:

line 1: 0

public static void main(java.lang.String[]);

Signature: ([Ljava/lang/String;)V

LineNumberTable:

line 4: 0

line 5: 8

Code:

Stack=2, Locals=1, Args_size=1

0: getstatic #2; //Field

java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3; //String Hello World!

5: invokevirtual #4; //Method

java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

LineNumberTable:

line 4: 0

line 5: 8

}

Java Application Source Code

Java Bytecode

Java Source Code Compiled Into Bytecode

000000: 6465 780a 3033|magic: "dex\n035\0"

000006: 3500 |

000008: e561 54a3 |checksum

00000c: f7a0 86cd e5b6|signature

000012: 4bc8 9fbe d011|

000018: 968a a9a6 7305|

00001e: 430d |

000020: e802 0000 |file_size: 000002e8

000024: 7000 0000 |header_size: 00000070

000028: 7856 3412 |endian_tag: 12345678

00002c: 0000 0000 |link_size: 0

000030: 0000 0000 |link_off: 0

000034: 4802 0000 |map_off: 00000248

000038: 0e00 0000 |string_ids_size: 0000000e

00003c: 7000 0000 |string_ids_off: 00000070

000040: 0700 0000 |type_ids_size: 00000007

000044: a800 0000 |type_ids_off: 000000a8

000048: 0300 0000 |proto_ids_size: 00000003

00004c: c400 0000 |proto_ids_off: 000000c4

000050: 0100 0000 |field_ids_size: 00000001

000054: e800 0000 |field_ids_off: 000000e8

000058: 0400 0000 |method_ids_size: 00000004

00005c: f000 0000 |method_ids_off: 000000f0

000060: 0100 0000 |class_defs_size: 00000001

000064: 1001 0000 |class_defs_off: 00000110

000068: b801 0000 |data_size: 000001b8

00006c: 3001 0000 |data_off: 00000130

|

|string_ids:

|[0] "<init>"

000070: 7601 0000 | string_data_off: 00000176

|[1] "Hello World!"

000074: 7e01 0000 | string_data_off: 0000017e

|[2] "HelloWorld.java"

000078: 8c01 0000 | string_data_off: 0000018c

|[3] "LHelloWorld;"

00007c: 9d01 0000 | string_data_off: 0000019d

|[4] "Ljava/io/PrintStream;"

000080: ab01 0000 | string_data_off: 000001ab

|[5] "Ljava/lang/Object;"

000084: c201 0000 | string_data_off: 000001c2

|[6] "Ljava/lang/String;"

000088: d601 0000 | string_data_off: 000001d6

|[7] "Ljava/lang/System;"

00008c: ea01 0000 | string_data_off: 000001ea

|[8] "V"

000090: fe01 0000 | string_data_off: 000001fe

|[9] "VL"

000094: 0102 0000 | string_data_off: 00000201

|[a] "[Ljava/lang/String;"

000098: 0502 0000 | string_data_off: 00000205

|[b] "main"

00009c: 1a02 0000 | string_data_off: 0000021a

|[c] "out"

0000a0: 2002 0000 | string_data_off: 00000220

|[d] "println"

0000a4: 2502 0000 | string_data_off: 00000225

|

|type_ids:

|[0] LHelloWorld;

0000a8: 0300 0000 | descriptor_idx: 00000003

|[1] Ljava/io/PrintStream;

0000ac: 0400 0000 | descriptor_idx: 00000004

|[2] Ljava/lang/Object;

0000b0: 0500 0000 | descriptor_idx: 00000005

|[3] Ljava/lang/String;

0000b4: 0600 0000 | descriptor_idx: 00000006

|[4] Ljava/lang/System;

0000b8: 0700 0000 | descriptor_idx: 00000007

|[5] V

0000bc: 0800 0000 | descriptor_idx: 00000008

|[6] [Ljava/lang/String;

0000c0: 0a00 0000 | descriptor_idx: 0000000a

|

|proto_ids:

|[0] void proto()

0000c4: 0800 0000 | shorty_idx: 00000008 // "V"

0000c8: 0500 0000 | return_type_idx: 00000005 // void

0000cc: 0000 0000 | parameters_off: 00000000

|[1] void proto(java.lang.String)

0000d0: 0900 0000 | shorty_idx: 00000009 // "VL"

0000d4: 0500 0000 | return_type_idx: 00000005 // void

0000d8: 6801 0000 | parameters_off: 00000168

|[2] void proto(java.lang.String[])

0000dc: 0900 0000 | shorty_idx: 00000009 // "VL"

0000e0: 0500 0000 | return_type_idx: 00000005 // void

0000e4: 7001 0000 | parameters_off: 00000170

|

|field_ids:

|[0] java.lang.System.out:Ljava/io/PrintStream;

0000e8: 0400 | class_idx: 0004

0000ea: 0100 | type_idx: 0001

0000ec: 0c00 0000 | name_idx: 0000000c

|

|method_ids:

|[0] HelloWorld.<init>:()V

0000f0: 0000 | class_idx: 0000

0000f2: 0000 | proto_idx: 0000

0000f4: 0000 0000 | name_idx: 00000000

|[1] HelloWorld.main:([Ljava/lang/String;)V

0000f8: 0000 | class_idx: 0000

0000fa: 0200 | proto_idx: 0002

0000fc: 0b00 0000 | name_idx: 0000000b

|[2] java.io.PrintStream.println:(Ljava/lang/String;)V

000100: 0100 | class_idx: 0001

000102: 0100 | proto_idx: 0001

000104: 0d00 0000 | name_idx: 0000000d

|[3] java.lang.Object.<init>:()V

000108: 0200 | class_idx: 0002

00010a: 0000 | proto_idx: 0000

00010c: 0000 0000 | name_idx: 00000000

|

|class_defs:

|[0] HelloWorld

000110: 0000 0000 | class_idx: 00000000

000114: 0100 0000 | access_flags: public

000118: 0200 0000 | superclass_idx: 00000002 //

java.lang.Object

00011c: 0000 0000 | interfaces_off: 00000000

000120: 0200 0000 | source_file_idx: 00000002 //

HelloWorld.java

000124: 0000 0000 | annotations_off: 00000000

000128: 3a02 0000 | class_data_off: 0000023a

00012c: 0000 0000 | static_values_off: 00000000

|

|word_data:

|[130] HelloWorld.<init>:()V

000130: 0100 | registers_size: 0001

000132: 0100 | ins_size: 0001

000134: 0100 | outs_size: 0001

000136: 0000 | tries_size: 0000

000138: 2e02 0000 | debug_off: 0000022e

00013c: 0400 0000 | insns_size: 00000004

000140: 7010 0300 0000| 0000: invoke-direct {v0},

java.lang.Object.<init>:()V

| // method@0003

000146: 0e00 | 0003: return-void

| debug info

| line_start: 1

| parameters_size: 0000

| 0000: prologue end

| 0000: line 1

| end sequence

|

|[148] HelloWorld.main:([Ljava/lang/String;)V

000148: 0300 | registers_size: 0003

00014a: 0100 | ins_size: 0001

00014c: 0200 | outs_size: 0002

00014e: 0000 | tries_size: 0000

000150: 3302 0000 | debug_off: 00000233

000154: 0800 0000 | insns_size: 00000008

000158: 6200 0000 | 0000: sget-object v0,

java.lang.System.out:Ljava/io/Pr

| intStream; // field@0000

00015c: 1a01 0100 | 0002: const-string v1, "Hello World!" //

string@0001

000160: 6e20 0200 1000| 0004: invoke-virtual {v0, v1},

java.io.PrintStream.pri

| ntln:(Ljava/lang/String;)V // method@0002

000166: 0e00 | 0007: return-void

| debug info

| line_start: 4

| parameters_size: 0001

| parameter <unnamed> v2

| 0000: prologue end

| 0000: line 4

| 0007: line 5

| end sequence

|

|[168] type_list

000168: 0100 0000 | size: 00000001

00016c: 0300 | 0003 // java.lang.String

|

00016e: 0000 |

|[170] type_list

000170: 0100 0000 | size: 00000001

000174: 0600 | 0006 // java.lang.String[]

|

|string_data:

000176: 06 |utf16_size: 00000006

000177: 3c69 6e69 743e|"<init>"

00017d: 00 |

|

00017e: 0c |utf16_size: 0000000c

00017f: 4865 6c6c 6f20|"Hello World!"

000185: 576f 726c 6421|

00018b: 00 |

|

00018c: 0f |utf16_size: 0000000f

00018d: 4865 6c6c 6f57|"HelloWorld.java"

000193: 6f72 6c64 2e6a|

000199: 6176 6100 |

|

00019d: 0c |utf16_size: 0000000c

00019e: 4c48 656c 6c6f|"LHelloWorld;"

0001a4: 576f 726c 643b|

0001aa: 00 |

|

0001ab: 15 |utf16_size: 00000015

0001ac: 4c6a 6176 612f|"Ljava/io/PrintStream;"

0001b2: 696f 2f50 7269|

0001b8: 6e74 5374 7265|

0001be: 616d 3b00 |

|

0001c2: 12 |utf16_size: 00000012

0001c3: 4c6a 6176 612f|"Ljava/lang/Object;"

0001c9: 6c61 6e67 2f4f|

0001cf: 626a 6563 743b|

0001d5: 00 |

|

0001d6: 12 |utf16_size: 00000012

0001d7: 4c6a 6176 612f|"Ljava/lang/String;"

0001dd: 6c61 6e67 2f53|

0001e3: 7472 696e 673b|

0001e9: 00 |

|

0001ea: 12 |utf16_size: 00000012

0001eb: 4c6a 6176 612f|"Ljava/lang/System;"

0001f1: 6c61 6e67 2f53|

0001f7: 7973 7465 6d3b|

0001fd: 00 |

|

0001fe: 01 |utf16_size: 00000001

0001ff: 5600 |"V"

|

000201: 02 |utf16_size: 00000002

000202: 564c 00 |"VL"

|

000205: 13 |utf16_size: 00000013

000206: 5b4c 6a61 7661|"[Ljava/lang/String;"

00020c: 2f6c 616e 672f|

000212: 5374 7269 6e67|

000218: 3b00 |

|

00021a: 04 |utf16_size: 00000004

00021b: 6d61 696e 00 |"main"

|

000220: 03 |utf16_size: 00000003

000221: 6f75 7400 |"out"

|

000225: 07 |utf16_size: 00000007

000226: 7072 696e 746c|"println"

00022c: 6e00 |

|

|byte_data:

|[22e] debug info

00022e: 01 |line_start: 1

00022f: 00 |parameters_size: 0000

000230: 07 |0000: prologue end

000231: 0e |0000: line 1

000232: 00 |end sequence

|

|[233] debug info

000233: 04 |line_start: 4

000234: 01 |parameters_size: 0001

000235: 00 |parameter <unnamed> v2

000236: 07 |0000: prologue end

000237: 0e |0000: line 4

000238: 78 |0007: line 5

000239: 00 |end sequence

|

|[23a] class data for HelloWorld

00023a: 00 | static_fields_size: 00000000

00023b: 00 | instance_fields_size: 00000000

00023c: 02 | direct_methods_size: 00000002

00023d: 00 | virtual_methods_size: 00000000

| direct_methods:

| [0] HelloWorld.<init>:()V

00023e: 00 | method_idx: 00000000

00023f: 8180 04 | access_flags: public|constructor

000242: b002 | code_off: 00000130

| [1] HelloWorld.main:([Ljava/lang/String;)V

000244: 01 | method_idx: 00000001

000245: 09 | access_flags: public|static

000246: c802 | code_off: 00000148

|

|map:

|[248] map list

000248: 0d00 0000 | size: 0000000d

|[24c] header_item map

00024c: 0000 | type: 0000 // TYPE_HEADER_ITEM

00024e: 0000 | unused: 0

000250: 0100 0000 | size: 00000001

000254: 0000 0000 | offset: 00000000

|[258] string_id_item map

000258: 0100 | type: 0001 // TYPE_STRING_ID_ITEM

00025a: 0000 | unused: 0

00025c: 0e00 0000 | size: 0000000e

000260: 7000 0000 | offset: 00000070

|[264] type_id_item map

000264: 0200 | type: 0002 // TYPE_TYPE_ID_ITEM

000266: 0000 | unused: 0

000268: 0700 0000 | size: 00000007

00026c: a800 0000 | offset: 000000a8

|[270] proto_id_item map

000270: 0300 | type: 0003 // TYPE_PROTO_ID_ITEM

000272: 0000 | unused: 0

000274: 0300 0000 | size: 00000003

000278: c400 0000 | offset: 000000c4

|[27c] field_id_item map

00027c: 0400 | type: 0004 // TYPE_FIELD_ID_ITEM

00027e: 0000 | unused: 0

000280: 0100 0000 | size: 00000001

000284: e800 0000 | offset: 000000e8

|[288] method_id_item map

000288: 0500 | type: 0005 // TYPE_METHOD_ID_ITEM

00028a: 0000 | unused: 0

00028c: 0400 0000 | size: 00000004

000290: f000 0000 | offset: 000000f0

|[294] class_def_item map

000294: 0600 | type: 0006 // TYPE_CLASS_DEF_ITEM

000296: 0000 | unused: 0

000298: 0100 0000 | size: 00000001

00029c: 1001 0000 | offset: 00000110

|[2a0] code_item map

0002a0: 0120 | type: 2001 // TYPE_CODE_ITEM

0002a2: 0000 | unused: 0

0002a4: 0200 0000 | size: 00000002

0002a8: 3001 0000 | offset: 00000130

|[2ac] type_list map

0002ac: 0110 | type: 1001 // TYPE_TYPE_LIST

0002ae: 0000 | unused: 0

0002b0: 0200 0000 | size: 00000002

0002b4: 6801 0000 | offset: 00000168

|[2b8] string_data_item map

0002b8: 0220 | type: 2002 // TYPE_STRING_DATA_ITEM

0002ba: 0000 | unused: 0

0002bc: 0e00 0000 | size: 0000000e

0002c0: 7601 0000 | offset: 00000176

|[2c4] debug_info_item map

0002c4: 0320 | type: 2003 // TYPE_DEBUG_INFO_ITEM

0002c6: 0000 | unused: 0

0002c8: 0200 0000 | size: 00000002

0002cc: 2e02 0000 | offset: 0000022e

|[2d0] class_data_item map

0002d0: 0020 | type: 2000 // TYPE_CLASS_DATA_ITEM

0002d2: 0000 | unused: 0

0002d4: 0100 0000 | size: 00000001

0002d8: 3a02 0000 | offset: 0000023a

|[2dc] map_list map

0002dc: 0010 | type: 1000 // TYPE_MAP_LIST

0002de: 0000 | unused: 0

0002e0: 0100 0000 | size: 00000001

0002e4: 4802 0000 | offset: 00000248

|

|method code index:

|

|[130] HelloWorld.<init>:()V

|[148] HelloWorld.main:([Ljava/lang/String;)V

|

|statistics:

| class data: 1 item; 14 bytes total

| 14 bytes/item

| class def: 1 item; 32 bytes total

| 32 bytes/item

| code: 2 items; 56 bytes total

| 24..32 bytes/item; average 28

| debug info: 2 items; 12 bytes total

| 5..7 bytes/item; average 6

| field id: 1 item; 8 bytes total

| 8 bytes/item

| header: 1 item; 112 bytes total

| 112 bytes/item

| map list: 1 item; 160 bytes total

| 160 bytes/item

| method id: 4 items; 32 bytes total

| 8 bytes/item

| proto id: 3 items; 36 bytes total

| 12 bytes/item

| string data: 14 items; 184 bytes total

| 3..23 bytes/item; average 13

| string id: 14 items; 56 bytes total

| 4 bytes/item

| type id: 7 items; 28 bytes total

| 4 bytes/item

| type list: 2 items; 12 bytes total

| 6 bytes/item

dx tool Android dex code

Page 8: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

8

Virtual Machines Slow Things Down

Source Code

Virtual Machine

Fetch Instruction

Decode Instruction/ Translate into machine code

Execute Instruction

Interpreter Program Execution

Page 9: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

9

“We  are  building  an  embedded  system.    It  is  *massively* slower and has *massively* less

memory  than  a  modern  desktop  or  server  computer.”

“We  already  use  too  much  memory  and  execute  too much code.

Embedded is about doing more with less. If it is

not approached that way, you get terrible, slow,

unusable systems. It's not pretty. Every cycle of

work  you  do  is  further  reduction  of  battery  life.”

“This  really  isn’t  a  debate.    The  system  is  too  slow.    The system uses too much memory. Smaller,

simpler, faster, more reliable wins. Across the

whole system.”

TX 218 at p. 1

From: Brian Swetland

To: Andy Rubin

Sent: August 9, 2007

Google Android Developers Faced Performance And Memory Challenges

TX 23 at p. 1

“if  the  device  is  not  fast  and  stable  we  FAIL”

From: Brian Swetland

To: Andy McFadden

and others

Sent: August 16, 2006

Page 10: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

10

Infringed Patents Improve Performance And Memory

TX 4015 TX 4011

Page 11: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

11

Google’s  Infringement  of  ’104  Patent

Page 12: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

12

RE38,104 Patent Solves Performance Problem

TX 4015

Page 13: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

13

Patent  Office  Thoroughly  Examined  ’104  Patented  Solution

TX 4015

Page 14: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

14

’104  Patented  Solution

TX 4015 at p. 10

Page 15: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

15

’104  Patent  Claims  Cover  Symbolic  Reference  Resolution

Page 16: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

16

Meaning Of “symbolic  reference”

symbolic reference

A reference that identifies data by a name other than the numeric memory location of the data, and that is resolved dynamically rather than statically.

Page 17: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

17

Android Resolves Symbolic References

TX 47.15, 46.15

Google programmers stated in Android code that Android resolves “symbolic  references”:

Page 18: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

18

Android Relies On Symbolic Reference Resolution To Run Faster

Dan Bornstein Former Google

Android Tech Lead

Google I/O 2008 Video

entitled  “Dalvik  Virtual  Machines  Internals”

“We  do  optimization.    And,  so  the  first  time  that,  that  a  data-

dex file lands on a device, we, we do that verification work, we

also, we also augment that file, if we have to we will do byte

swapping and pad, pad out structures and in addition, we, we

have a bunch of other things that we do such that when, when

it comes time to run, we can run that much faster. So as an

example of static linking, before when a dex files arrives on a,

on a device it will have symbolic references to methods and

fields, but afterwards it might just be a simple integer v-table

offset so that when for invoking a method instead of having to

do say a string-based lookup, it can just simply index into a v-

table.”

TX 816 symbolic references

Page 19: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

5/7/2012

19 19

Benchmark  Tests  Prove  Android  Runs  Faster  Because  Of  ’104  Patent

9.41%

74.39%

7.50%

100% 100% 100%

13X faster

11X faster

TEST 1 TEST 2 TEST 3

With  ’104  patent

Without  ’104  patent

Page 20: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

20 TX 426 at p.2

Speed Matters

From: Eric Schmidt

To: [email protected]

Sent: December 20, 2010

“3.  Speed Matters

A great Google truism--both for our products and our product

innovation cycle.

For products--milliseconds matter to users.”

Page 21: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

21

Google’s  Infringement  of  ’520  Patent

Page 22: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

5/7/2012

22 22

6,061,520 Patent Solves Memory Problem

TX 4011

Page 23: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

23

Patent  Office  Thoroughly  Examined  ’520  Patented  Solution

TX 4011 at p.13

Page 24: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

5/7/2012

24 24

’520  Patented  Solution

TX 4011

Page 25: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

25

’520  Patent  Claims  Cover  Simulating  Execution

Page 26: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

26

Android Simulates Execution

TX 47.16, 46.16 Simulator.java

simulate the effects of executing bytecode

Page 27: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

27

“So,  sometimes  you  really  need  to  have  just  a  big  array  of  data  and  if  you’ve  ever  looked  at  what  something  like  this  looks  like  in  a  .class  file,  it’s  not  pretty.  ...  And  each  time  you  add  another  element to say an int array,  it’s  11  bytes  of  code  and  constant  combined  and  another  four  instruction  dispatches.  …  So  knowing  that, this is what we do in a dex file. This is the same code,

turned, which has been translated into a .dex file. You can see

that  for,  in  this  case  we’re  really,  we’re  only  using  46  bytes  for  this  example and as you add elements to that int array  it’s  just  four  more bytes per element which is exactly the data represented.

And we only have to interpret one opcode to do that entire

initialization  and  that’s  the  third  one  down,  the  fill  array  data.…  And this is both a speed and a space efficiency win. Measured on

our system libraries it saves us something like a 100K.  …”

Android Relies On Simulating Execution To Save Memory And Run Faster

Dan Bornstein Former Google

Android Tech Lead

Google I/O 2008 Video

entitled  “Dalvik  Virtual  Machines  Internals”

TX 816

Page 28: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

28

Google’s  Knowledge  of  Patents

Page 29: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

29

Google  Knew  About  ’104  Patent  And  Its  Importance

TX 25 TX 25 at p. 389

Page 30: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

30

Google  Knew  About  ’104  Patent  And  Its  Importance

TX 25 at p. 389 TX 4015

Page 31: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

31

Google Worried About Its Java Patent Infringement

TX 155 at p. 1

From: Andy Rubin

Sent: November 12, 2006

“They  still  have  patents and  trademarks.”

Page 32: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

32

Google Worried About Its Java Patent Infringement

Q. When you wrote "they still have patents and

trademarks," what was in your mind about what patents

Sun had?

A. Look, like I said before, I assume they're

running a business, they're inventing intellectual

property, they're protecting it through the patent

system. Through GPL, I didn't know what they were, but I

knew that it was dangerous to use the stuff without

knowing exactly what it was.

So effectively you have to go back to Sun,

ask them what they considered their intellectual property

and, you know, try to figure out what the trick was if

you wanted to use the technology.

Andy Rubin Co-Founder of Android

July 27, 2011

Dep. Tr. 16:4-16

Page 33: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

33

Google Worried About Its Java Patent Infringement

TX 230 at p. 1

From: Andy Rubin

To: Bob Lee

Sent: August 11, 2007

“PS  --we negotiated 9 months with Sun and decided to walk

away after they threatened to sue us over patent violations”

Page 34: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

34 TX 326 at p. 2

Sent: February 19, 2009

From: Dave Sobota

To: Tim Lindholm,

Bob Lee

Google Worried About Its Java Patent Infringement

>Proposal:

> - Google buys the rights to Java from Sun

(patents, copyrights, etc)

>  …

>Good for Google:

> - Our Java lawsuits go away

Page 35: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

35

Google Purposely Avoided Finding Out Whether They Were Infringing  Oracle’s  Patents

Q. To the best of your knowledge, between Google's

acquisition of Android and the filing of the lawsuit in this

action, did Google ever investigate Sun's, later Oracle

America's patent portfolio as it might relate to Android?

A. Yeah, of the parts of Google that I manage and I operate,

the -- there was no instruction to go investigate the

breadth of Sun's patent portfolio. Andy Rubin Co-Founder of Android

July 27, 2011

Dep. Tr. 19:20-20:8

Page 36: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

36

Oracle  Told  Google  It  Infringed  ’104  And  ’520  Patents

TX 920 (dated July 20, 2010)

Page 37: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

37

Google Induces Patent Infringement

By Phone Makers

Page 38: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

38

Google Makes Android Available To Developers And Phone Makers

TX 1096

TX 1097

Page 39: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

39

Google Induces Patent Infringement By Phone Makers

Android activations in 2012:

750,000 Per Day

TX 1061 at p. 6

Android Activations in 2010:

“160K  Android  devices  with  Google  services  activated  per  day”

Dan Morrill, Technical Program Manager

for Android Compatibility

April 26, 2012 Trial Tr. 1017:4-16

Page 40: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

40

Clean Room Is No Defense To Patent Claims

Q. And we've talked about your clean room, the way the

clean room got established and how you communicated the

rules of the clean room.

One thing we didn't talk about specifically in the context

of clean room is patent issues. So did you have an

understanding that the clean room would bear on the

question of whether Android would infringe Sun/Oracle

America patents?

A. No. Generally speaking, a clean room approach doesn't

protect against patents. There's no expectation.

As I said previously, VM technology has been around

forever. I didn't think the stuff that we were doing was going

to be a violation of anybody's IP.

Q. And so that was based without reviewing the IP? That

was kind of an intuition on your part?

A. That's correct. It was -- you know, it was my business

judgment.

Andy Rubin Co-Founder of Android

July 27, 2011

Dep. Tr. 249:5-23

Page 41: Oracle v. Googleassets.sbnation.com/assets/1108354/oracle-patent-opening-1621757.pdf6 Java Platform vs. Android Platform Components Java Compiler Java Application Source Code Java

41

Google Has No Excuses

• Patented  inventions  are  not  “free”  

• Google has no fair use defense

• The  truth  is  in  Google’s  own  source  code

• Google needs a license to use patents