
Bug: None Change-Id: If5f07b11df34bb0483da614c551630a2c51bf974 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6054210 Commit-Queue: Mohamed Heikal <mheikal@chromium.org> Auto-Submit: Mohamed Heikal <mheikal@chromium.org> Reviewed-by: Andrew Grieve <agrieve@chromium.org> Cr-Commit-Position: refs/heads/main@{#1389052}
3.1 KiB
How to Reference android_resources in Java (R.java)
Overview
This document has basic instructions on how to reference an android resource in java. It also attempts to explain what R.java is.
How to reference Android Resources in java
- Find the
resources_package
in yourandroid_library
target in BUILD.gn
android_library("java") {
sources = [ "java/org/chromium/browser_ui/Widget.java" ]
resources_package = "org.chromium.browser_ui"
deps = [
"//base:java",
"//base:resources",
"//third_party/android_deps:com_google_material_material_java",
"//third_party/androidx:androidx_core_core_java",
]
}
-
Add a dep on the
android_resources
target with your resource.- or
android_aar_prebuilt
orandroid_java_prebuilt
for prebuilt targets such as those under//third_party/android_deps
- or
-
In your java file,
import <resources_package>.R;
-
You can now reference
R.<type>.<name>
in your java.
What not to do?
- You should not reference multiple
R
classes.- All R classes will be the same in the final APK, you should never need to import multiple different R classes.
- You should not import an
R
class from a different package than the one listed as theresources_package
in youandroid_library
target inBUILD.gn
- You should not rely on transitive deps for resources you use directly.
Android Resources and R.java
Android resources are global for the whole app. While you import the R class
from a package (eg: org.chromium.base.R
or org.chromium.browser_ui.R
) so you
might assume that there are resources under the org.chromium.base
package that
are different from org.chromium.browser_ui
, the actual resources from
android's point of view are not divided into packages but form a global pool
with unique consecutive ids.
The R class is a generated class that contains a mapping from the name of the
resources R.string.hello
to its numeric id 0x7f015d14
. The build system
generates this R class for you based on the resources in your dependencies.
In the final apk, all the R
classes from all the packages will all inherit
from one global R class that has the list of all resources with the final ids as
generated by aapt2
(See Life of a Resource for more
details on how resources are processed by our build system).
Resources and per library java compilation
Chrome does not compile all the java in an apk at once. But instead it builds
each android_library
separately and then brings them all together in the end.
This means that when compiling a single android_library
, the build system does
not know the full list of resources that will end up in the apk. Thus, it can't
actually generate the final R.class
with real resource ids but instead
creates a temporary one that only exists when compiling these library
subtargets.
resources_package
in your android_library target tells the build system which
package to generate the R class in. During compile, this temporary R.class
will contain only the resources you depend on in your build target.