Merge "Discourage methods that use resource reflection"
diff --git a/core/api/current.txt b/core/api/current.txt
index 0097cb0..197715a 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -13462,7 +13462,7 @@
method public float getFloat(@DimenRes int);
method @NonNull public android.graphics.Typeface getFont(@FontRes int) throws android.content.res.Resources.NotFoundException;
method public float getFraction(@FractionRes int, int, int);
- method public int getIdentifier(String, String, String);
+ method @Discouraged(message="Use of this function is discouraged because resource reflection makes it harder to perform build optimizations and compile-time verification of code. It is much more efficient to retrieve resources by identifier (e.g. `R.foo.bar`) than by name (e.g. `getIdentifier(\"bar\", \"foo\", null)`).") public int getIdentifier(String, String, String);
method @NonNull public int[] getIntArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
method public int getInteger(@IntegerRes int) throws android.content.res.Resources.NotFoundException;
method @NonNull public android.content.res.XmlResourceParser getLayout(@LayoutRes int) throws android.content.res.Resources.NotFoundException;
@@ -13482,7 +13482,7 @@
method public CharSequence getText(@StringRes int, CharSequence);
method @NonNull public CharSequence[] getTextArray(@ArrayRes int) throws android.content.res.Resources.NotFoundException;
method public void getValue(@AnyRes int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
- method public void getValue(String, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
+ method @Discouraged(message="Use of this function is discouraged because it makes internal calls to `getIdentifier()`, which uses resource reflection. Reflection makes it harder to perform build optimizations and compile-time verification of code. It is much more efficient to retrieve resource values by identifier (e.g. `getValue(R.foo.bar, outValue, true)`) than by name (e.g. `getValue(\"foo\", outvalue, true)`).") public void getValue(String, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
method public void getValueForDensity(@AnyRes int, int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
method @NonNull public android.content.res.XmlResourceParser getXml(@XmlRes int) throws android.content.res.Resources.NotFoundException;
method public final android.content.res.Resources.Theme newTheme();
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index 12e41e2..a6f2e40 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -27,6 +27,7 @@
import android.annotation.ColorInt;
import android.annotation.ColorRes;
import android.annotation.DimenRes;
+import android.annotation.Discouraged;
import android.annotation.DrawableRes;
import android.annotation.FontRes;
import android.annotation.FractionRes;
@@ -1466,6 +1467,12 @@
* @throws NotFoundException Throws NotFoundException if the given ID does not exist.
*
*/
+ @Discouraged(message = "Use of this function is discouraged because it makes internal calls to "
+ + "`getIdentifier()`, which uses resource reflection. Reflection makes it "
+ + "harder to perform build optimizations and compile-time verification of "
+ + "code. It is much more efficient to retrieve resource values by "
+ + "identifier (e.g. `getValue(R.foo.bar, outValue, true)`) than by name "
+ + "(e.g. `getValue(\"foo\", outvalue, true)`).")
public void getValue(String name, TypedValue outValue, boolean resolveRefs)
throws NotFoundException {
mResourcesImpl.getValue(name, outValue, resolveRefs);
@@ -2198,6 +2205,11 @@
* @return int The associated resource identifier. Returns 0 if no such
* resource was found. (0 is not a valid resource ID.)
*/
+ @Discouraged(message = "Use of this function is discouraged because resource reflection makes "
+ + "it harder to perform build optimizations and compile-time "
+ + "verification of code. It is much more efficient to retrieve "
+ + "resources by identifier (e.g. `R.foo.bar`) than by name (e.g. "
+ + "`getIdentifier(\"bar\", \"foo\", null)`).")
public int getIdentifier(String name, String defType, String defPackage) {
return mResourcesImpl.getIdentifier(name, defType, defPackage);
}