If you want to import files from the OpenJDK into libcore/
, you are reading
the right documentation.
---------A----------C------------ expected_upstream
\ \
-----------B----------D---------- master
The general idea is to get a change from OpenJDK into libcore in AOSP by
git merge
from an OpenJDK branch. However, each file in ojluni/
can come
from a different OpenJDK version. expected_upstream
is a staging branch
storing the OpenJDK version of each file. Thus, we can use git merge
when
we update an ojluni/
file from a new upstream version, and the command should
automatically merge the file if no merge conflict.
aosp
is setup in your local git repositorycd $ANDROID_BUILD_TOP/libcore
source ./tools/expected_upstream/install_tools.sh
For example, upgrade java.lang.String
to 11.0.13-ga version:
ojluni_modify_expectation modify java.lang.String jdk11u/jdk-11.0.13-ga
ojluni_merge_to_master # -b <bug id> if it fixes any bug
or if java.lang.String
is missing in the EXPECTED_UPSTREAM file:
ojluni_modify_expectation add jdk11u/jdk-11.0.13-ga java.lang.String
ojluni_merge_to_master # -b <bug id> if it fixes any bug
ojluni_merge_to_master
will git-merge
from the upstream branch.
If you see any merge conflicts, please resolve the merge conflicts as usual,
and then run git commit
to finalize the commit.
You can build and test the change. If you need to import more files,
ojluni_modify_expectation ...
# -a imports more files into the last merge commit instead of a new commit
ojluni_merge_to_master -a
For auto-completion, ojluni_modify_expectation
supports bash autocompletion.
$ ojluni_modify_expectation modify java.lang.Str # <tab>
java.lang.StrictMath java.lang.StringBuilder java.lang.StringUTF16
java.lang.String java.lang.StringCoding
java.lang.StringBuffer java.lang.StringIndexOutOfBoundsException
The process is similar to the above commands, but needs to run
ojluni_modify_expectation
with an add
subcommand.
For example, add a test for String.isEmpty()
method:
ojluni_modify_expectation add jdk8u/jdk8u121-b13 java.lang.String.IsEmpty
# -a imports more files into the last merge commit instead of a new commit
ojluni_merge_to_master -a
Note: java.lang.String.IsEmpty
is a test class in the upstream repository.
After you build and test, you are satisfied with your change, you can upload the change with the following commands
# Upload the original upstream files to the expected_upstream branch
$ git push aosp HEAD^2:refs/for/expected_upstream
# Upload the merge commit to the master branch
$ repo upload --cbr .
in the aosp/expected_upstream
branch.
ojluni/
aosp/master
EXPECTED_UPSTREAM
file
ojluni/
,
separatortools/expected_upstream/
aosp/expected_upstream
branchexpected_upstream
into aosp/master
branch.ojluni/
file that originally came from the OpenJDK
aosp/master
and aosp/expected_upstream
branches. Don't forget to remove the entry in the EXPECTED_UPSTREAM
too.aosp/master
from expected_upstream
aosp/master
, you should
probably revert the change aosp/expected_upstream
as well.git
doesn't allow you to merge the same commit
twice into the same branch. You have 2 options
expected_upsteam
too and start over again
when you reland your changeaosp/expected_upstream
branchIn general, if you want to change an ojluni/
file by a text editor / IDE
manually, you should make the change on aosp/master
.
luni/
folder, you can make the change
directly on aosp/master
ojluni/
file
aosp/master
. Please follow this
patch style guideline.ojluni/
file to a particular upstream
version. If you can't but still want to cherry-pick a upstream fix, you
should do so on the aosp/master
branch.ojluni/
aosp/master
.ojluni_refresh_files
] Submit your change in AOSP gerrit----11.0.13-ga---------------- openjdk/jdk11u
\
A
\
------------B-----C------------ expected_upstream
\
--------------------D---E------ master
Here are the order of events / votes required to submit your CL on gerrit as of Nov 2021.
Presubmit-Verified +2
on all 5 CLs
Bypass-Presubmit +1
on commit A
and B
if the presubmit fails.Code-review +2
on all 5 CLs from an Android Core Library team memberAPI-review +1
on commit E
from an Android API council memberAutosubmit +1
on commit B
, C
and E
A
individually without submitting B
together.
A
without
submitting B
.C
before submitting B
first manually, even though B
is the direct parent of C
. So just
submit B
yourself manually.ojluni_refresh_files
] Life of a typical changeCommit graph of a typical change
----11.0.13-ga---------------- openjdk/jdk11u
\
A
\
------------B-----C------------ expected_upstream
\
--------------------D---E------ master
Typically, you will need 5 CLs
A
imports the file and moves the file in the ojluni/
folderB
merges the file into the expected_upstream with other ojluni
files
A
and B
are created by the ojluni_refresh_files
scriptC
edits the entry in the EXPECTED_UPSTREAM
fileD
is a merge commit created by git merge
E
adds Android patches
Android.bp
,
api/current.txt
.A
, B
and C
?git blame
with the upstream
history.ojluni_refresh_files
] Known bugsrepo upload
may not succeed because gerrit returns error.
repo upload
again!
git
objects have been uploaded.repo upload
returns TimeOutException, but the CL has been uploaded.
Just find your CL in http://r.android.com/. See http://b/202848945git rev-parse HEAD # a sha is printed and you will need it later
git reset HEAD~1 # reset to a earlier commit
repo upload --cbr . # try to upload it again
git reset <the sha printed above>
ojluni_modify_expectation add
and ojluni_refresh_files
, a git commit -a
would include more files than just EXPECTED_UPSTREAM, because git
, e.g. git status
,
isn't aware of changes in the working tree / in the file system. This can lead to
an error when checking out the branch that is based on master.
git checkout --hard <initial commit before the add>
ojluni_modify_expectation add
and ojluni_refresh_files
git stash && git stash pop
git reset aosp/expected_upstream