diff options
author | 2019-12-20 07:41:58 +0900 | |
---|---|---|
committer | 2020-01-03 23:10:32 +0900 | |
commit | 420c2fc1554230d480553b179e8abf4b2bf483da (patch) | |
tree | b2824fb7a562a57b3bde77e8f3eb6c7ffbcd59c2 | |
parent | 723628b5df628d950a04e61345b95454633cb16a (diff) |
Move media/apex to apex/media
And fix some lint warnings.
Test: build & boot
Change-Id: Ib59aa788b02e5bf77dd1355766adbb57860cf737
-rw-r--r-- | Android.bp | 2 | ||||
-rw-r--r-- | apex/media/Android.bp | 120 | ||||
-rw-r--r-- | apex/media/OWNERS | 4 | ||||
-rw-r--r-- | apex/media/jarjar_rules.txt (renamed from media/jarjar_rules.txt) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/BufferingParams.java (renamed from media/apex/java/android/media/BufferingParams.java) | 4 | ||||
-rw-r--r-- | apex/media/java/android/media/Controller2Link.aidl (renamed from media/apex/java/android/media/Controller2Link.aidl) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/Controller2Link.java (renamed from media/apex/java/android/media/Controller2Link.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/DataSourceCallback.java (renamed from media/apex/java/android/media/DataSourceCallback.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/IMediaController2.aidl (renamed from media/apex/java/android/media/IMediaController2.aidl) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/IMediaSession2.aidl (renamed from media/apex/java/android/media/IMediaSession2.aidl) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/IMediaSession2Service.aidl (renamed from media/apex/java/android/media/IMediaSession2Service.aidl) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/MediaConstants.java (renamed from media/apex/java/android/media/MediaConstants.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/MediaController2.java (renamed from media/apex/java/android/media/MediaController2.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/MediaParser.java (renamed from media/apex/java/android/media/MediaParser.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/MediaSession2.java (renamed from media/apex/java/android/media/MediaSession2.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/MediaSession2Service.java (renamed from media/apex/java/android/media/MediaSession2Service.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/ProxyDataSourceCallback.java (renamed from media/apex/java/android/media/ProxyDataSourceCallback.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/RoutingDelegate.java (renamed from media/apex/java/android/media/RoutingDelegate.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/Session2Command.aidl (renamed from media/apex/java/android/media/Session2Command.aidl) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/Session2Command.java (renamed from media/apex/java/android/media/Session2Command.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/Session2CommandGroup.java (renamed from media/apex/java/android/media/Session2CommandGroup.java) | 4 | ||||
-rw-r--r-- | apex/media/java/android/media/Session2Link.java (renamed from media/apex/java/android/media/Session2Link.java) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/Session2Token.aidl (renamed from media/apex/java/android/media/Session2Token.aidl) | 0 | ||||
-rw-r--r-- | apex/media/java/android/media/Session2Token.java (renamed from media/apex/java/android/media/Session2Token.java) | 21 | ||||
-rw-r--r-- | media/Android.bp | 107 | ||||
-rw-r--r-- | media/apex/java/android/media/CloseGuard.java | 308 |
26 files changed, 138 insertions, 432 deletions
diff --git a/Android.bp b/Android.bp index 4b82e1d26edc..e1f5abd9ff3e 100644 --- a/Android.bp +++ b/Android.bp @@ -284,6 +284,7 @@ java_defaults { name: "framework-aidl-export-defaults", aidl: { export_include_dirs: [ + "apex/media/java", "core/java", "drm/java", "graphics/java", @@ -291,7 +292,6 @@ java_defaults { "location/java", "lowpan/java", "media/java", - "media/apex/java", "media/mca/effect/java", "media/mca/filterfw/java", "media/mca/filterpacks/java", diff --git a/apex/media/Android.bp b/apex/media/Android.bp new file mode 100644 index 000000000000..6bd0086681a7 --- /dev/null +++ b/apex/media/Android.bp @@ -0,0 +1,120 @@ +// Copyright (C) 2020 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. + +java_library { + name: "updatable-media", + + srcs: [ + ":updatable-media-srcs", + ], + + aidl: { + export_include_dirs: [ + "java", + ], + + // It would be great if we don't need to add include_dirs for public + // parcelable classes. Find a better way. + include_dirs: [ + // To refer: + // android.os.Bundle + // android.os.ResultReceiver + "frameworks/base/core/java", + ], + }, + + permitted_packages: [ + "android.media", + ], + + installable: true, + + // TODO: build against stable API surface. Use core_platform for now to avoid + // link-check failure with exoplayer building against "current". + sdk_version: "core_platform", + libs: [ + // The order matters. android_system_* library should come later. + "framework_media_annotation", + "android_system_stubs_current", + ], + + static_libs: [ + "exoplayer2-core" + ], + jarjar_rules: "jarjar_rules.txt", + + plugins: ["java_api_finder"], +} + +filegroup { + name: "updatable-media-srcs", + srcs: [ + ":mediaparser-srcs", + ":mediasession2-srcs", + ], +} + +filegroup { + name: "mediasession2-srcs", + srcs: [ + "java/android/media/Controller2Link.java", + "java/android/media/IMediaController2.aidl", + "java/android/media/IMediaSession2.aidl", + "java/android/media/IMediaSession2Service.aidl", + "java/android/media/MediaConstants.java", + "java/android/media/MediaController2.java", + "java/android/media/MediaSession2.java", + "java/android/media/MediaSession2Service.java", + "java/android/media/Session2Command.java", + "java/android/media/Session2CommandGroup.java", + "java/android/media/Session2Link.java", + "java/android/media/Session2Token.java", + ], + path: "java", +} + +filegroup { + name: "mediaparser-srcs", + srcs: [ + "java/android/media/MediaParser.java" + ], + path: "java" +} + +droidstubs { + name: "updatable-media-stubs", + srcs: [ + ":updatable-media-srcs", + ":framework-media-annotation-srcs", + ], + defaults: [ "framework-module-stubs-defaults-systemapi" ], + aidl: { + // TODO(b/135922046) remove this + include_dirs: ["frameworks/base/core/java"], + }, + sdk_version: "system_current", +} + +java_library { + name: "updatable_media_stubs", + srcs: [":updatable-media-stubs"], + sdk_version: "system_current", +} + +java_library { + name: "framework_media_annotation", + srcs: [":framework-media-annotation-srcs"], + installable: false, + sdk_version: "core_current", +} diff --git a/apex/media/OWNERS b/apex/media/OWNERS new file mode 100644 index 000000000000..0ac750cde41d --- /dev/null +++ b/apex/media/OWNERS @@ -0,0 +1,4 @@ +andrewlewis@google.com +dwkang@google.com +marcone@google.com +sungsoo@google.com diff --git a/media/jarjar_rules.txt b/apex/media/jarjar_rules.txt index d89d9d3343d1..d89d9d3343d1 100644 --- a/media/jarjar_rules.txt +++ b/apex/media/jarjar_rules.txt diff --git a/media/apex/java/android/media/BufferingParams.java b/apex/media/java/android/media/BufferingParams.java index 943f14277fc3..04af02874bbd 100644 --- a/media/apex/java/android/media/BufferingParams.java +++ b/apex/media/java/android/media/BufferingParams.java @@ -16,13 +16,9 @@ package android.media; -import android.annotation.IntDef; import android.os.Parcel; import android.os.Parcelable; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - /** * Structure for source buffering management params. * diff --git a/media/apex/java/android/media/Controller2Link.aidl b/apex/media/java/android/media/Controller2Link.aidl index 64edafcb11fc..64edafcb11fc 100644 --- a/media/apex/java/android/media/Controller2Link.aidl +++ b/apex/media/java/android/media/Controller2Link.aidl diff --git a/media/apex/java/android/media/Controller2Link.java b/apex/media/java/android/media/Controller2Link.java index 04185e79b0ad..04185e79b0ad 100644 --- a/media/apex/java/android/media/Controller2Link.java +++ b/apex/media/java/android/media/Controller2Link.java diff --git a/media/apex/java/android/media/DataSourceCallback.java b/apex/media/java/android/media/DataSourceCallback.java index c297ecda249c..c297ecda249c 100644 --- a/media/apex/java/android/media/DataSourceCallback.java +++ b/apex/media/java/android/media/DataSourceCallback.java diff --git a/media/apex/java/android/media/IMediaController2.aidl b/apex/media/java/android/media/IMediaController2.aidl index 42c6e70529ec..42c6e70529ec 100644 --- a/media/apex/java/android/media/IMediaController2.aidl +++ b/apex/media/java/android/media/IMediaController2.aidl diff --git a/media/apex/java/android/media/IMediaSession2.aidl b/apex/media/java/android/media/IMediaSession2.aidl index 26e717b39afc..26e717b39afc 100644 --- a/media/apex/java/android/media/IMediaSession2.aidl +++ b/apex/media/java/android/media/IMediaSession2.aidl diff --git a/media/apex/java/android/media/IMediaSession2Service.aidl b/apex/media/java/android/media/IMediaSession2Service.aidl index 10ac1be0a36e..10ac1be0a36e 100644 --- a/media/apex/java/android/media/IMediaSession2Service.aidl +++ b/apex/media/java/android/media/IMediaSession2Service.aidl diff --git a/media/apex/java/android/media/MediaConstants.java b/apex/media/java/android/media/MediaConstants.java index ce108894b9a5..ce108894b9a5 100644 --- a/media/apex/java/android/media/MediaConstants.java +++ b/apex/media/java/android/media/MediaConstants.java diff --git a/media/apex/java/android/media/MediaController2.java b/apex/media/java/android/media/MediaController2.java index c3dd3fe4451c..c3dd3fe4451c 100644 --- a/media/apex/java/android/media/MediaController2.java +++ b/apex/media/java/android/media/MediaController2.java diff --git a/media/apex/java/android/media/MediaParser.java b/apex/media/java/android/media/MediaParser.java index ac66d1b7f4ad..ac66d1b7f4ad 100644 --- a/media/apex/java/android/media/MediaParser.java +++ b/apex/media/java/android/media/MediaParser.java diff --git a/media/apex/java/android/media/MediaSession2.java b/apex/media/java/android/media/MediaSession2.java index 081e76ab0215..081e76ab0215 100644 --- a/media/apex/java/android/media/MediaSession2.java +++ b/apex/media/java/android/media/MediaSession2.java diff --git a/media/apex/java/android/media/MediaSession2Service.java b/apex/media/java/android/media/MediaSession2Service.java index f6fd509fd245..f6fd509fd245 100644 --- a/media/apex/java/android/media/MediaSession2Service.java +++ b/apex/media/java/android/media/MediaSession2Service.java diff --git a/media/apex/java/android/media/ProxyDataSourceCallback.java b/apex/media/java/android/media/ProxyDataSourceCallback.java index 14d3ce87f03d..14d3ce87f03d 100644 --- a/media/apex/java/android/media/ProxyDataSourceCallback.java +++ b/apex/media/java/android/media/ProxyDataSourceCallback.java diff --git a/media/apex/java/android/media/RoutingDelegate.java b/apex/media/java/android/media/RoutingDelegate.java index 23598130f391..23598130f391 100644 --- a/media/apex/java/android/media/RoutingDelegate.java +++ b/apex/media/java/android/media/RoutingDelegate.java diff --git a/media/apex/java/android/media/Session2Command.aidl b/apex/media/java/android/media/Session2Command.aidl index 43a7b123ed29..43a7b123ed29 100644 --- a/media/apex/java/android/media/Session2Command.aidl +++ b/apex/media/java/android/media/Session2Command.aidl diff --git a/media/apex/java/android/media/Session2Command.java b/apex/media/java/android/media/Session2Command.java index 26f4568fa7e5..26f4568fa7e5 100644 --- a/media/apex/java/android/media/Session2Command.java +++ b/apex/media/java/android/media/Session2Command.java diff --git a/media/apex/java/android/media/Session2CommandGroup.java b/apex/media/java/android/media/Session2CommandGroup.java index 0ee5f62be128..13aabfc45ab7 100644 --- a/media/apex/java/android/media/Session2CommandGroup.java +++ b/apex/media/java/android/media/Session2CommandGroup.java @@ -38,8 +38,8 @@ import java.util.Set; public final class Session2CommandGroup implements Parcelable { private static final String TAG = "Session2CommandGroup"; - public static final @android.annotation.NonNull Parcelable.Creator<Session2CommandGroup> CREATOR = - new Parcelable.Creator<Session2CommandGroup>() { + public static final @android.annotation.NonNull Parcelable.Creator<Session2CommandGroup> + CREATOR = new Parcelable.Creator<Session2CommandGroup>() { @Override public Session2CommandGroup createFromParcel(Parcel in) { return new Session2CommandGroup(in); diff --git a/media/apex/java/android/media/Session2Link.java b/apex/media/java/android/media/Session2Link.java index 6e550e86a9fe..6e550e86a9fe 100644 --- a/media/apex/java/android/media/Session2Link.java +++ b/apex/media/java/android/media/Session2Link.java diff --git a/media/apex/java/android/media/Session2Token.aidl b/apex/media/java/android/media/Session2Token.aidl index c5980e9e77fd..c5980e9e77fd 100644 --- a/media/apex/java/android/media/Session2Token.aidl +++ b/apex/media/java/android/media/Session2Token.aidl diff --git a/media/apex/java/android/media/Session2Token.java b/apex/media/java/android/media/Session2Token.java index 6eb76b11497e..aae2e1bcb6df 100644 --- a/media/apex/java/android/media/Session2Token.java +++ b/apex/media/java/android/media/Session2Token.java @@ -52,17 +52,18 @@ import java.util.Objects; public final class Session2Token implements Parcelable { private static final String TAG = "Session2Token"; - public static final @android.annotation.NonNull Creator<Session2Token> CREATOR = new Creator<Session2Token>() { - @Override - public Session2Token createFromParcel(Parcel p) { - return new Session2Token(p); - } + public static final @android.annotation.NonNull Creator<Session2Token> CREATOR = + new Creator<Session2Token>() { + @Override + public Session2Token createFromParcel(Parcel p) { + return new Session2Token(p); + } - @Override - public Session2Token[] newArray(int size) { - return new Session2Token[size]; - } - }; + @Override + public Session2Token[] newArray(int size) { + return new Session2Token[size]; + } + }; /** * @hide diff --git a/media/Android.bp b/media/Android.bp index a1365179c53a..499d0da3079f 100644 --- a/media/Android.bp +++ b/media/Android.bp @@ -1,110 +1,3 @@ -java_library { - name: "updatable-media", - - srcs: [ - ":updatable-media-srcs", - ], - - aidl: { - export_include_dirs: [ - "apex/java", - ], - - // It would be great if we don't need to add include_dirs for public - // parcelable classes. Find a better way. - include_dirs: [ - // To refer: - // android.os.Bundle - // android.os.ResultReceiver - "frameworks/base/core/java", - ], - }, - - permitted_packages: [ - "android.media", - ], - - installable: true, - - // TODO: build against stable API surface. Use core_platform for now to avoid - // link-check failure with exoplayer building against "current". - sdk_version: "core_platform", - libs: [ - // The order matters. android_system_* library should come later. - "framework_media_annotation", - "android_system_stubs_current", - ], - - static_libs: [ - "exoplayer2-core" - ], - jarjar_rules: "jarjar_rules.txt", - - plugins: ["java_api_finder"], -} - -filegroup { - name: "updatable-media-srcs", - srcs: [ - ":mediaparser-srcs", - ":mediasession2-srcs", - ], -} - -filegroup { - name: "mediasession2-srcs", - srcs: [ - "apex/java/android/media/Controller2Link.java", - "apex/java/android/media/IMediaController2.aidl", - "apex/java/android/media/IMediaSession2.aidl", - "apex/java/android/media/IMediaSession2Service.aidl", - "apex/java/android/media/MediaConstants.java", - "apex/java/android/media/MediaController2.java", - "apex/java/android/media/MediaSession2.java", - "apex/java/android/media/MediaSession2Service.java", - "apex/java/android/media/Session2Command.java", - "apex/java/android/media/Session2CommandGroup.java", - "apex/java/android/media/Session2Link.java", - "apex/java/android/media/Session2Token.java", - ], - path: "apex/java", -} - -filegroup { - name: "mediaparser-srcs", - srcs: [ - "apex/java/android/media/MediaParser.java" - ], - path: "apex/java" -} - -droidstubs { - name: "updatable-media-stubs", - srcs: [ - ":updatable-media-srcs", - ":framework-media-annotation-srcs", - ], - defaults: [ "framework-module-stubs-defaults-systemapi" ], - aidl: { - // TODO(b/135922046) remove this - include_dirs: ["frameworks/base/core/java"], - }, - sdk_version: "system_current", -} - -java_library { - name: "updatable_media_stubs", - srcs: [":updatable-media-stubs"], - sdk_version: "system_current", -} - -java_library { - name: "framework_media_annotation", - srcs: [":framework-media-annotation-srcs"], - installable: false, - sdk_version: "core_current", -} - aidl_interface { name: "audio_common-aidl", local_include_dir: "java", diff --git a/media/apex/java/android/media/CloseGuard.java b/media/apex/java/android/media/CloseGuard.java deleted file mode 100644 index 20146739fe4c..000000000000 --- a/media/apex/java/android/media/CloseGuard.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Copyright (C) 2010 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.media; - -import android.util.Log; - -/** - * Note: This file is copied from dalvik.system package with the following modifications: - * - Remove @CorePlatformApi, @IntraCoreApi and @UnsupportedAppUsage annotations. - * - Replace System.logW() with android.util.Log.w(). - * This file should be used only within media mainline module. - * TODO: Remove this file and use dalvik.system.CloseGuard once - * @CorePlatformApi becomes stable or we have a replacement in SDK API. - * b/120419300 - * - * CloseGuard is a mechanism for flagging implicit finalizer cleanup of - * resources that should have been cleaned up by explicit close - * methods (aka "explicit termination methods" in Effective Java). - * <p> - * A simple example: <pre> {@code - * class Foo { - * - * {@literal @}ReachabilitySensitive - * private final CloseGuard guard = CloseGuard.get(); - * - * ... - * - * public Foo() { - * ...; - * guard.open("cleanup"); - * } - * - * public void cleanup() { - * guard.close(); - * ...; - * } - * - * protected void finalize() throws Throwable { - * try { - * // Note that guard could be null if the constructor threw. - * if (guard != null) { - * guard.warnIfOpen(); - * } - * cleanup(); - * } finally { - * super.finalize(); - * } - * } - * } - * }</pre> - * - * In usage where the resource to be explicitly cleaned up is - * allocated after object construction, CloseGuard protection can - * be deferred. For example: <pre> {@code - * class Bar { - * - * {@literal @}ReachabilitySensitive - * private final CloseGuard guard = CloseGuard.get(); - * - * ... - * - * public Bar() { - * ...; - * } - * - * public void connect() { - * ...; - * guard.open("cleanup"); - * } - * - * public void cleanup() { - * guard.close(); - * ...; - * } - * - * protected void finalize() throws Throwable { - * try { - * // Note that guard could be null if the constructor threw. - * if (guard != null) { - * guard.warnIfOpen(); - * } - * cleanup(); - * } finally { - * super.finalize(); - * } - * } - * } - * }</pre> - * - * When used in a constructor, calls to {@code open} should occur at - * the end of the constructor since an exception that would cause - * abrupt termination of the constructor will mean that the user will - * not have a reference to the object to cleanup explicitly. When used - * in a method, the call to {@code open} should occur just after - * resource acquisition. - * - * The @ReachabilitySensitive annotation ensures that finalize() cannot be - * called during the explicit call to cleanup(), prior to the guard.close call. - * There is an extremely small chance that, for code that neglects to call - * cleanup(), finalize() and thus cleanup() will be called while a method on - * the object is still active, but the "this" reference is no longer required. - * If missing cleanup() calls are expected, additional @ReachabilitySensitive - * annotations or reachabilityFence() calls may be required. - * - * @hide - */ -final class CloseGuard { - - /** - * True if collection of call-site information (the expensive operation - * here) and tracking via a Tracker (see below) are enabled. - * Enabled by default so we can diagnose issues early in VM startup. - * Note, however, that Android disables this early in its startup, - * but enables it with DropBoxing for system apps on debug builds. - */ - private static volatile boolean stackAndTrackingEnabled = true; - - /** - * Hook for customizing how CloseGuard issues are reported. - * Bypassed if stackAndTrackingEnabled was false when open was called. - */ - private static volatile Reporter reporter = new DefaultReporter(); - - /** - * Hook for customizing how CloseGuard issues are tracked. - */ - private static volatile Tracker currentTracker = null; // Disabled by default. - - /** - * Returns a CloseGuard instance. {@code #open(String)} can be used to set - * up the instance to warn on failure to close. - */ - public static CloseGuard get() { - return new CloseGuard(); - } - - /** - * Enables/disables stack capture and tracking. A call stack is captured - * during open(), and open/close events are reported to the Tracker, only - * if enabled is true. If a stack trace was captured, the {@link - * #getReporter() reporter} is informed of unclosed resources; otherwise a - * one-line warning is logged. - */ - public static void setEnabled(boolean enabled) { - CloseGuard.stackAndTrackingEnabled = enabled; - } - - /** - * True if CloseGuard stack capture and tracking are enabled. - */ - public static boolean isEnabled() { - return stackAndTrackingEnabled; - } - - /** - * Used to replace default Reporter used to warn of CloseGuard - * violations when stack tracking is enabled. Must be non-null. - */ - public static void setReporter(Reporter rep) { - if (rep == null) { - throw new NullPointerException("reporter == null"); - } - CloseGuard.reporter = rep; - } - - /** - * Returns non-null CloseGuard.Reporter. - */ - public static Reporter getReporter() { - return reporter; - } - - /** - * Sets the {@link Tracker} that is notified when resources are allocated and released. - * The Tracker is invoked only if CloseGuard {@link #isEnabled()} held when {@link #open()} - * was called. A null argument disables tracking. - * - * <p>This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so - * MUST NOT be used for any other purposes. - */ - public static void setTracker(Tracker tracker) { - currentTracker = tracker; - } - - /** - * Returns {@link #setTracker(Tracker) last Tracker that was set}, or null to indicate - * there is none. - * - * <p>This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so - * MUST NOT be used for any other purposes. - */ - public static Tracker getTracker() { - return currentTracker; - } - - private CloseGuard() {} - - /** - * {@code open} initializes the instance with a warning that the caller - * should have explicitly called the {@code closer} method instead of - * relying on finalization. - * - * @param closer non-null name of explicit termination method. Printed by warnIfOpen. - * @throws NullPointerException if closer is null. - */ - public void open(String closer) { - // always perform the check for valid API usage... - if (closer == null) { - throw new NullPointerException("closer == null"); - } - // ...but avoid allocating an allocation stack if "disabled" - if (!stackAndTrackingEnabled) { - closerNameOrAllocationInfo = closer; - return; - } - String message = "Explicit termination method '" + closer + "' not called"; - Throwable stack = new Throwable(message); - closerNameOrAllocationInfo = stack; - Tracker tracker = currentTracker; - if (tracker != null) { - tracker.open(stack); - } - } - - // We keep either an allocation stack containing the closer String or, when - // in disabled state, just the closer String. - // We keep them in a single field only to minimize overhead. - private Object /* String or Throwable */ closerNameOrAllocationInfo; - - /** - * Marks this CloseGuard instance as closed to avoid warnings on - * finalization. - */ - public void close() { - Tracker tracker = currentTracker; - if (tracker != null && closerNameOrAllocationInfo instanceof Throwable) { - // Invoke tracker on close only if we invoked it on open. Tracker may have changed. - tracker.close((Throwable) closerNameOrAllocationInfo); - } - closerNameOrAllocationInfo = null; - } - - /** - * Logs a warning if the caller did not properly cleanup by calling an - * explicit close method before finalization. If CloseGuard was enabled - * when the CloseGuard was created, passes the stacktrace associated with - * the allocation to the current reporter. If it was not enabled, it just - * directly logs a brief message. - */ - public void warnIfOpen() { - if (closerNameOrAllocationInfo != null) { - if (closerNameOrAllocationInfo instanceof String) { - Log.w("CloseGuard", "A resource failed to call " - + (String) closerNameOrAllocationInfo + ". "); - } else { - String message = - "A resource was acquired at attached stack trace but never released. "; - message += "See java.io.Closeable for information on avoiding resource leaks."; - Throwable stack = (Throwable) closerNameOrAllocationInfo; - reporter.report(message, stack); - } - } - } - - /** - * Interface to allow customization of tracking behaviour. - * - * <p>This is only intended for use by {@code dalvik.system.CloseGuardSupport} class and so - * MUST NOT be used for any other purposes. - */ - public interface Tracker { - void open(Throwable allocationSite); - void close(Throwable allocationSite); - } - - /** - * Interface to allow customization of reporting behavior. - * @hide - */ - public interface Reporter { - void report(String message, Throwable allocationSite); - } - - /** - * Default Reporter which reports CloseGuard violations to the log. - */ - private static final class DefaultReporter implements Reporter { - private DefaultReporter() {} - - @Override public void report (String message, Throwable allocationSite) { - Log.w("CloseGuard", message, allocationSite); - } - } -} |