Few cents about my commits

Intellij Idea/Android Studio: fixing annoying 'android-gradle' facet

|

This post is outdated. Please follow to post.

Last year AS/Idea become real pain in case Java project is mixed with Android one. This results of “android-gradle” facet and project type to be created. And these project type doesn’t play nice with RoboVM/Java projects. Nothing is working.
There is already several issues about this in the field:

It is almost year as JetBrains fixes it. So there is a hack which allows to run it:

RoboVM for Windows/Linux: toolchain and iOS SDK installer

|

First POC Linux/Windows build has major usability flaw: to start working on Linux/Windows user had to have access to Mac to obtain Xcode files and also manually download and deploy toolchain files. Now it is solved with automatic downloader/installer:
This became possible with as result of following changes:

W/L: Check for update enhancement

|

There was basic a check for updates already at compiler level (and it even was fixed recently). But it was providing information only to console. I’m working on automatic toolchain download functionality for Linux/Windows project and it requires version check functionality improvement. Here I describe basic version check that I will propose also for MobiVM current master (it does not contain any Linux/Windows specific parts here).

Changes visible to user

Balloon instead of console output

Tutorial: Crash Reporters and java exceptions

|

UPDATE: Crashlytics reports also processed NPE, this happens as it uses mach exception handlers. Check following post for workaround.

Third party native SDK might report crash from following sources:

  • by sending crash report stored on device;
  • signals;
  • native unhandled exceptions.

Last two cases require special consideration to be taken to let SDK receive required events and keep RoboVM operations as expected.

bugfix #233: Unable to start 12.5 inch iPad simulator

|

History Unable to start 12.5 inch iPad simulator #233
Fix PR273

Recently there was a fix for simulator selection in Idea. Its turned out that there is a similar gradle one. But gradle is broken in different way:
gradle -Probovm.arch=x86_64 -Probovm.device.name="iPad Pro (12.9-inch) (2nd generation)" launchIPadSimulator

failed with message
Unable to find a matching device [arch=x86_64, family=iPad, name=iPad Pro (12.9-inch) (2nd generation), sdk=null]

Root case is very simple, code in DeviceType.filter() replaced any ‘-‘ with ‘ ‘ by following code snipped:
deviceName = deviceName == null ? null : deviceName.toLowerCase().replaceAll("-", " ");

as result it was looking for device with name iPad Pro (12.9 inch) (2nd generation) (without ‘-‘) and of course was not able to locate it.

W/L TechNotes 2: xib2nib

|

UIKit xib/storyboard files have be compiled from XML text format to binary NIB. In native Mac environment there is ibtool as part of XCode toolchain that handle this task. Windows/Linux lack this tool and without it not possible compiling iOS application that contains xib/stroryboard layouts. Lucky for us such tool was found in Microsoft/WinObjC project but unfortunately it was not working from scratch. Getting it to so-so working level cost me about 100+ hours to fix showstopper bugs and develop tools that simplifies reverse engineering of nib. Details are bellow:

Tutorial: Investigating silent crash of Release build (e.g. Port death watcher fired)

|

Release build (shared IPA) crashes when shared with QA team or even being uploaded to Apple Store doesn’t give any reason in crash reports. Device console logs shows as much as:

Feb 12 09:32:12 iPhone assertiond[67] : [DemoApp:620] Port death watcher fired.

This can be reproduced with this minimal snippet – it will produce output while on wire with debugger but once started without it (or from IPA or Apple store) will be silent:

public class Main extends UIApplicationDelegateAdapter {
    @Override
    public boolean didFinishLaunching(UIApplication application, UIApplicationLaunchOptions launchOptions) {
        throw new RuntimeException("You will not see me!");
    }
}

With very high chance crash is Java code and it is not causes any log output/crash report because developer didn’t configured app so. What has to be done:

bugfix #263: Idea launches wrong version of simulator than selected in run configuration

|

not a bug: EXC_BAD_ACCESS if object created with method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy”

|

UPDATED with workaround if “new” prefix is still required.

Native ObjectiveC/Swift code that uses shared code RoboVM code as Framework could ends in following:

Sometimes it happens randomly but here is how to make it upon-request:

Linux/Windows WIP: not a bug - "Error in compatibility flow" exception

|

While working on Linux/Windows port and improving xib2nib faced following issue that was happening only when custom build toolchain was used:

*** Assertion failure in -[UIView _nsis_center:bounds:inEngine:forLayoutGuide:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.33.7/NSLayoutConstraint_UIKitAdditions.m:3347
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error in compatibility flow'

It was happening when using recently added UIKit functionality in xibs (UILayoutGuide in this case). Long investigation to simple solution is bellow: