Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Beginnings of native Android build - #110471

Merged
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk
Jan 24, 2025
Merged

Beginnings of native Android build#110471
steveisok merged 57 commits into
dotnet:mainfrom
grendello:dev/grendel/android-build-with-ndk

Conversation

@grendello

@grendellogrendello commented Dec 6, 2024

Copy link
Copy Markdown
Contributor

Tracking issue: #111491

Builds that work (linux and OSX):

  • arm64
  • x64

Builds that don't (blocked by #111665)

  • arm
  • x86

Build commands that can be used:

CoreCLR itself

./build.sh -Subset clr.runtime+clr.alljits+clr.corelib+clr.nativecorelib+clr.tools+clr.packages+libs -c Debug|Release -os android -arch <arm64|arm|x64|x86>

No subset (CoreCLR+Mono)

./build.sh -arch <arm64|arm|x64|x86> -os android -c Debug|Release

@ghostghost added the area-Infrastructure-coreclr Only use for closed issues label Dec 6, 2024
@dotnet-policy-servicedotnet-policy-serviceBot added the community-contribution Indicates that the PR has been added by a community member label Dec 6, 2024
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-android': @vitek-karas, @simonrozsival, @steveisok, @akoeplinger
See info in area-owners.md if you want to be subscribed.

@grendello
grendelloforce-pushed the dev/grendel/android-build-with-ndk branch from c25fbd9 to 3d9da10CompareDecember 6, 2024 20:43
…stem.Security.Cryptography.Native.Android. It will incorrectly try to install in the coreclr build
Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/coreclr/runtime.proj
Comment threadsrc/coreclr/tools/Common/TypeSystem/Common/TargetDetails.cs Outdated
Comment threadeng/native/naming.props Outdated
@steveisok

steveisok commented Jan 23, 2025

Copy link
Copy Markdown
Member

ok, I think this is ready for another review.

@kotlarmilos can you do another official build pass to make sure we don't break / regress?

Comment threadeng/Subsets.props Outdated
Comment on lines +98 to +100
<PropertyGroup>
<CrossBuild Condition="'$(CrossBuild)' == '' and '$(TargetsAndroid)' == 'true'">true</CrossBuild>
</PropertyGroup>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the expected way to invoke build.sh for android? Do we need to pass -cross? If we do need to pass -cross this property should already be set by that.

And if we don't pass -cross: does the code path added in eng/build.sh in this PR kick in? (It seems to be conditioned on -cross being passed to build.sh.)

(So far we have not been passing -cross when building for Android, there is a discussion about that at #56622).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me, locally, this change breaks the build (and so does passing -cross):

$ ./build.sh clr+libs --os android --arch arm64 -c release --restore --build
...
Commencing CoreCLR Repo build
Error: rootfsDir has been passed, but the location is not valid.

@steveisok are you absolutely sure it's necessary to enable cross build? Using the NDK cmake toolchain definition automatically makes the build a cross one, using the sysroot from the NDK and the appropriate target API+platform libraries and headers.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.
But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though.

This is what #56622 discusses - the existing Android builds (Mono Android/Bionic, native AOT Bionic) do not pass -cross. The build infrastructure doesn't think it's a cross build (it's not considered as a cross build in libs build or in runtime build). It gets away with it because including the Android toolchain definition will make things happen.

The issue discusses switching Android build to the -cross plan but that didn't happen. I don't know if we even have Android build machines that would have the correct ROOTFS_DIR set up. We never built Android as -cross except for the community CoreCLR Android port attempt long time ago (none of the things that actually shipped and created official build specified -cross).

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's necessary to enable cross build

In coreclr, we consider crossbuild to be anything that's not targeting the current architecture / OS for unix based systems. So this should be cross build too. I think there are subtle parts of the build scripts that I think could misbehave if it is not done that way. I am not 100% sure though. But, I am not a fan of feeding in the -cross option automatically. That would make the build for Android experience different from other targets where we always specify the -cross on the command line explicitly.

@grendello looking at your command line, have you set the ROOTFS_DIR env variable too? That's what's necessary for cross builds in general.

No, I have not - to what should I point it? The NDK's toolchains/llvm/prebuilt/${OS}/sysroot directory?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we've historically never built Android/iOS/Browser with -cross since they all bring a toolchain with custom cmake and rootfs handling, we've only used -cross for "linux" builds. I'm not sure how hard it will be to untangle that.

That's what I mean by not being convinced we need to explicitly set ROOTFS_DIR in the coreclr build. Only passing the toolchain as a cmake argument will do.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

I'm asking because -cross does a lot more than that and passing both -cross and setting up Android cmake toolchain file will cause many things to be set twice. It feels like it will cause maintenance pain.

We could make it so proper crossgen gets picked for Android even without -cross and clean that up when/if the build gets switched to the real -cross plan.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is passing -cross needed only to select a different crossgen binary or do we need it for something else?

As far as I can tell, we only need it for crossgen. On osx (and presumably windows), the crossgen/ilcompiler builds will fail because it'll try to link against libjitinterface_arm64.so instead of libjitinterface_arm64.dylib.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I validated we don't need -cross when building from linux hosts. I pushed a commit to only enable that when on osx for now so that we can move the PR forward.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like _BuildAnyCrossArch is the property we need with a HostOS != TargetOS condition addition.

Comment threadeng/native/build-commons.sh Outdated
@ivanpovazan

ivanpovazan commented Jan 23, 2025

Copy link
Copy Markdown
Member

Please add in the description of the PR which host->target builds have been successfully verified, and what build command was used

Comment threadeng/native/build-commons.sh Outdated
Comment threadsrc/native/eventpipe/CMakeLists.txt

@ivanpovazanivanpovazan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

Thanks everyone for your contributions!

@steveisok

steveisok commented Jan 24, 2025

Copy link
Copy Markdown
Member

We should exclude official builds of coreCLR on Android for arm and x86 as they are still failing (referenced in the description of the PR and in the #111491) and I think this can be merged.

They are already excluded by this:

<!-- Android 32-bit builds blocked by https://github.com/dotnet/runtime/issues/111665 -->
<_CoreCLRSupportedOS Condition="'$(TargetsAndroid)' == 'true' and '$(TargetArchitecture)' != 'arm' and '$(TargetArchitecture)' != 'x86'">true</_CoreCLRSupportedOS>

@steveisok
steveisok merged commit ee46066 into dotnet:mainJan 24, 2025
@grendello
grendello deleted the dev/grendel/android-build-with-ndk branch January 27, 2025 07:47
grendello added a commit to grendello/runtime that referenced this pull request Jan 27, 2025
* main: (22 commits)
Clean up Stopwatch a bit (dotnet#111834)
JIT: Fix embedded broadcast simd size (dotnet#111638)
Revert potential UB due to aliasing + more WB removals (dotnet#111733)
re-enable acceleration of Vector512<long>.op_Multiply (dotnet#111832)
Handle OSSL 3.4 change to SAN:othername formatting
JIT: Fix stack allocated arrays for NativeAOT (dotnet#111827)
JIT: enhance RBO inference for similar compares to constants (dotnet#111766)
JIT: Don't run optSetBlockWeights when we have PGO data (dotnet#111764)
[Android] Make sure RuntimeFlavor=CoreCLR when clr subset is specified (dotnet#111821)
Change empty subject test certificate to include a critical SAN.
Fix reversed code offsets in GcInfo (dotnet#111792)
Swap some libraries areas between leads (dotnet#111816)
Add left-handed spherical and cylindrical billboards (dotnet#109605)
JIT: revise `optRelopImpliesRelop` to always set `reverseSense` (dotnet#111803)
Fix Zip64ExtraField handling (dotnet#111802)
Add build support for Android+CoreCLR (dotnet#110471)
arm64: Add bic(s) compact encoding (dotnet#111452)
JIT: Ensure `BBF_PROF_WEIGHT` flag is set when we have PGO data (dotnet#111780)
Add support for AVX10.2, Add AVX10.2 API surface and template tests (dotnet#111209)
JIT: Preliminary for enabling inlining late devirted calls (dotnet#111782)
...
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Feb 26, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issuesos-android

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

17 participants

@grendello@ivanpovazan@kotlarmilos@steveisok@filipnavara@janvorli@kunalspathak@JulieLeeMSFT@EgorBo@akoeplinger@jkoritzinsky@GerardSmit@am11@jkotas@vitek-karas@MichalStrehovsky@AaronRobinsonMSFT