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
Post on 24-Aug-2020
14 Views
Preview:
Transcript
1
Oracle v. Google
2
What Is A Patent?
• A copyright protects creative expression • A patent protects an invention
3
4
Android Uses “Dalvik” Virtual Machine
Android DALVIK
Java Application Developers
Android Application Developers
JVM JVM JVM
5
Java Platform Components
Java Compiler
Java Application Source Code
Java Virtual Machine
Computing Device
Java bytecode
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
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
8
Virtual Machines Slow Things Down
Source Code
Virtual Machine
Fetch Instruction
Decode Instruction/ Translate into machine code
Execute Instruction
Interpreter Program Execution
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
10
Infringed Patents Improve Performance And Memory
TX 4015 TX 4011
11
Google’s Infringement of ’104 Patent
12
RE38,104 Patent Solves Performance Problem
TX 4015
13
Patent Office Thoroughly Examined ’104 Patented Solution
TX 4015
14
’104 Patented Solution
TX 4015 at p. 10
15
’104 Patent Claims Cover Symbolic Reference Resolution
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.
17
Android Resolves Symbolic References
TX 47.15, 46.15
Google programmers stated in Android code that Android resolves “symbolic references”:
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
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
20 TX 426 at p.2
Speed Matters
From: Eric Schmidt
To: execute@google.com
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.”
21
Google’s Infringement of ’520 Patent
5/7/2012
22 22
6,061,520 Patent Solves Memory Problem
TX 4011
23
Patent Office Thoroughly Examined ’520 Patented Solution
TX 4011 at p.13
5/7/2012
24 24
’520 Patented Solution
TX 4011
25
’520 Patent Claims Cover Simulating Execution
26
Android Simulates Execution
TX 47.16, 46.16 Simulator.java
simulate the effects of executing bytecode
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
28
Google’s Knowledge of Patents
29
Google Knew About ’104 Patent And Its Importance
TX 25 TX 25 at p. 389
30
Google Knew About ’104 Patent And Its Importance
TX 25 at p. 389 TX 4015
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.”
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
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”
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
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
36
Oracle Told Google It Infringed ’104 And ’520 Patents
TX 920 (dated July 20, 2010)
37
Google Induces Patent Infringement
By Phone Makers
38
Google Makes Android Available To Developers And Phone Makers
TX 1096
TX 1097
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
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
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
top related