Friday, November 22, 2024

Delphi mobile development gripes

 This post is going to be a bit of a rant, but hopefully a useful one.     Mobile development would benefit greatly from a stable, simple, future proof multi-platform IDE and framework and tools of some kind.

It's a great shame that this sort of thing doesn't exist.   You see, there's an essential complexity element, and an accidental complexity element in mobile development, and here's the problem


1. The two big mobile platforms are endlessly mutating, each away from its own previous iterations. iOS moves faster and breaks more often, and Apple adds onerous new hoops to jump through more frequently than Google, but both, mostly driven by security and a desire to improve the overall quality of their app ecosystems, add more and more burdens, as years roll on.

2. The two platforms each require tools which change frequently.   Google's worse in this regards, as the various levels of Android SDKs and tools, and their quirks, will attest.


Delphi, and FMX (Firemonkey) are noble attempts, but they are not winning significant traction in the market with the product, and it's not hard to say why.   It's been an incredibly hard uphill battle to fight with Apple, and Google, and then build a native code compilation system (Delphi loves to be native to an instruction set for a single CPU) that will never be really at home in the Android dalvik-vm centric world.  Native compilation to ARM is a better fit for iOS but the native Cocoa APIs are not easily interfaced to Delphi apps, and forever there is a need for a series of complex wrappers to make iOS development with Delphi and FMX feasible.

I spent most of the last two days trying to figure out a quirk that only occurs on Delphi 12.1,  and does not occur on Delphi 12.2, which I can't safely fix by moving an entire product to Delphi 12.2, because of potential regressions in Delphi 12.2, and which is completely inscrutable.  The problem is not yet solved, and as I write this I'm reinstalling a delphi version on a different PC for the third time.

The latest small frustration? The delphi 12.0, 12.1 and 12.2 installers have a habit of not installing the android-tools even when the installer is told to install the SDK or the android platform.   On systems where ADB.exe was installed by the installer, the path is in CatalogRepository. Once it stops doing that installation, nothing will make the install work again, that I know of. Other developers I work with don't hit this glitch, but I hit it on four different PCs. The android platforms folder is also not installing, as if some marker exists somewhere in the registry that means "don't bother installing parts the installer needs to install for android to work".



figure: SDK Manager showing the supposed adb.exe location

Here's what the dialog should look like without any errors



The problem to me with this design is there should be a button here that says "reinstall missing items", since these items ship with Delphi.

The delphi app in question, that I need Delphi 12.1 on my pc to debug, is failing to start and the android parent launcher process is attempting to relaunch it.  The only information visible is found by using Android Studio's ADB LOGCAT support, filtered to the bundle id of the mobile app to get the following repeating errors that libc is raising at startup, with a permission read in a bundle resource.   Googling and stack overflow searches come up blank.   Installing Delphi 12.2 on my pc then 12.1 then 12.2 is crazy making, and is the reason I'm ranting a bit today. 

And this in the end is the problem with not going with Android Studio, being all alone on your own tiny little sub-platform of the Android platform, and that in the end, is why I do not believe that Delphi FMX has a long term future, on any platform.   The fragmentation, the technical risk, the quirks, the bugs, there are no solutions for tiny niche commercial systems.    The market will kill it.


Anyways here's a checklist for "Delphi just won't show me my device in the Android Targets".


1. find any adb.exe running that is not the adb shown in the dialog above and terminate it.  Android Studio will have its own version, each version of delphi on your computer will be using its own, and there's no mechanism in delphi to manage these adb.exe processes.


2. make sure using SDK manager that your project is looking for ADB.exe where there actually is an adb.exe and that the platform folders and other folders in the SDK and NDK tabs exist.


3.  Refresh.


4. Reboot.


5. Look for on-device messages to allow you to do USB debugging. Answer yes when prompted.


6. Make sure USB debugging is enabled on your device, or adb.exe won't find your machine.


There are about 50 more tips to make this really work, but it's so frustrating, and that's without all the bugs building, signing, deploying and getting apk and aab files into app stores.



If anyone has seen this error with delphi 12, the app crashes at startup, the debugger in 12.1 won't attach, and the logcat shows this

Access denied finding property "ro.vendor.pref_scale_resolution"

There are also messages from libMEOW that appear to just be noise:

2024-11-22 15:48:59.786 10985-10985 Compatibil...geReporter com.***           D  Compat change id reported: 149924527; UID 10217; state: ENABLED

2024-11-22 15:48:59.786 10985-10985 Compatibil...geReporter com.***           D  Compat change id reported: 132649864; UID 10217; state: DISABLED

2024-11-22 15:49:02.876 11358-11358 NetworkSecurityConfig   com.***           D  No Network Security Config specified, using platform default

2024-11-22 15:49:02.877 11358-11358 NetworkSecurityConfig   com.***           D  No Network Security Config specified, using platform default

2024-11-22 15:49:02.878 11358-11358 libc                    com.***           E  Access denied finding property "ro.vendor.pref_scale_resolution"

2024-11-22 15:49:02.888 11358-11388 libMEOW                 com.***           D  meow reload base cfg path: na

2024-11-22 15:49:02.888 11358-11388 libMEOW                 com.***           D  meow reload overlay cfg path: na

2024-11-22 15:49:02.889 11358-11388 libMEOW                 com.***           D  applied 1 plugins for [com.***]:

2024-11-22 15:49:02.889 11358-11388 libMEOW                 com.***           D    plugin 1: [libMEOW_gift.so]:

2024-11-22 15:49:02.923 11358-11358 Compatibil...geReporter com.***           D  Compat change id reported: 149924527; UID 10217; state: ENABLED

2024-11-22 15:49:02.924 11358-11358 Compatibil...geReporter com.***           D  Compat change id reported: 132649864; UID 10217; state: DISABLED

2024-11-22 15:49:08.017 11602-11602 NetworkSecurityConfig   com.***           D  No Network Security Config specified, using platform default

2024-11-22 15:49:08.018 11602-11602 NetworkSecurityConfig   com.***           D  No Network Security Config specified, using platform default

2024-11-22 15:49:08.019 11602-11602 libc                    com.***           E  Access denied finding property "ro.vendor.pref_scale_resolution"

2024-11-22 15:49:08.029 11602-11629 libMEOW                 com.***           D  meow reload base cfg path: na

2024-11-22 15:49:08.029 11602-11629 libMEOW                 com.***           D  meow reload overlay cfg path: na

2024-11-22 15:49:08.031 11602-11629 libMEOW                 com.***           D  applied 1 plugins for [com.***]:

2024-11-22 15:49:08.031 11602-11629 libMEOW                 com.***           D    plugin 1: [libMEOW_gift.so]:

2024-11-22 15:49:08.065 11602-11602 Compatibil...geReporter com.***           D  Compat change id reported: 149924527; UID 10217; state: ENABLED




Thursday, December 21, 2023

Dear Santa: My 2023 Delphi Christmas Wishlist

 Dear Santa,

I have been a very good Delphi Developer this year, and I would like the following Delphi related items in my Festive Non Denominational Holiday Hoisery. 

1.  I would like Delphi to be able to work on my high DPI two monitor system without driving me crazy.  That means having the Property Inspector draw its editor items where they belong instead of in some place that makes it impossible to use the property inspector, to alter components on forms.

2.  I would like Delphi's IDE layout management system to be able to organize only the contents of the IDE window, not the top/left position of the IDE, nor which window it's visible on, because having the IDE jump around randomly among several profiles (startup, another one after projects are open, a third one after a project is running) drives me nuts.  

3. I would like the IDE to be as stable as Delphi 7 was on large codebases.  It's been decades and every few years, claims are made that this year's delphi is stable, finally.   We were told that about every XE* release, Delphi 10, Delphi 10.4, Delphi 11, and now, Delphi 12.  Still, working on large codebases means crashes, hangs and freezes.


Thank you very much Santa Claus,

Yours sincerely

Delphi Code Monkey


Thursday, July 6, 2023

In Search of: The Ultimate Git GUI Client

You might thing that because of a post where I rant about Git's glitchiness that I hate git. I'm actually a pretty happy Git user, except when Git is having one of its moods.

 I have been a long time TortoiseGIT user, and before that, I was a tortoise HG user, and before that, a TortoiseSVN user.    In brief, the Tortoise family of version control GUIs main design philosophy is that Tortoise hooks itself deeply into the Windows Explorer.   This has been both a source of its power, and a source of pain, since this original decision.   The caching mechanisms it uses are part of the speed, and also part of the pain and bugs.   Having Tortoise on your system means that Windows explorer (and your computer) is almost always doing work in the background to index your entire hard drive  to find which folders are Git repositories and what the status of every working file in every folder is.

The good part is that once you accept the overall system issues, and perhaps slowness of your entire computer, and that you will periodically have to manage issues like the tortoise Cache needing a reset,  you get always on "friction free" awareness that a file has been modified, just by looking at the icon decorations in windows explorer.   This really is great.  Except when it's not.

Recently, Windows 11 (my main developer workstation) started locking up when I log into my desktop, and I had to create a new user account and log into it in order to get to my desktop, which was hard to do, since Windows profile corruption was also preventing me getting to the windows desktop.   I was eventually able to get a Task Manager up and to run a command prompt and launch other things, even though the Windows Explorer itself was refusing to initialize, open the start menu and taskbar, etc.    The best I was able to do was figure out that this problem went away when I uninstalled Tortoise.  I can't prove that Microsoft changed anything but I can say that I doubt a lot of the Explorer Shell team at MIcrosoft are checking for regressions for all the thousands of shell explorer extension API products out there that hook into Windows explorer.  

While I think the folks who make Tortoise are wonderful, I can on longer trust that Microsoft will avoid touching things that have "always worked" and in Windows 11, breaking things wholesale, seems acceptable.   Hiding most of the right click context menu content under a second level of right click menus, fine.  If it makes some top level program manager at Microsoft happy; Hey look we simplified your Windows Experiences and made all those shell extensions (like 7Zip's one, and Tortoise, and others) just GO AWAY.

Right now the number one candidate to replace Tortoise Git as a GUI is Git Tower or Git Kraken.  I'd be happy to hear comments from other people with suggestions.


Friday, November 5, 2021

Windows 11, and Delphi 11 : How is it for everybody? You better move to Delphi 11 if you're going to update to Windows 11, and here's why...

 So the future is here, Windows 11, and Delphi 11. Do you think the "everybody moved to 10 everything" and "everybody moved to 11 everything" all the same time is a coincidence?

Here's how it actually works:


1.  Something in the industry creates a buzz. What is it this week? Bitcoin? NFT? NFC? GUIDs?  N-Tier Design? Message Queueing?  The Internet of Things?

2. Everybody rushes to be "part of that". 


If you get hired at Embarcadero, or anywhere really, to sell anything, especially in the tech sector you'll get hauled into your bosses office regularly and someone who looks like they might belong in a Dilbert cartoon will tell you what the new thing is, that they read in their BossManagerMonthly magazine or blog, and tell you you need to get on top of it.

What is Windows 11?  For microsoft it's a chance to make a set of controlled breaking changes to the Windows platform ecosystem. It's neither purely a "good" thing, nor purely a "bad/mediocre" thing. It's a necessary thing. 

While Apple feels free to break everything all the time, every day, Microsoft has comitted to, and maintained a history of not breaking everything every day.   And so there comes a time, when breaking changes and "flag days" have to happen.     In true microsoft fashion, there are devices that will continue to run Windows 10, for the next few years, or longer.     And also in true microsoft fashion, there are devices that will refuse to auto-upgrade for you but which you can force to update to Windows 11, via the media creation tool, with Microsoft's full blessing.  You try it, you get the results and you get to see for yourself what Windows 11 does on your random pre-2020 consumer hardware.

So what is this post about? It's just a request for discussion.  What has been your experience? Are you running Windows 11 and Delphi 11 and how is it?

I have one anecdote to report; It seems Delphi 10.4 debugger hangs a lot on Windows 11.  Any attempt to set breakpoints and single step, the whole IDE (bds.exe) process hangs forever at 0% CPU. There do not appear to be wait chain analysis tools built into Windows 11 yet, and I'm not sure if I could do a wait chain analysis on BDS.exe from visual studio but I don't have visual studio on this box.   



The issue is  reproducible with a trivial helloworld-from-delphi app in 10.4, but is more frequently reproducible on the large 150+ megabyte exe apps I get paid to code, some of which load large non-trivial amounts of redistributables with, including openssl,  chromium embedded (google chrome browser), and a lot of other stuff.  These large apps are not fully portable to Delphi 11 without a large investment of time, and so I can't say if the same app will hang the debugger kernel in our large Delphi 11 apps.  The main app being debug above is a 32 bit 169 megabyte exe that loads another 180 megs of 32 bit DLLs (Chromium "libcef" is over 100 megs of stuff).   

In a trivial hello world app, Delphi 10.4.2 freezes about 50% of  the time after I hit a breakpoint and then continue.  Other 50% of time, it may recover and then when you end the debug session it will say "fatal debugger error" and ask that you shut down the IDE. THere's basically something fundamentally different in the Windows Kernel environment in Windows 11, and the Delphi 10.4 debugger is not up to speed with the changes in the platform.    My tests are with Delphi 10.4 build 27.0.40680.4203 (delphi 10.4.2, all of Update2 installed) on Windows 11 pro build 21H2, osbuild 22000.258 (windows 11 initial release).



Tuesday, July 20, 2021

Did you know that the Raize Components (Rz*) by Ray Konopka are now in Getit under a completely inscrutable new moniker?

 Would you have guessed what "Bonus KSVC 7" is, if you saw it in getit.  No? Neither would I.

It turns out that if you are looking for Raize Components they're now called Bonus KSVC, and available as version 6.5 and 7 in GetIt.

Raize Components, as it was for over a decade, got renamed to Konopka Signature Controls in 2020. But one rename was not enough for the bright sparks at EmbarcIdera.  Now it's been renamed again, this time it's called KSVC. Sure.   And the word bonus was necessary to put in front in the title, because "raisins".

Naming things is one of the hard problems in Computer Science, I guess. 

The components remain quite awesome,  and since they're in GetIt, I can heartily recommend everyone check them out if you hadn't heard about them.  There's still a discussion forum dedicated to them on the Raize.com site, but the product appears to have been 100% bought out by Embarcadero and is basically "part of Delphi now", which was a good move by Embarcadero.  






Wednesday, April 14, 2021

Rant: Git is not a version control system. But you're going to use it as one anyways.

I can hear you saying it.

" You're wrong, Delphi Code Monkey, Git is a version control system.".

Hear me out.

Git is not a version control system, it's a directed acyclical graph management system that happens to be possible (sometimes) to do version control with.

Every time you find something Git can't do, that it ought to do, for all of the billion people who probably use it and know it well,  if you keep searching for ways, however torturous, to handle your issue, there is probably a way.

There is stashing, and submodules, branching, and merging, there are cherry picks, and there is rebasing, there are branching models and workflows like Git Flow.        There's recursive submodule hell.  There's local git cached state hell.  There's ignore hell.   There's Git's unix roots are showing on windows hell.
There's git config hell.    There's unable to check out a branch because of local changes, and yet git status shows no files have changed, hell.   If I sat here and thought back through the years of horrible things Git has done to me, one by one, I would probably scream.

There are a thousand fresh hells waiting for you.  A thousand inscrutable (but usually googleable) error messages.

Here's the worst of the Git hells.  Git lockin hell.  Once you choose Git,  well, it's Hotel California.  You can "check out" but you can never leave.   The world of software development is now, and probably always will be locked into some version of Git or other.

Git is not actually (much) of a version control system, but you're going to use it like it was, and you're going to learn to like it.


Update:  The point of this rant (and it mostly is just a ranty rant) isn't that you SHOULD NOT use Git, it's that the nature of Git is to expose all the guts to you, and to blow up with errors that are because the internals are in a bad place and Git leaves it for you to put Humpty Dumpty back together again,  and that you are going to do that a LOT when you live and work all day, especially in a team of 5+ people, with Git.    Perhaps if you are saying to yourself, "I don't have all these problems that other people talk about", it could be because (a) you're not using submodules, (b) you're not working with teams of 5+ comitters, and (c) you don't use a lot of branching, merging, rebasing, cherry-picking nor complex workflows like git-flow.



Friday, October 23, 2020

A few quick tips about Downloading Delphi 10.4.1 (sydney) and all future Delphi Releases for current active customers.

Probably this is old news but I didn't see the news whenever it hit, and so I'm posting this here in hopes that other people who hadn't realized that EDN/CodeCentral is no longer where you get your Delphi downloads from, will Get The Memo.   Did you Get the Memo?



 1.  Don't bother trying to find 10.4.1 Sydney in the old EDN products portal, the one with the url starting cc.embarcadero.com/reg/rad_studio.  10.4.1 isn't in there.  I wouldn't be surprised if this site went away at some point. 

2. If you have an active subscription the place to get 10.4.1 Sydney is from the My Embarcadero Portal using the same login credentials as your active subscriptions and your licenses are associated with.  https://my.embarcadero.com/

3.  Even very old stuff like Delphi 7 isos is now on the new site. It does seem that the same file pile of your purchases from the Borland, or CodeGear, or the pre-Idera Embarcadero era, are all on there, and there's no loss of continuity, and as far as I can see, there's no reasons to complain about the change, it seems good.

It's nice to see that the ancient EDN stuff is finally being rebuilt.  I still have some complaints about the download and install experience. For example, why isn't TeeChart available both from GetIt instead of only as a one-shot-miss-it-and-it's-gone a checkbox during initial install?