The tools and IDE are quite good (they need a lot of RAM though), the deployment is easy, the development workflow simple enough and the devices are easy (and cheap) to come by. Even the Play Store console is not catastrophic.
A contrario from Youtube, you can get questions answered by Google, and the dev communities are quite large.
The API changes are known 6 months in advance, which is good enough, for most cases. And you get them usually only when targeting the new SDK version (except for Android Q... why?!?)
What I don't like though, is their abysmal NDK support (notably compared to iOS), the removal of use-cases (just use SAF, right? wifi?), but mostly the APIs that are never finished and always buggy (Audio API for example), and the impossibility to send patches to fix those bugs.
Finally, the Play Store Console is so-so, but the user-facing part is quite nice.
Yeah, this is my biggest gripe. The vast majority of popular apps in the Play Store are games, which all use the NDK. Yet Google refuses to give the NDK more resources.
Best part-- along with the URI, you get the permission to access the document/file/image/audio/whatever "for free" without ever having to request it! Because you kind of just did-- the act of the user picking the file auto-gives you the read permission, which can be kept ("persisted") across system/app restarts.
This file may not even be on the actual device. It could be on some cloud service or a file server or something else you've never even heard of. Android handles it all for you. An example of this is Google Drive. If they've installed the Google Drive app and it's linked to their account, the Storage Access Framework will let the user pick stuff from there just as easily as their own external storage.
You can also use the picker to create/save a new file or even choose a whole (directory/folder) tree.
Reading from the content:// URI is a little different than from a file:// , and I know there are some situations where this won't cut it. But starting in Q you'll be kind of limited in where those files can be accessed.
But in most situations involving External Storage, the SAF is really what you want to use anyway.
Watch this little-seen video:
Or not. A File Picker does not work for playlists, linked MKV/MOV files, subtitles autodetection (subfolders and such), and so many other multimedia cases.
Also, it is a pain to use from the NDK... And incorrectly documented.
And then, the UI to allow people to give you access to the folders is extremely confusing, hard to explain to users, not customizable, and changes from version of Android to another, so very hard to document.
Exactly. HTML files are another victim of this, as with content://-URIs there's no official way to properly resolve relative URIs for any subresources (images, style sheets, scripts and whatnot) or local links, and even if you could, you wouldn't have the permission to access those files anyway. Even Android's included mini HTML-viewer app (or Chrome for that matter) are broken if you try viewing a HTML file using a content://-URI, e.g. from the file explorer that's built-in since Marshmallow.
I opened https://issuetracker.google.com/issues/77406791 for that, but you can guess at the reply I received so far (none - I guess I should be glad they didn't close it outright...)
And another problem is that even if your app has the appropriate storage permissions itself (whether through READ_EXTERNAL_STORAGE or the new-fangled way, even if that means dealing with the SAF) and could therefore open both that file and its companion resources without relying on the permissions attached to the content://-URI intent, in practice that's rather difficult because even for local files there's no official link between the content://-URI and the file system location. In practice at least some ContentProviders will leak the path through the URI, allowing you to reconstruct the original file path with a little luck, but that's of course not really a reliable method.
In the case of a sophisticated media player like VLC I totally get your point. The solution before Q was just to ask for the READ/WRITE storage permissions and have full access. I guess they figure that's too broad access for one app to have.
Upsides-- it works great on Chromebooks, integrating with ChromeOS well, and the convenience of seamlessly integrating a single UI with numerous cloud services with no extra SDKs to include or APIs to learn is also a big plus.
Granted, I only do that on a phome in a pinch but having these features saved me more than once. I dom't want Android to become as restrictive and underpowered as iOS feels to me.
Alternatively, the app can register itself as opener of zip files, then it could extract them freely to its own private directory (without asking for permissions) and let you list and upload them.
Although it may not be international (I think intentions are good), this change will devalue internal device storage to such an extent that people will see themselves forced to store even more data in cloud services of dubious reputation. Technically, they don't have to, but it will likely be easier for the masses.
Consumers tend to just click past permission prompts, hence granting malware permission to everything. Power users can take care of themselves, of course, but most consumers don't have the technical knowledge to safely deal with this kind of permission prompt.
If it had been implemented that way, there still would have been some usability problems (some users will likely always manage to pick the wrong directory and then wonder why the app doesn't work), but other than that it would have caused much less trouble.
I haven't found the reading part to be different, but getting the uri has changed from Uri.fromFile() to their FileProvider package. Which, requires quite a bit of setup in comparison.
To be fair, it's documented well on the Android developer site.
This is not a good thing for VR apps. Unless there's a VR system file picker in the works that I'm unaware of..
Suppose you're a VR app and you invoke a picker to open a... I don't know... you want to open a sound file. How should the picker's UI be to fit into your general VR interface?
If a sound file is particularly badly suited, then some other kind of file (but in that case I'm interested in why that's easier/better than sound).
The crucial point is to remain inside the stereoscopic VR view since exiting VR is very disruptive.
I’m afraid a general Android VR item picker will be a lot more boring though.
Nowadays I guess the surface studio is a good example. Being laid out like a drawing table and interacting with it like a drawing table.
The problem is that Google wants to break API compatibility without actually calling it what it is. Your app, which worked for years, is now broken and as far as the user is concerned it's your fault. I've been tempted to set the "max API level" property on my apps so that I don't have to deal with this anymore. (Oh, wait, Google changed Android to no longer enforce that property.)
If Google wants to make breaking changes to the API then give developers a reasonable deprecation timeline and don't let users install apps that target old API levels.
Each new Android version starts with a beta which previews and advertises the behavior changes, how is that not a reasonable deprecation timeline ? (real question, not trying to be cute)
> don't let users install apps that target old API levels
Google has been less active on that front that I would like but the play store is starting to at least enforce that new apps and update must target a recent API level.
Testing against betas can cause regressions for non-API reasons. That's why I'm reluctant to test against them, preferring to wait for final releases.
For apps that need maximum stability with minimal effort deprecation policies have to preserve BC at least for one release cycle.
if the regression is not listed on the behavior change list, create a ticket on the beta bug tracker to determine if it is intended or a beta bug.
What in this is not ok ? That's what I have been doing in the past cycles and have had no issues. I can't speak for all the usecases, but that's a reasonable process.
My annoying use case for those was ebook readers - I have a pretty massive library of epubs (Thanks Baen Webscriptions!) and have tended to just dump a ton of them into a folder in storage on a device. I can then pull those up in CoolReader, Moon+ Reader (position sync!) or FBReader as I desire. On Windows Phone every reader app (not that there were many) had to have its own independent download because god forbid you have shared freaking storage.
Somehow I feel that this is also going to end up hitting things like third-party gallery apps such as ones that allow tagging, along with the multimedia stuff that other folks are concerned with. Oh, and music. The death of MP3s saved locally to a device and used by multiple apps?
So much of what Google has been doing with Android (turning it into a minimal platform for running the massive Google Play where all functionality lives) seems like they're heading down the walled-garden that Apple has always been, but with creepy monitoring and ad-driven revenues layered on top.
I always dismissed iOS as an option because I didn't like how locked-down it was and I really liked swipe-based input, but now that iOS allows keyboards and the locked-down aspect is happening everywhere perhaps it's time to reconsider.
Edit: removed disparagement of Windows Phone apps
But ideally, the user should be able to create an arbitrary storage location (say, a folder), and then permit specific apps to access it, without granting the app "file system access" as a whole.
Capability-based systems with a powerbox/picker UI are designed this way, so my guess is Fuchsia will work a bit more like this.
FBReader has a directory of its own, and can provide other apps with access to ebooks or other files in that directory, mediated by its own code, access-controlled as it pleases.
It doesn't sound bad to my ears, except that the APIs involved need love and attention, and their documentation even more so.
(Edit: Not picking on FBReader, just using it as an example.)
One problem is that unless I want to plug my phone into my computer each time I need to manage the storage or use the rather limited built-in file explorer, I'm going to have to use some third-party apps myself (that I have decided to be trustworthy enough) in order to manage "my" storage. From Google's point of view those apps remain third-party-apps though, and as such remain subject to some set of restrictions.
> FBReader has a directory of its own, and can provide other apps with access to ebooks or other files in that directory, mediated by its own code, access-controlled as it pleases.
I don't want my ebooks to "belong" to FBReader, though. Now yes, you can still do that as long as you only open the books from inside the respective reader apps (copy your ebooks into a general ebooks directory on the storage and then give each of your reader apps permission to access that directory), but
> can provide other apps with access to ebooks or other files in that directory, mediated by its own code, access-controlled as it pleases.
Google wants the above to be the only way to pass file references around between apps, which is stupid when
a) that file doesn't actually conceptually belong to the sending app, and
b) the receiving app would have had permission to access that file itself anyway.
As Google has currently implemented content://-URIs for example, even if FBReader has been explicitly granted access to my ebooks directory, if I happen to open a book from my file explorer instead, then because in that case the access is "mediated by" the file explorer, FBReader cannot reliably tell that the incoming file is actually one that is already part of its library, so I potentially end up with a duplicated LRU/history entry, my reading position might not properly remembered because FBReader doesn't know whether those two files are in fact one-and-the-same or not, and, and, and... And if I happen to switch my file explorer app and uninstall the old one, all references to files opened through the file explorer become invalid, even if FBReader had permission to directly access the file by itself, too.
I fundamentally disagree with the premise of a walled garden when there are no other options to install on a device.
The web is the only freedom devs have left and even that is starting to erode - article 13, neutrality etc.
That's not entirely accurate, even for Windows Phone at its most restrictive (7.x). The reader app would ask for storage apps and the storage apps would provide the files. It was quite common that the storage apps seemed like they would download multiple copies each file separately for each reader app, but that wasn't always the case. Unsurprisingly, some storage apps were just dumber than others.
Windows Phone 8.x and 10 opened up more direct file system access without going through an intermediary storage app, though of course possibly too late for the impression of stupid storage apps to linger.
ETA: Not that any of this currently matters given the current state of Windows on mobile devices. :(
I got a little caught up in the argument about clipboard apps suddenly being broken as if there was no thought put into the impact it would have. Clipboard apps on Android are currently very dangerous since an app can access the clipboard without asking for permission so the user can unknowingly share anything in the clipboard with malicious apps. That's insane and Google is right to fix this even if it breaks things for well behaved apps. There is a lot of solid information in this article but starting with that argument set a poor tone.
Second, makes you wonder if Google as an organization wants to push you towards web apps / PWAs. Google has always seemed to think that getting people to abandon the app model benefits them and hurts Apple and maybe these changes are in search of that end result.
As a developer, I am forced to take time out of developing my new app to update my older apps. This year, I spent 3 months updating my 2 older apps to the newest API. My app/game that will be released soon is targeting an API that will be banned from further updates later this year. The problem is that the game framework that I use does not support the newer API yet, and development has slowed considerably on it, so I may be stuck with the (possibly monumental) task of updating the game framework myself.
My two older apps should be left alone. My users tend to stick with them because they want to use a familiar interface, and most other competitors change interfaces on a regular basis. But I have had to occasionally remove features because of API changes.
And that brings me to my gripes as an Android user - most of my favorite old apps from just a few years back with either no longer work, or have completely changed so that they aren't really the same app that I used to love.
I am really rooting for a Linux-based phone to eek out some type of commercial viability. I am willing to pay much more for a device with much lower specs and polish, so that I can have a device that respects me as a user.
I think letting the user decide on permissions works in practice only if (i) There is a good chance that an average user would understand the tradeoffs of giving different permissions to different apps (ii) A large majority of users are expected to give that permission to the app under reasonable circumstances.
If an average user does not understand the tradeoffs of giving permissions to an app, then the operating system may as well do it on behalf of the user. I think this is a common problem since an average user probably clicks arbitrarily on the permissions dialog.
Similarly, if a permission is perceived to be not useful enough by most of the users, then there is no point in even having that in the ecosystem.
"User choice is what all of this boils down to, really. Android used to give me the choice of being slightly insecure in exchange for having more powerful and innovative features in the apps I install..."
You're dead on about the average user. Watch someone install and app, and less than a second is spent looking at the permissions.
Google's solution makes sense for their platform, not for power users. Leaving security up to users will result in insecure devices, increasing support costs as well as denigrating the brand.
If people are going to do things like financial transactions shudder on their phone, then the platform has to be rock-solid secure. That leaves those who might know and do better with their devices with less options.
It's the price of maturity.
That said, I don't really feel that oppressed as an app developer. I think Google has done more good than bad here
At least, you pay a fee of 25$ and it's on you (or Google). Paying 99$/year and still experiencing some strong frustration at each newer release and change is much more for fetishism
80% of all iOS devices are on iOS 12. An additional 12% are on iOS 11. Any device that can run iOS 11 can also run iOS 12.
By not supporting older devices, you are missing out on at most 8% of the iOS population. But even some percentage of those are able to update to iOS 12.
To target anything older than the 5s means you also have to target 32 bit processors. How much time are you going to spend targeting such a small user base?
Besides, if you have an older version already in the App Store, they can download “the last compatible version”.
You'd better believe there are older devices out there, and people would use the app store with them, iff the app store would only show you apps (or versions of apps) that still run on your device.
It is frustrating trying to get games on an old iPad for the kids.
I’ve done that with my first gen iPad as late as last year to download a few streaming apps like Netflix, Hulu, and Plex.
How far down the rabbit hole do you want to go? The 4s? The 4? The 3GS? The 3G? The original iphone?
As an app developer, it's immensely frustrating to have to keep updating apps to stay on top of the latest SDK.
As a mobile user, I delete apps that get flagged up as battery hogs.
So that leaves me with a fairly simple choice, and I keep stuff updated if I expect anyone to keep using it, and if I abandon it, I shouldn't be surprised when my users do the same.
I think the difference in API stability is a result of the different financial motivations between Microsoft and Google. For Microsoft, the OS itself was the product; to not make the APIs backward-compatible would have meant significantly less revenue and market share.
For Google, the OS is not the product. Google doesn't make any less money when someone continues to run an old version of Android. There is no monetary incentive to make new versions of the OS API-compatible with older versions, nor is there any monetary incentive to make new versions of the OS run on old devices.
Consider also that the cost of upgrading to a new (non-flagship) device in 2019 is much cheaper than in 1995. A typical PC circa 1995 could cost $2000 or more (price adjusted for inflation). Today, you can get an entry-level mobile phone for 1/10 that price. Back then, a family might hold on to a computer for five or ten years, because it was so expensive to upgrade. That makes paying $100 or so for an OS upgrade every few years worthwhile, because it's much cheaper than buying a new PC.
so there's a legit security app which can no longer function as effectively as it did before the Google Play Store eliminated its access to the SMS permission.
The point I do agree on is that the platform itself is becoming far too locked down, and the example of "Imagine if the online banking of my bank refused to open on my desktop because it knows I know the password for the administrator account" is a valid one and shows just how crazy it's getting.
I wonder if this is something the apps themselves have to disable or something in certain versions of Android itself.
Publishers often refer to copying they don't approve of as “piracy.” In this way, they imply that it is ethically equivalent to attacking ships on the high seas, kidnapping and murdering the people on them. Based on such propaganda, they have procured laws in most of the world to forbid copying in most (or sometimes all) circumstances. (They are still pressuring to make these prohibitions more complete.)
If you don't believe that copying not approved by the publisher is just like kidnapping and murder, you might prefer not to use the word “piracy” to describe it. Neutral terms such as “unauthorized copying” (or “prohibited copying” for the situation where it is illegal) are available for use instead. Some of us might even prefer to use a positive term such as “sharing information with your neighbor.”
A US judge, presiding over a trial for copyright infringement, recognized that “piracy” and “theft” are smear words.
I am interested to see if it's worth porting some of my iOS apps to Android.
An iPhone may be more "locked down" than an Android equivalent in terms of what you can install, but when the App store is so robust, you really don't feel any pain from the walled garden.
An iPhone user doesn't need to side load a bunch of software to get the job done -- the App store has high quality tools for 99% of use cases and most are available for a couple bucks.
but apparently it's not quite atomic. the Timed Publishing documentation notes say: If you ... add release notes to your app’s “What’s new in this release?” section while you're in timed publishing mode, they'll be published immediately.
that's so confusing! if I want to update release notes about a new release I'm going to make live soon, why would I want them to be published immediately? huh?
I also think efforts like Fairphone are also promising. Android does provide a nice solid base to build on top of. What's missing is a community effort we see around Linux to build a completely open platform on top of what's already available.
not disagreeing, but i'm skeptical android will ever attain iOS's level of fan-appreciation or polish. if becoming like iOS is their goal, Google is probably playing a losing game.