diff --git a/.craft.yml b/.craft.yml new file mode 100644 index 00000000..f2c1e350 --- /dev/null +++ b/.craft.yml @@ -0,0 +1,14 @@ +minVersion: 0.24.0 +changelogPolicy: auto +preReleaseCommand: pwsh scripts/bump-version.ps1 +targets: + # TODO + # - name: symbol-collector + # includeNames: /libsentry(-android)?\.so/ + # batchType: android + # bundleIdPrefix: sentry-unity-android-ndk- + - name: github + includeNames: /^sentry-unreal-.*.zip$/i + - name: registry + sdks: + github:sentry-unreal: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc8f3001..96ec6b86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,24 +3,69 @@ name: package-plugin-workflow on: [push] jobs: - package-plugin-job: + build: + name: Build runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 - strategy: - matrix: - unreal: ['4.27', '5.0.2'] + - name: Prepare Sentry packages for release + shell: pwsh + run: ./scripts/packaging/pack.ps1 + + - name: Upload release artifacts + uses: actions/upload-artifact@v2 + with: + # Artifact name is the commit sha. Which is what craft uses to find the relevant artifact. + name: ${{ github.sha }} + if-no-files-found: error + path: | + sentry-unreal-*.zip + # Adding the native libraries so the symbol collector craft target can find/upload them + # TODO modules/sentry-java/sentry-android-ndk/build/intermediates/merged_native_libs/release/out/lib/* + package-validation: + needs: [build] + name: Validate package against snapshot + runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 + + - name: Download packages + uses: actions/download-artifact@v2 + with: + name: ${{ github.sha }} + # If this step fails, you can accept the new file content by + # running the following script locally with 'accept' as an argument + # and committing the new snapshot file to your branch. i.e: + # pwsh ./scripts/test-contents.ps1 accept + - name: Verify package content against snapshot + shell: pwsh + run: ./scripts/packaging/test-contents.ps1 + + # Smoke-test that the UnrealEnginge can package the plugin. + test-ue-packaging: + name: Test UE ${{ matrix.unreal }} packaging + runs-on: ubuntu-latest + needs: [build] + + strategy: + fail-fast: false + matrix: + # Note: these versions must match scripts/packaging/engine-versions.txt + unreal: ['4.27', '5.0'] # 4.26 is not available + + steps: - name: Free disk space if: ${{ steps.exists.outputs.value == 0 }} run: | # time df -h sudo time swapoff -a sudo time rm -f /swapfile - sudo time rm -rf /usr/local/lib/android + # sudo time rm -rf /usr/local/lib/android sudo time rm -rf /usr/share/dotnet sudo time rm -rf /usr/share/swift sudo time rm -rf /usr/local/.ghcup @@ -34,24 +79,34 @@ jobs: # time du --max-depth=3 --threshold=100M -h /usr /opt /var 2>/dev/null | sort -hr df -h - - name: Run Docker container + - name: Start Docker container run: | echo ${{ secrets.DOCKER_TOKEN }} | docker login ghcr.io -u ${{ secrets.DOCKER_USERNAME }} --password-stdin docker run -td --name unreal --user root \ - -v ${{ github.workspace }}/plugin-dev:/sentry-unreal \ + -v ${{ github.workspace }}:/sentry-unreal \ --workdir /sentry-unreal \ ghcr.io/epicgames/unreal-engine:dev-slim-${{ matrix.unreal }} - - name: Installing Linux Dependencies + - name: Download packages + uses: actions/download-artifact@v2 + with: + name: ${{ github.sha }} + + - name: Unzip package from the build job + run: | + unzip sentry-unreal-*-engine${{ matrix.unreal }}.zip -d . + rm -f sentry-unreal-*.zip + + - name: Install Linux Dependencies run: | docker exec unreal sudo apt-get update docker exec unreal pip3 install --upgrade pip - - name: Installing UE CLI + - name: Install UE CLI run: docker exec unreal pip3 install ue4cli - - name: Configuring UE CLI + - name: Configure UE CLI run: docker exec unreal ue4 setroot /home/ue4/UnrealEngine diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..434c8d58 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,30 @@ +name: Release + +on: + workflow_dispatch: + inputs: + version: + description: Version to release + required: true + force: + description: Force a release even when there are release-blockers (optional) + required: false + +jobs: + job_release: + runs-on: ubuntu-latest + name: 'Release a new version: ${{ github.event.inputs.version }}' + steps: + - name: Check out current commit (${{ github.sha }}) + uses: actions/checkout@v2 + with: + token: ${{ secrets.GH_RELEASE_PAT }} + fetch-depth: 0 + + - name: Prepare release ${{ github.event.inputs.version }} + uses: getsentry/action-prepare-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GH_RELEASE_PAT }} + with: + version: ${{ github.event.inputs.version }} + force: ${{ github.event.inputs.force }} diff --git a/.gitignore b/.gitignore index 83a965c1..7090c518 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,7 @@ Intermediate/* # Other .DS_Store + +# Ignore package release +package-release/ +sentry-unreal-*.zip diff --git a/scripts/bump-version.ps1 b/scripts/bump-version.ps1 new file mode 100755 index 00000000..e5f00550 --- /dev/null +++ b/scripts/bump-version.ps1 @@ -0,0 +1,19 @@ +Param( + [Parameter(Mandatory = $true)][String]$PrevVersion, + [Parameter(Mandatory = $true)][String]$NewVersion +) +Set-StrictMode -Version latest + +$pluginFile = "$PSScriptRoot/../plugin-dev/Sentry.uplugin" + +$content = Get-Content $pluginFile + +$content -replace '"VersionName": ".*"', ('"VersionName": "' + $NewVersion + '"') | Out-File $pluginFile +if ("$content" -eq "$(Get-Content $pluginFile)") +{ + $versionInFile = [regex]::Match("$content", '"VersionName": "([^"]+)"').Groups[1].Value + if ("$versionInFile" -ne "$NewVersion") + { + Throw "Failed to update version in $pluginFile - the content didn't change. The version found in the file is '$versionInFile'." + } +} diff --git a/scripts/packaging/android-libs.snapshot b/scripts/packaging/android-libs.snapshot new file mode 100644 index 00000000..fbf4e4d7 --- /dev/null +++ b/scripts/packaging/android-libs.snapshot @@ -0,0 +1,12 @@ +/arm64-v8a +/armeabi-v7a +/x86 +/x86_64 +arm64-v8a/libsentry-android.so +arm64-v8a/libsentry.so +armeabi-v7a/libsentry-android.so +armeabi-v7a/libsentry.so +x86/libsentry-android.so +x86/libsentry.so +x86_64/libsentry-android.so +x86_64/libsentry.so \ No newline at end of file diff --git a/scripts/packaging/engine-versions.txt b/scripts/packaging/engine-versions.txt new file mode 100644 index 00000000..f613c9d8 --- /dev/null +++ b/scripts/packaging/engine-versions.txt @@ -0,0 +1,3 @@ +5.0 +4.27 +4.26 \ No newline at end of file diff --git a/scripts/packaging/pack.ps1 b/scripts/packaging/pack.ps1 new file mode 100644 index 00000000..935293e6 --- /dev/null +++ b/scripts/packaging/pack.ps1 @@ -0,0 +1,22 @@ +Remove-Item "package-release" -Recurse -ErrorAction SilentlyContinue +New-Item "package-release" -ItemType Directory + +$exclude = @('Sentry.uplugin') + +Copy-Item "plugin-dev/*" "package-release/" -Exclude $exclude -Recurse +Copy-Item "CHANGELOG.md" -Destination "package-release/CHANGELOG.md" +Copy-Item "LICENSE" -Destination "package-release/LICENSE" + +$pluginSpec = Get-Content "plugin-dev/Sentry.uplugin" +$version = [regex]::Match("$pluginSpec", '"VersionName": "([^"]+)"').Groups[1].Value +$engineVersions = Get-Content $PSScriptRoot/engine-versions.txt +foreach ($engineVersion in $engineVersions) +{ + $packageName = "sentry-unreal-$version-engine$engineVersion.zip" + Write-Host "Creating a release package for Unreal $engineVersion as $packageName" + + $newPluginSpec = @($pluginSpec[0..0]) + @(' "EngineVersion" : "' + $engineVersion + '",') + @($pluginSpec[1..($pluginSpec.count)]) + $newPluginSpec | Out-File 'package-release/Sentry.uplugin' + + Compress-Archive "package-release/*" -DestinationPath $packageName -Force +} \ No newline at end of file diff --git a/scripts/packaging/package.snapshot b/scripts/packaging/package.snapshot new file mode 100644 index 00000000..7d62b753 --- /dev/null +++ b/scripts/packaging/package.snapshot @@ -0,0 +1,185 @@ +CHANGELOG.md +Config/FilterPlugin.ini +Content/Maps/SentryDemo.umap +Content/UI/W_SentryDemo.uasset +LICENSE +Resources/Icon128.png +Resources/sentry.properties +Sentry.uplugin +Source/Sentry/Private/Android/Callbacks/SentryScopeCallbackAndroid.cpp +Source/Sentry/Private/Android/Callbacks/SentryScopeCallbackAndroid.h +Source/Sentry/Private/Android/Infrastructure/SentryConvertorsAndroid.cpp +Source/Sentry/Private/Android/Infrastructure/SentryConvertorsAndroid.h +Source/Sentry/Private/Android/Infrastructure/SentryMethodCallAndroid.cpp +Source/Sentry/Private/Android/Infrastructure/SentryMethodCallAndroid.h +Source/Sentry/Private/Android/Java/SentryBridgeJava.java +Source/Sentry/Private/Android/Jni/SentryJniAndroid.cpp +Source/Sentry/Private/Android/SentryAttachmentAndroid.cpp +Source/Sentry/Private/Android/SentryAttachmentAndroid.h +Source/Sentry/Private/Android/SentryBreadcrumbAndroid.cpp +Source/Sentry/Private/Android/SentryBreadcrumbAndroid.h +Source/Sentry/Private/Android/SentryEventAndroid.cpp +Source/Sentry/Private/Android/SentryEventAndroid.h +Source/Sentry/Private/Android/SentryIdAndroid.cpp +Source/Sentry/Private/Android/SentryIdAndroid.h +Source/Sentry/Private/Android/SentryScopeAndroid.cpp +Source/Sentry/Private/Android/SentryScopeAndroid.h +Source/Sentry/Private/Android/SentrySubsystemAndroid.cpp +Source/Sentry/Private/Android/SentrySubsystemAndroid.h +Source/Sentry/Private/Android/SentryUserAndroid.cpp +Source/Sentry/Private/Android/SentryUserAndroid.h +Source/Sentry/Private/Android/SentryUserFeedbackAndroid.cpp +Source/Sentry/Private/Android/SentryUserFeedbackAndroid.h +Source/Sentry/Private/Desktop/Convenience/SentryInclude.h +Source/Sentry/Private/Desktop/CrashReporter/SentryCrashReporter.cpp +Source/Sentry/Private/Desktop/CrashReporter/SentryCrashReporter.h +Source/Sentry/Private/Desktop/Infrastructure/SentryConvertorsDesktop.cpp +Source/Sentry/Private/Desktop/Infrastructure/SentryConvertorsDesktop.h +Source/Sentry/Private/Desktop/SentryBreadcrumbDesktop.cpp +Source/Sentry/Private/Desktop/SentryBreadcrumbDesktop.h +Source/Sentry/Private/Desktop/SentryEventDesktop.cpp +Source/Sentry/Private/Desktop/SentryEventDesktop.h +Source/Sentry/Private/Desktop/SentryIdDesktop.cpp +Source/Sentry/Private/Desktop/SentryIdDesktop.h +Source/Sentry/Private/Desktop/SentrySubsystemDesktop.cpp +Source/Sentry/Private/Desktop/SentrySubsystemDesktop.h +Source/Sentry/Private/Desktop/SentryUserDesktop.cpp +Source/Sentry/Private/Desktop/SentryUserDesktop.h +Source/Sentry/Private/Interface/SentryAttachmentInterface.h +Source/Sentry/Private/Interface/SentryBreadcrumbInterface.h +Source/Sentry/Private/Interface/SentryEventInterface.h +Source/Sentry/Private/Interface/SentryIdInterface.h +Source/Sentry/Private/Interface/SentryScopeInterface.h +Source/Sentry/Private/Interface/SentrySubsystemInterface.h +Source/Sentry/Private/Interface/SentryUserFeedbackInterface.h +Source/Sentry/Private/Interface/SentryUserInterface.h +Source/Sentry/Private/IOS/Infrastructure/SentryConvertorsIOS.cpp +Source/Sentry/Private/IOS/Infrastructure/SentryConvertorsIOS.h +Source/Sentry/Private/IOS/SentryAttachmentIOS.cpp +Source/Sentry/Private/IOS/SentryAttachmentIOS.h +Source/Sentry/Private/IOS/SentryBreadcrumbIOS.cpp +Source/Sentry/Private/IOS/SentryBreadcrumbIOS.h +Source/Sentry/Private/IOS/SentryEventIOS.cpp +Source/Sentry/Private/IOS/SentryEventIOS.h +Source/Sentry/Private/IOS/SentryIdIOS.cpp +Source/Sentry/Private/IOS/SentryIdIOS.h +Source/Sentry/Private/IOS/SentryScopeIOS.cpp +Source/Sentry/Private/IOS/SentryScopeIOS.h +Source/Sentry/Private/IOS/SentrySubsystemIOS.cpp +Source/Sentry/Private/IOS/SentrySubsystemIOS.h +Source/Sentry/Private/IOS/SentryUserFeedbackIOS.cpp +Source/Sentry/Private/IOS/SentryUserFeedbackIOS.h +Source/Sentry/Private/IOS/SentryUserIOS.cpp +Source/Sentry/Private/IOS/SentryUserIOS.h +Source/Sentry/Private/SentryAttachment.cpp +Source/Sentry/Private/SentryBreadcrumb.cpp +Source/Sentry/Private/SentryDefines.h +Source/Sentry/Private/SentryEvent.cpp +Source/Sentry/Private/SentryId.cpp +Source/Sentry/Private/SentryLibrary.cpp +Source/Sentry/Private/SentryModule.cpp +Source/Sentry/Private/SentryScope.cpp +Source/Sentry/Private/SentrySettings.cpp +Source/Sentry/Private/SentrySubsystem.cpp +Source/Sentry/Private/SentryUser.cpp +Source/Sentry/Private/SentryUserFeedback.cpp +Source/Sentry/Private/Tests/SentryBreadcrumb.spec.cpp +Source/Sentry/Private/Tests/SentryEvent.spec.cpp +Source/Sentry/Private/Tests/SentrySubsystem.spec.cpp +Source/Sentry/Private/Tests/SentryUser.spec.cpp +Source/Sentry/Public/SentryAttachment.h +Source/Sentry/Public/SentryBreadcrumb.h +Source/Sentry/Public/SentryDataTypes.h +Source/Sentry/Public/SentryEvent.h +Source/Sentry/Public/SentryId.h +Source/Sentry/Public/SentryLibrary.h +Source/Sentry/Public/SentryModule.h +Source/Sentry/Public/SentryScope.h +Source/Sentry/Public/SentrySettings.h +Source/Sentry/Public/SentrySubsystem.h +Source/Sentry/Public/SentryUser.h +Source/Sentry/Public/SentryUserFeedback.h +Source/Sentry/Sentry_Android_UPL.xml +Source/Sentry/Sentry_IOS_UPL.xml +Source/Sentry/Sentry.Build.cs +Source/ThirdParty/ +Source/ThirdParty/Android/sentry-android-core-release.aar +Source/ThirdParty/Android/sentry-android-ndk-release.aar +Source/ThirdParty/Android/sentry.jar +Source/ThirdParty/IOS/Sentry.embeddedframework.zip +Source/ThirdParty/IOS/Sentry.framework/Headers/PrivateSentrySDKOnly.h +Source/ThirdParty/IOS/Sentry.framework/Headers/Sentry.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryAppStartMeasurement.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryAttachment.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryBreadcrumb.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryClient.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryCrashExceptionApplication.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryDebugImageProvider.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryDebugMeta.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryDefines.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryDsn.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryEnvelope.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryEnvelopeItemType.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryError.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryEvent.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryException.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryFrame.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryHub.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryId.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryIntegrationProtocol.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryMechanism.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryMechanismMeta.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryMessage.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryNSError.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryOptions.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryProfilingConditionals.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySampleDecision.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySamplingContext.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryScope.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryScreenFrames.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySDK.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySdkInfo.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySerializable.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySession.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySpanContext.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySpanId.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySpanProtocol.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentrySpanStatus.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryStacktrace.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryThread.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryTraceHeader.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryTransactionContext.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryUser.h +Source/ThirdParty/IOS/Sentry.framework/Headers/SentryUserFeedback.h +Source/ThirdParty/IOS/Sentry.framework/Info.plist +Source/ThirdParty/IOS/Sentry.framework/Modules/module.modulemap +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/NSData+SentryCompression.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/NSDate+SentryExtras.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/NSDictionary+SentrySanitize.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryAsynchronousOperation.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryAutoSessionTrackingIntegration.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryCrashInstallationReporter.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryCrashReportConverter.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryCrashReportSink.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryLog.h +Source/ThirdParty/IOS/Sentry.framework/PrivateHeaders/SentryRequestOperation.h +Source/ThirdParty/IOS/Sentry.framework/Sentry +Source/ThirdParty/Linux/ +Source/ThirdParty/Linux/bin/crashpad_handler +Source/ThirdParty/Linux/bin/libsentry.dbg.so +Source/ThirdParty/Linux/bin/libsentry.so +Source/ThirdParty/Linux/include/sentry.h +Source/ThirdParty/Mac/ +Source/ThirdParty/Mac/bin/crashpad_handler +Source/ThirdParty/Mac/bin/libsentry.dylib +Source/ThirdParty/Mac/bin/libsentry.dylib.dSYM/ +Source/ThirdParty/Mac/bin/libsentry.dylib.dSYM/Contents/Info.plist +Source/ThirdParty/Mac/bin/libsentry.dylib.dSYM/Contents/Resources/ +Source/ThirdParty/Mac/bin/libsentry.dylib.dSYM/Contents/Resources/DWARF/libsentry.dylib +Source/ThirdParty/Mac/include/sentry.h +Source/ThirdParty/Win64/ +Source/ThirdParty/Win64/bin/crashpad_handler.exe +Source/ThirdParty/Win64/bin/sentry.dll +Source/ThirdParty/Win64/bin/sentry.pdb +Source/ThirdParty/Win64/include/sentry.h +Source/ThirdParty/Win64/lib/sentry.lib diff --git a/scripts/packaging/test-contents.ps1 b/scripts/packaging/test-contents.ps1 new file mode 100755 index 00000000..088c0fd4 --- /dev/null +++ b/scripts/packaging/test-contents.ps1 @@ -0,0 +1,71 @@ +# Verifies the contents of the UPM package against a snapshot file +# 'dotnet build' and 'pack.ps1' must have already been run + +# To accept a new snapshot file, run 'pwsh ./test.ps1 accept' + +$ErrorActionPreference = "Stop" + +$projectRoot = "$PSScriptRoot/../.." +$snapshotFile = "$PSScriptRoot/package.snapshot" + +if (-not(Test-Path -Path $snapshotFile)) +{ + Write-Host "Snapshot file '$snapshotFile' not found. +Can't compare package contents against baseline." + exit 2 +} + +$packages = Get-ChildItem "$projectRoot/sentry-unreal-*.zip" +$expectedPackagesCount = (Get-Content "$PSScriptRoot/engine-versions.txt").Length +if ($packages.Length -ne $expectedPackagesCount) +{ + throw "Invalid number of packages - expected $expectedPackagesCount, got $packages" +} + +foreach ($packageFile in $packages) +{ + Write-Host "Testing $packageFile contents" + $zip = [IO.Compression.ZipFile]::OpenRead($packageFile) + try + { + $snapshotContent = $zip.Entries.FullName.Replace("\", "/") | Sort-Object + if ($args.Count -gt 0 -and $args[0] -eq "accept") + { + # Override the snapshot file with the current package contents + $snapshotContent | Out-File $snapshotFile + } + $result = Compare-Object $snapshotContent (Get-Content $snapshotFile) + if ($result.count -eq 0) + { + Write-Host " PASS - package content matches the snapshot." + } + else + { + Write-Host " FAIL - package content does not match the snapshot." + $result | Format-Table -AutoSize + exit 3 + } + } + finally + { + $zip.Dispose() + } +} + +# TODO +# $androidLibsDir = "$projectRoot/modules/sentry-java/sentry-android-ndk/build/intermediates/merged_native_libs/release/out/lib/" +# if (-not(Test-Path -Path $androidLibsDir)) { +# Write-Host "Android native libs not found in: '$androidLibsDir'" +# exit 1 +# } + +# $androidLibs = Get-ChildItem -Recurse $androidLibsDir | ForEach-Object {$_.Directory.Name + "/" + $_.Name} +# $result = Compare-Object $androidLibs (Get-Content "$PSScriptRoot/android-libs.snapshot") +# if ($result.count -eq 0) { +# Write-Host "Android native libs match snapshot." +# } +# else { +# Write-Host "Android native libs do not match snapshot." +# $result | Format-Table -AutoSize +# exit 3 +# } \ No newline at end of file