← Back to team overview

ubuntu-phone team mailing list archive

Re: The problem with "no background processing for apps"

 

On Fri, Oct 2, 2015 at 11:14 AM, Andrea Bernabei
<andrea.bernabei@xxxxxxxxxxxxx> wrote:
>
>
> On Fri, Oct 2, 2015 at 8:46 AM, Thomas Voß <thomas.voss@xxxxxxxxxxxxx>
> wrote:
>>
>> On Fri, Oct 2, 2015 at 9:20 AM, Benjamin Zeller
>> <benjamin.zeller@xxxxxxxxxxxxx> wrote:
>> > Hey all,
>> >
>> > I also put my thoughts inline:
>> >
>> >> Hey Simon,
>> >>
>> >> Thanks for your thoughts and ideas. Please find my suggestions and
>> >> replies inline:
>> >>
>> >> On Thu, Oct 1, 2015 at 1:16 PM, Sturm Flut <sturmflut@xxxxxxxxxxxxxx>
>> >> wrote:
>> >>>
>> >>> Good morning dear list,
>> >>>
>> >>> this has been brewing for quite some time now and the discussion
>> >>> Krzysztof Tataradziński started a week ago didn't lead anywhere again,
>> >>> so I'm starting it yet another time:
>> >>>
>> >>> In my opinion the "no background processing for apps on the phone"
>> >>> design decision is wrong, is already hurting us too much and has to be
>> >>> revoked as soon as possible.
>> >>>
>> >> To state this very clearly: We are looking at a continuum of potential
>> >> solutions here.
>> >> It is unfortunately not as simple as just revoking one solution and
>> >> picking another one, but
>> >> all the different objectives have to be balanced. To this end, let me
>> >> clarify some of the guiding
>> >> principles and objectives that have to be accounted for in the context
>> >> of lifecycle policies:
>> >>
>> >> (1.) Battery life: One of the scarcest resources on a mobile device
>> >> and something that we aim
>> >> to protect as much as possible. Allowing arbitrary background
>> >> processing hurts a lot here, with Android's
>> >> lifecycle approach being one of the examples where battery life
>> >> deteriorates and becomes unpredictable
>> >> depending on the apps that have been installed on the device. Now this
>> >> wouldn't be a problem for the
>> >> quite technical audience subscribed to this mailing list. But it is
>> >> certainly an issue for the average user who
>> >> should not be forced to maintain a list of running apps and processes
>> >> just to achieve sensible battery life.
>> >
>> > Agreed, having a solution that protects battery life is important,
>> > however
>> > that does not mean we can't have a way for the advanced user to allow
>> > _some_ processes to run in background. Probably something that can
>> > be turned on in the system settings per application. Giving full control
>> > over
>> > what can run in background.
>> >
>> > With convergence in mind, a user probably will need a way to allow his
>> > terminal
>> > to run in background while it compiles something, lets also make sure
>> > we can give solutions to a more technical audience. After all this is
>> > the
>> > audience
>> > that uses Ubuntu Phone atm!
>>
>> Sure, I'm not opposed to having dev-mode settings that can be
>> leveraged by tech-savvy users. However, as saviq pointed out,
>> we have to avoid apps not working as expected if the average user does
>> not opt-in. On top, if we just allow settings to be tweaked
>> there is no reason for app authors to pick up our platform principles
>> and guidelines. The next step is a wave of apps in the store that
>> only work if you switch on certain settings on the device. That's a
>> worst case scenario from my POV.
>
>
> If we really want users to be able to have full control over the devices
> like
> we say we do, then they should be able to enable/disable apps permissions,
> which is what BlackBerry10 does, for instance.
>
> And the apps will have to take care of that, warning the user whenever they
> cannot complete a task because of a permission that the user has denied.
> That is giving power to the user, isn't it?
>

Sure, our trust infrastructure handles exactly that. The notable
exception is that we don't offer a generic
background execution service for reasons discussed here. Also: Putting
users into power requires us to make
sure that users are well informed and able to handle granted powers.

>>
>> >>
>> >> (2.) Security & privacy: One of the worst case examples are apps
>> >> running in the background, feeding on a device's
>> >> sensor data and sending it off to the cloud. There have been numerous
>> >> examples exploiting the issue on Android.
>> >> Again, the technical audience subscribed here would be fine, the
>> >> average user likely is not.
>> >
>> > But won't this be possible with a system service and helpers as well?
>> > Lets say we have a system service that lets a helper collect GPS data,
>> > won't the helper be able to upload that data?
>> > Because some apps might even need this, lets look at the famous sports
>> > tracker
>> > example. It needs to collect your gps positions and upload them.
>>
>> Well, that's debatable. We usually go for a very strict setting (e.g.
>> in scopes) that prevents network access if access to local
>> resources is granted. You only get network access if the only local
>> resources you access are the ones specific to your app.
>>
>> We surely cannot solve the problem of spying applications once and for
>> all. But we can work hard to make sure that a user
>> stays on top of what apps _and_ the system is doing, putting her in a
>> position of control and power.
>>
>> >>
>> >> (3.) Predictable performance: A phone is expected to perform whenever
>> >> it is needed to, and the application being front & center
>> >> to the user should provide a smooth and crisp experience. To this end,
>> >> the system has to be able to assign as much performance-relevant
>> >> resources as possible to the currently focused app. If arbitrary
>> >> background processing is allowed, the respective scheduling problem
>> >> becomes
>> >> very very hard to solve (if possible at all).
>> >
>> > Couldn't that be solved by giving the background processes time slots
>> > when they can execute? And probably an API to register system resources
>> > that can wake them up for a time frame? Lets say a socket.
>>
>> Sure, moving processes to specific cgroups if they are not visible to
>> the user is possible and something we have on the list
>> to explore. However, we are talking about heuristics, not a solution
>> that will always work regardless of the installed apps.
>>
>> >>
>> >> Please note that there are way more aspects to this problem space than
>> >> just the three points I elaborated on before.
>> >> The key point is: For a technical or tech-savvy audience, the
>> >> lifecycle approach we are taking for the phone might seem overly
>> >> restricted.
>> >> However, for the average user, such a harsh policy comes with a lot of
>> >> benefits.
>> >
>> > I still agree for the average user will benefit from that, but until we
>> > reach
>> > that point of completeness we just lack critical APIs for apps, and devs
>> > might not even start to write their apps or contact us to tell: "Hey I'm
>> > missing
>> > this or that, could you implement it please".
>> >
>>
>> Well, I would argue that we already have a lot of feedback that we
>> have to systematically work on.
>> We either go down the route of systematically iterating on the system
>> capabilities or we open the flood gates and
>> just give up on our principles. Point being that taking features back
>> is almost impossible
>>
>> > Another drawback of doing things completely different is of course the
>> > higher
>> > cost in porting applications to our platform. There is no way to port a
>> > Qt
>> > app
>> > that requires background processing to Ubuntu Phone without rewriting
>> > big
>> > parts
>> > of it to use our system services and helpers. So the porting is no
>> > longer
>> > effortless
>> > thus appdevs will wait for a critical mass of phone users to appear but
>> > the
>> > phone
>> > users will only appear when there is a critical mass of apps.... this
>> > problem again.
>> >
>>
>> I'm all in for making porting as efficient as possible. That does not
>> imply, though, to give up
>> on our principles. In addition, our platform behaves and operates
>> similar to other major mobile OS's, with the
>> notable difference that we are working hard to ensure that "good
>> practice" is actually adhered to :)
>>
>> I think we should avoid having battery optimizers and similar system
>> maintenance tools in the store.
>>
>> >>> Why? Let me make a list of examples.
>> >>>
>> >>> - Open Telegram for Ubuntu, send a picture to a friend, switch to
>> >>> another app or scope. On any other platform the message would continue
>> >>> to be sent in the background, but not on Ubuntu. Now you might say
>> >>> "Telegram is going to become a Telepathy plugin, and that one can run
>> >>> in
>> >>> the background", but there is no sign of a Telepathy system service
>> >>> and
>> >>> even if it were already present, you're now forcing everybody to build
>> >>> Telepathy plugins for their services. That's just not going to happen.
>> >>> Let's be honest, WhatsApp and Viber and friends will not go this way
>> >>> for
>> >>> a number of very good (economic) reasons.
>> >>>
>> >>> - Notifications for the myriads of services out there. On any other
>> >>> platform the app would just register a small background service that
>> >>> wakes up every minute or so and then goes to sleep again. Now you
>> >>> might
>> >>> say "We have the Ubuntu Push Notifications service for that", but that
>> >>> requires the service provider to change his whole server side, which
>> >>> noone except Telegram does. That's why we already have to run
>> >>> account-polld.
>> >>>
>> >> That's actually not true in the general case. Most often, the services
>> >> use the platform's push notification
>> >> infrastructure to deliver updates. Please note that we require
>> >> account-polld to work around the limitation that
>> >> facebook, twitter and google have not integrated with our
>> >> infrastructure
>> >> (yet).
>> >>
>> >>> - An app that processes location updates in the background, e.g. a
>> >>> fitness tracker or a navigation app. Now this is IMO the best example
>> >>> for how the "no background processing" decision complicates everything
>> >>> to infinity: The simple solution would be to have a small background
>> >>> service that just does whatever it has to do. But since we can't do
>> >>> that, we have to come up with a very convoluted system that most
>> >>> likely
>> >>> involves registering for some list of events with location-service,
>> >>> which then calls a small handler binary provided by the app (like the
>> >>> push notifications design). But how do you prevent that handler from
>> >>> running amok, or from just keep running in the background? Ah, yeah,
>> >>> kill it after five seconds, like the push notification handlers. But
>> >>> five seconds on a slow CPU aren't much when I e.g. also have to do
>> >>> some
>> >>> I/O and use D-Bus, while five seconds on a fast CPU are a lot of time
>> >>> if
>> >>> I don't have to do much. So what's the right maximum runtime for a
>> >>> handler that covers all use cases? There is none. Will
>> >>> location-service
>> >>> support all the event/filter/callback options I need for my specific
>> >>> app? Most likely not.
>> >>>
>> >> It will grant a certain amount of processing time to your app or
>> >> better its location update helper. A fitness tracker could easily just
>> >> store
>> >> the respective update for later processing.
>> >
>> > Even a fitness tracker might give you stats while you are still running,
>> > e.g. Endomondo tells you how fast you managed to run the last lap, for
>> > that is has to process the data while the screen is off and not just
>> > store
>> > it.
>> > Not sure if the small timeslot for a helper is enough for that.
>> >
>>
>> Now that's certainly a solvable problem.
>>
>> >> A navigation app would
>> >> require more sophisticated schemes, but we are happy to evolve the
>> >> service as required (as pointed out earlier).
>> >>
>> >>> - Cloud and P2P services like Owncloud, Dropbox, Syncthing, Tox etc.
>> >>> Apps that control devices via Bluetooth, like my FitBit or a
>> >>> Smartwatch.
>> >>> What's the design for those? More system services? We can't afford to
>> >>> write a system service for each and every use case. That doesn't
>> >>> scale.
>> >>> It already isn't scaling right now. And even if we could, is the
>> >>> proposed solution really to have 100 system services running for all
>> >>> users, instead of five to ten third party background processes that
>> >>> the
>> >>> user really needs and knowingly installed herself?
>> >>>
>> >> We would not write a system service for each of them, but instead
>> >> provide a framework to handle the specific problem area.
>> >> It is a lot of work to get those frameworks right, and your help is
>> >> obviously greatly appreciated in doing so. Other than that, it is
>> >> really really easy
>> >> to integrate cloud services with the content-hub infrastructure and
>> >> thus exposing the content in the system.
>> >>
>> >>> I can come up with many more examples for how this is simply
>> >>> complicating our lives, and for what reason? A (tiny) gain in battery
>> >>> life.
>> >>
>> >> Please see the initial list of objectives and guiding principles. On a
>> >> very personal note, I don't think the aim should be to make "our" life
>> >> easier but
>> >> to make the life of users as pleasant as possible. If that means to
>> >> come up with novel and probably harsh solutions and policies to
>> >> address certain
>> >> problems ... that's what it is.
>> >
>> > I agree that we should not make "our" life easier and aim for a good
>> > solution, however we need to be careful to not aim too high for a goal
>> > we can not reach in a suitable time.
>> >>
>> >>
>> >> We have many apps that cannot be built/ported right now because we
>> >>>
>> >>> are waiting for APIs and system services that haven't been coming for
>> >>> a
>> >>> year now and only have to be created because we can't just run in the
>> >>> background. Do we even know if the effect on battery life is really
>> >>> worth it? I challenge you to run e.g. Dekko as a lifecycle exception
>> >>> and
>> >>> check if the background polling is noticeable. Because it's not like
>> >>> those system services don't consume any resources at all, the work has
>> >>> to be done by somebody. A "bad" Telepathy plugin will consume just as
>> >>> much resources as a "bad" background process, the "better" design of
>> >>> using Telepathy alone is not going to prevent this.
>> >>>
>> >> They do consume resources, for sure. The point is: A fixed set of
>> >> system services controlled and maintained by us results in predictable
>> >> battery life (modulo bugs).
>> >> The real question is not if battery life would deteriorate for
>> >> allowing a specific app to poll in the background. Instead, the
>> >> question has to target the general behavior of
>> >> the system with arbitrary apps being installed in the system.
>> >
>> > So please correct me if I'm wrong, is the idea here that lets say
>> > Facebook
>> > provides
>> > his own closed telepathy plugin? If that is so, what's the difference
>> > from a
>> > "normal"
>> > background process? If that plugin behaves badly we can not do much
>> > about it
>> > right?
>> > At least not without probably breaking its functionality.
>> >
>>
>> There are multiple benefits to it:
>>
>>   (1.) Tight integration with our platform UI and UX.
>>   (2.) The ability to tightly control resources granted to the
>> respective backend.
>>   (3.) We will likely setup a more strict review procedure for those
>> extensions, together with domain-specific test-suites and potentially
>> audits.
>>
>> In terms of handling extensions that behave poorly: With the context
>> of the problem domain (e.g., messaging) handling errors and confining
>> operation in general becomes a lot more tractable. The more specific
>> the use-case the more specific control mechanisms can be.
>>
>> > Or is the idea here we will provide something more generic that will use
>> > app
>> > helpers
>> > like we do in other scenarios?
>> >>
>> >>
>> >>> What also really confuses me about this issue is that the "no
>> >>> background
>> >>> processing" approach apparently only applies to mobile devices and
>> >>> confined apps. Isn't that somehow against the whole idea of an Ubuntu
>> >>> that is the same on all devices?
>> >>>
>> >> It certainly is not. A lifecycle policy is always specific to a
>> >> device, its resources and even the specific usage scenario.
>> >> With that, allowing multiple apps to run even if not focused in
>> >> desktop-like use-cases is perfectly fine. Even altering the behavior
>> >> in case of a phone being plugged in to a power supply would be
>> >> perfectly
>> >> fine.
>> >
>> > +1, but it would be nice if the user could override that in some way.
>> > Right
>> > now I'm also
>> > able to override powersaving on my laptop if I really want to waste
>> > battery
>> > life.
>> >>
>> >>
>> >>> I would really like to hear all your thoughts on this and how we're
>> >>> going to solve the situation, because we quite frankly have actual
>> >>> problems (broken GPS, no SD card support for apps, no Bluetooth, no
>> >>> SIM
>> >>> Toolkit, etc.) which should have a much higher priority than building
>> >>> convoluted and complex designs just to potentially save three hours of
>> >>> battery life over the course of a week.
>> >>>
>> >> As pointed out in my introductory comment: battery life is one of
>> >> multiple concerns we have to address.
>> >>
>> >> Cheers,
>> >>
>> >>    Thomas
>> >
>> > Just want to point out, I'm aware this is no easy decision and with
>> > whatever
>> > we decide we have to stay with or break apps later. So there is no
>> > temporary
>> > solution we
>> > can deprecate later without breaking apps, which is IMHO not an option.
>> >
>>
>> +1, whatever we come up with has to be aligned with what we want to
>> support in the future.
>>
>> Cheers,
>>
>>   Thomas
>>
>> > Cheers,
>> >
>> > Benjamin
>>
>> --
>> Mailing list: https://launchpad.net/~ubuntu-phone
>> Post to     : ubuntu-phone@xxxxxxxxxxxxxxxxxxx
>> Unsubscribe : https://launchpad.net/~ubuntu-phone
>> More help   : https://help.launchpad.net/ListHelp
>
>


Follow ups

References