Status Update
Comments
ra...@google.com <ra...@google.com> #2
st...@deliveroo.co.uk <st...@deliveroo.co.uk> #3
Here is what I found:
On API 31+, time was not updated after the host was waken up. While on API 30 and under, time was updated after host was waken up. The main difference is caused by switching the modem simulator. In API 30 and under, time will be updated whenever signal strength query is received.
Looking at the code in API 31+ for time update when signal strength query is received, I think it is possible that timeUpdate is not invoked
void NetworkService::HandleSignalStrength(const Client& client) {
std::vector<std::string> responses;
std::stringstream ss;
if (WakeupFromSleep()) {
misc_service_->TimeUpdate();
} else if (first_signal_strength_request_) {
first_signal_strength_request_ = false;
misc_service_->TimeUpdate();
}
android_last_signal_time_ = time(0);
auto response = BuildCSQCommandResponse(GetCurrentSignalStrength());
responses.push_back(response);
responses.push_back("OK");
client.SendCommandResponse(responses);
}
ra...@google.com <ra...@google.com> #5
st...@deliveroo.co.uk <st...@deliveroo.co.uk> #6
Still seeing this issue with Emulator 31.3.14 Stable. Refer to the screenshot.
st...@deliveroo.co.uk <st...@deliveroo.co.uk> #7
@devki How do I know if the fix is in 31.3.14 stable? Any tool for checking if a CL went into the specified version?
va...@gmail.com <va...@gmail.com> #8
da...@google.com <da...@google.com> #9
RE#9 Thanks Devki. Actually the fix is included in aosp-emu-31-release branch.
ap...@google.com <ap...@google.com> #10
Upload a new
rw...@gmail.com <rw...@gmail.com> #12
Hi Weilun, Devki,
Still seeing this issue on Emulator 31.3.15 Stable build.
Can you check if the changes are in 31.3.15 or not?
Description
Version used: 2.9.0
Devices/Android versions reproduced on: API 34
When we target API 34, WorkManager is crashing our application on startup if the "location" permissions are removed whilst the application is running.
Everything works fine whilst the application has the "location" permissions. When the "location" permissions are removed (whilst the application is running), the OS is killing the application (OS behaviour) and because SystemForegroundService is a STICKY service, the OS tries to restart the service which causes a security exception because the "location" permissions are no longer present.
This is a realistic user scenario which will happen many times in our production app. We can not prevent our application from crashing as this relates to the STICKY SystemForegroundService. Our application, can check the "location" permissions before scheduling the "worker", but we have no control over the user removing the "location" permissions after the "worker" has been scheduled by the WorkManager.
This behaviour only happens with WorkManager when targeting API 34 as per the restrictions documented here:
Here is the crash we are seeing on application startup:
Java.lang.SecurityException: Starting FGS with type location callerApp=ProcessRecord{34bbf76 32120:com.deliveroo.driverapp.test/u0a190} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_LOCATION] any of the permissions allOf=false [android.permission.ACCESS_COARSE_LOCATION, android.permission.ACCESS_FINE_LOCATION] and the app must be in the eligible state/exemptions to access the foreground only permission
We are using the WorkManager to run a CoroutineWorker which accesses the device location. We are scheduling the Worker as follows:
val request = OneTimeWorkRequest.Builder(worker.java)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build()
WorkManager.getInstance(context).enqueueUniqueWork(
ExistingWorkPolicy.KEEP,
request,
)
We are specifying FOREGROUND_SERVICE_TYPE_LOCATION in the ForegroundInfo:
ForegroundInfo(ONLINE_NOTIFICATION_ID, notificationsManager.onlineNotification, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION)
Our Android manifest specifies the "location" foregroundServiceType:
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="location"/>
As stated above, everything works fine until the user removes the "location" permissions after the "worker" has started. Then the OS kills our application and the OS tries to recover the STICKY SystemForegroundService which crashes because the app no longer as "location" permissions.
Please can you advise how we can avoid WorkManager crashing our application in the above scenario.