Merge "Adding client side logging for receivers."

This commit is contained in:
Jacob Hobbie
2022-01-05 17:47:53 +00:00
committed by Android (Google) Code Review
3 changed files with 83 additions and 6 deletions

View File

@@ -1796,6 +1796,7 @@ class ContextImpl extends Context {
&& ((flags & Context.RECEIVER_NOT_EXPORTED) == 0)) {
flags = flags | Context.RECEIVER_EXPORTED;
}
final Intent intent = ActivityManager.getService().registerReceiverWithFeature(
mMainThread.getApplicationThread(), mBasePackageName, getAttributionTag(),
AppOpsManager.toReceiverId(receiver), rd, filter, broadcastPermission, userId,
@@ -1810,6 +1811,9 @@ class ContextImpl extends Context {
return intent;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (WtfException e) {
Log.wtf(TAG, e.getMessage());
return null;
}
}

View File

@@ -0,0 +1,66 @@
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Exception meant to be thrown instead of calling Log.wtf() such that server side code can
* throw this exception, and it will carry across the binder to do client side logging.
* {@hide}
*/
public final class WtfException extends RuntimeException implements Parcelable {
public static final @android.annotation.NonNull
Creator<WtfException> CREATOR = new Creator<WtfException>() {
@Override
public WtfException createFromParcel(Parcel source) {
return new WtfException(source.readString8());
}
@Override
public WtfException[] newArray(int size) {
return new WtfException[size];
}
};
public WtfException(@android.annotation.NonNull String message) {
super(message);
}
/** {@hide} */
public static Throwable readFromParcel(Parcel in) {
final String msg = in.readString8();
return new WtfException(msg);
}
/** {@hide} */
public static void writeToParcel(Parcel out, Throwable t) {
out.writeString8(t.getMessage());
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@android.annotation.NonNull Parcel dest, int flags) {
dest.writeString8(getMessage());
}
}

View File

@@ -189,6 +189,7 @@ import android.app.ProfilerInfo;
import android.app.PropertyInvalidatedCache;
import android.app.SyncNotedAppOp;
import android.app.WaitResult;
import android.app.WtfException;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManager;
import android.app.compat.CompatChanges;
@@ -12634,6 +12635,7 @@ public class ActivityManagerService extends IActivityManager.Stub
int callingUid;
int callingPid;
boolean instantApp;
boolean throwWtfException = false;
synchronized(this) {
if (caller != null) {
callerApp = getRecordForAppLOSP(caller);
@@ -12728,13 +12730,9 @@ public class ActivityManagerService extends IActivityManager.Stub
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
} else {
Slog.wtf(TAG,
callerPackage + ": Targeting T+ (version "
+ Build.VERSION_CODES.TIRAMISU
+ " and above) requires that one of RECEIVER_EXPORTED or "
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
// will be removed when enforcement is required
// Assume default behavior-- flag check is not enforced
throwWtfException = true;
flags |= Context.RECEIVER_EXPORTED;
}
} else if (!requireExplicitFlagForDynamicReceivers) {
@@ -12865,6 +12863,15 @@ public class ActivityManagerService extends IActivityManager.Stub
}
}
if (throwWtfException) {
throw new WtfException(
callerPackage + ": Targeting T+ (version "
+ Build.VERSION_CODES.TIRAMISU
+ " and above) requires that one of RECEIVER_EXPORTED or "
+ "RECEIVER_NOT_EXPORTED be specified when registering a "
+ "receiver");
}
return sticky;
}
}