From ec4935044ede59342b289f4cbfbb08b5934b6e08 Mon Sep 17 00:00:00 2001 From: Scott Harrison Date: Sun, 21 Apr 2024 16:23:38 -0500 Subject: [PATCH 01/21] iOS/tvOS: Support for Xcode 15.3 (#692) --- .github/workflows/build.yml | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2d3604898..46266aa15 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -66,6 +66,48 @@ jobs: name: Native path: ./output + Xcode-template-matrix-14: + strategy: + matrix: + runner: + - macos-13 + xcode: + - Xcode_15.3 + target: + - template + - template-angle + platform: + - iphone + - tvos + needs: source-code + runs-on: ${{ matrix.runner }} + env: + DEVELOPER_DIR: /Applications/${{ matrix.xcode }}.app/Contents/Developer + TEMPLATE_TARGET: ${{ matrix.target }} + TEMPLATE_PLATFORM: ${{ matrix.platform }} + steps: + - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" + - name: Get processed code + uses: actions/download-artifact@v4 + with: + name: SourceCode + path: SourceCode + - name: Unpack source code + run: tar -xzf SourceCode/corona.tgz + - run: ./tools/GHAction/daily_env.sh + - name: Build templates + working-directory: ./platform/${{ matrix.platform }} + run: ./gh_build_templates.sh + env: + CERT_PASSWORD: ${{ secrets.CertPassword }} + - name: Build templates JSON spec + run: ./tools/GHAction/generate_xcode_jsons.py + - name: Upload templates + uses: actions/upload-artifact@v4 + with: + name: Templates-${{ matrix.platform }}-${{ matrix.xcode }}-${{ matrix.target }} + path: ./output + Xcode-template-matrix-13: strategy: @@ -207,6 +249,7 @@ jobs: - Xcode-template-matrix - Xcode-template-matrix-12 - Xcode-template-matrix-13 + - Xcode-template-matrix-14 runs-on: ubuntu-20.04 steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" From 85a4baad632562c23dfca1f8a22673e69a812a26 Mon Sep 17 00:00:00 2001 From: Scott Harrison Date: Wed, 5 Jun 2024 20:49:17 -0500 Subject: [PATCH 02/21] Apple: Privacy Settings Support (#690) --- platform/resources/CoronaPListSupport.lua | 9 +++++ platform/resources/OSXPackageApp.lua | 44 ++++++++++++++++++++- platform/resources/iPhonePackageApp.lua | 47 ++++++++++++++++++++++- platform/resources/tvosPackageApp.lua | 42 ++++++++++++++++++++ 4 files changed, 139 insertions(+), 3 deletions(-) diff --git a/platform/resources/CoronaPListSupport.lua b/platform/resources/CoronaPListSupport.lua index 91aa08af4..741492b5f 100644 --- a/platform/resources/CoronaPListSupport.lua +++ b/platform/resources/CoronaPListSupport.lua @@ -544,6 +544,15 @@ function CoronaPListSupport.captureCommandOutput( cmd, debugLevel ) return result end +function CoronaPListSupport.generateXcprivacy( settings, platform ) + local platformSettings = settings[platform] + local ret = "" + if platformSettings and platformSettings.xcprivacy then + ret = ret .. CoronaPListSupport.valueToPlistEntry(platformSettings.xcprivacy) + end + + return ret +end function CoronaPListSupport.generateEntitlements( settings, platform, provisionProfile ) local platformSettings = settings[platform] diff --git a/platform/resources/OSXPackageApp.lua b/platform/resources/OSXPackageApp.lua index 3ae5d3a32..4bc2c306c 100644 --- a/platform/resources/OSXPackageApp.lua +++ b/platform/resources/OSXPackageApp.lua @@ -395,16 +395,53 @@ local function generateOSXEntitlements(filename, settings, provisionFile) return "", includeProvisioning end +-- xcprivacy +local templateXcprivacy = [[ + + + + +{{CUSTOM_XCPRIVACY}} + + +]] +local function generateXcprivacy( options ) + local filename = options.tmpDir .. "/PrivacyInfo.xcprivacy" + local outFile = assert( io.open( filename, "wb" ) ) + + local data = templateXcprivacy + + local generatedPrivacy = CoronaPListSupport.generateXcprivacy( options.settings, 'osx') + if( generatedPrivacy and generatedPrivacy ~= "" ) then + data, numMatches = string.gsub( data, "{{CUSTOM_XCPRIVACY}}", generatedPrivacy ) + assert( numMatches == 1 ) + end + + outFile:write(data) + assert( outFile:close() ) + + print( "Created XCPRIACY: " .. filename ); + + if debugBuildProcess and debugBuildProcess ~= 0 then + runScript("cat "..filename) + end +end + -- -- generateFiles -- --- Create the Info.plist file +-- Create the Info.plist and .xcprivacy file -- -- returns an error message or nil on success -- local function generateFiles( options ) local result = nil + result = generateXcprivacy( options ) + if result then + return result + end + result = CoronaPListSupport.modifyPlist( options ) if result then return result @@ -753,6 +790,11 @@ function OSXPostPackage( params ) runScript( "/bin/mkdir -p "..options.appBundleFile.."/Contents/Resources/Corona/" ) + --add xcprivacy file to the bundle + if options.settings.osx and options.settings.osx.xcprivacy then + runScript("cp -v " .. quoteString(options.tmpDir .. "/PrivacyInfo.xcprivacy") .. " " .. quoteString(makepath(appBundleFileUnquoted, "PrivacyInfo.xcprivacy"))) + end + -- We get the signingIdentity as a cert fingerprint but we also need the plaintext name if options.signingIdentity then options.signingIdentityName = captureCommandOutput("security find-identity -p codesigning -v | grep '".. options.signingIdentity .."' | sed -e 's/.*\\(\".*\"\\).*/\\1/'") diff --git a/platform/resources/iPhonePackageApp.lua b/platform/resources/iPhonePackageApp.lua index 6e0b50000..9349f02f2 100644 --- a/platform/resources/iPhonePackageApp.lua +++ b/platform/resources/iPhonePackageApp.lua @@ -575,16 +575,54 @@ local function generateXcent( options ) end +-- xcprivacy +local templateXcprivacy = [[ + + + + +{{CUSTOM_XCPRIVACY}} + + +]] +local function generateXcprivacy( options ) + local filename = options.tmpDir .. "/PrivacyInfo.xcprivacy" + local outFile = assert( io.open( filename, "wb" ) ) + + local data = templateXcprivacy + + local generatedPrivacy = CoronaPListSupport.generateXcprivacy( options.settings, 'iphone') + if( generatedPrivacy and generatedPrivacy ~= "" ) then + data, numMatches = string.gsub( data, "{{CUSTOM_XCPRIVACY}}", generatedPrivacy ) + assert( numMatches == 1 ) + end + + outFile:write(data) + assert( outFile:close() ) + + print( "Created XCPRIACY: " .. filename ); + + if debugBuildProcess and debugBuildProcess ~= 0 then + runScript("cat "..filename) + end +end + + -- -- generateFiles -- --- Create the .xcent and Info.plist files +-- Create the .xcent, .xcprivacy, and Info.plist files -- -- returns an error message or nil on success -- local function generateFiles( options ) local result = nil + result = generateXcprivacy( options ) + if result then + return result + end + result = generateXcent( options ) if result then return result @@ -963,10 +1001,15 @@ local function packageApp( options ) end --remove standard resources(Corona Resources Bundle) if users selects - if options.includeStandardResources == false then runScript("rm -rf "..quoteString(makepath(appBundleFileUnquoted, "CoronaResources.bundle"))) end + + --add xcprivacy file to the bundle + if options.settings.iphone and options.settings.iphone.xcprivacy then + runScript("cp -v " .. quoteString(options.tmpDir .. "/PrivacyInfo.xcprivacy") .. " " .. quoteString(makepath(appBundleFileUnquoted, "PrivacyInfo.xcprivacy"))) + end + -- bundle is now ready to be signed (don't sign if we don't have a signingIdentity, e.g. Xcode Simulator) if options.signingIdentity then diff --git a/platform/resources/tvosPackageApp.lua b/platform/resources/tvosPackageApp.lua index 45d36ca93..4c602a5f8 100644 --- a/platform/resources/tvosPackageApp.lua +++ b/platform/resources/tvosPackageApp.lua @@ -981,6 +981,11 @@ end local function generateFiles( options ) local result = nil + result = generateXcprivacy( options ) + if result then + return result + end + result = generateXcent( options ) if result then return result @@ -994,6 +999,38 @@ local function generateFiles( options ) return result end +-- xcprivacy +local templateXcprivacy = [[ + + + + +{{CUSTOM_XCPRIVACY}} + + +]] +local function generateXcprivacy( options ) + local filename = options.tmpDir .. "/PrivacyInfo.xcprivacy" + local outFile = assert( io.open( filename, "wb" ) ) + + local data = templateXcprivacy + + local generatedPrivacy = CoronaPListSupport.generateXcprivacy( options.settings, 'tvos') + if( generatedPrivacy and generatedPrivacy ~= "" ) then + data, numMatches = string.gsub( data, "{{CUSTOM_XCPRIVACY}}", generatedPrivacy ) + assert( numMatches == 1 ) + end + + outFile:write(data) + assert( outFile:close() ) + + print( "Created XCPRIACY: " .. filename ); + + if debugBuildProcess and debugBuildProcess ~= 0 then + runScript("cat "..filename) + end +end + -- True for Ad Hoc or Store builds local function isBuildForDistribution( options ) if not options.signingIdentityName then @@ -1293,6 +1330,11 @@ local function packageApp( options ) end end + --add xcprivacy file to the bundle + if options.settings.tvos and options.settings.tvos.xcprivacy then + runScript("cp -v " .. quoteString(options.tmpDir .. "/PrivacyInfo.xcprivacy") .. " " .. quoteString(makepath(appBundleFileUnquoted, "PrivacyInfo.xcprivacy"))) + end + -- bundle is now ready to be signed (don't sign if we don't have a signingIdentity, e.g. Xcode Simulator) if options.signingIdentity then -- codesign embedded frameworks before signing the .app From 0d676ea87eb23035bf10571fc4bfc4652e3ba63c Mon Sep 17 00:00:00 2001 From: zero-meta Date: Tue, 11 Jun 2024 15:43:00 +0800 Subject: [PATCH 03/21] Linux: fixing the network issues (#707) --- platform/linux/src/NetworkLibrary.cpp | 60 +++++++++++++++++++++++++-- platform/linux/src/NetworkLibrary.h | 20 +++++---- platform/linux/src/NetworkSupport.cpp | 6 +++ platform/linux/src/NetworkSupport.h | 4 ++ 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/platform/linux/src/NetworkLibrary.cpp b/platform/linux/src/NetworkLibrary.cpp index 50d5a0c36..579fd1195 100644 --- a/platform/linux/src/NetworkLibrary.cpp +++ b/platform/linux/src/NetworkLibrary.cpp @@ -17,6 +17,8 @@ #include "NetworkLibrary.h" #include "NetworkSupport.h" +using namespace Rtt; + int luaload_network(lua_State *L); // This corresponds to the name of the library, e.g. [Lua] require "plugin.library" @@ -71,6 +73,9 @@ void NetworkNotifierTask::operator()( Scheduler & sender ) fRequestState->setError(message); } + // Set responseHeaders + fRequestState->setResponseHeaders(fRequestParams->fResponseHeaders.c_str()); + CoronaFileSpec *responseFile = fRequestParams->getResponseFile(); if (responseFile != NULL) { @@ -85,6 +90,8 @@ void NetworkNotifierTask::operator()( Scheduler & sender ) { fwrite(fRequestParams->fResponse.data(), 1, fRequestParams->fResponse.size(), f); fclose(f); + fRequestState->setBytesEstimated(fRequestParams->fResponse.size()); + fRequestState->setBytesTransferred(fRequestParams->fResponse.size()); } } } @@ -93,6 +100,8 @@ void NetworkNotifierTask::operator()( Scheduler & sender ) fRequestState->fResponseBody.bodyType = TYPE_BYTES; const uint8_t* buf = (const uint8_t*) fRequestParams->fResponse.data(); fRequestState->fResponseBody.bodyBytes = new ByteVector(buf, buf + fRequestParams->fResponse.size()); + fRequestState->setBytesEstimated(fRequestParams->fResponse.size()); + fRequestState->setBytesTransferred(fRequestParams->fResponse.size()); } fRequestState->setStatus(status); @@ -182,7 +191,7 @@ int NetworkLibrary::Open(lua_State *L) // Leave "library" on top of stack // Set library as upvalue for each library function - lua_CFunction factory = Corona::Lua::Open < Rtt::luaload_network > ; + lua_CFunction factory = Corona::Lua::Open < luaload_network > ; return CoronaLibraryNewWithFactory(L, factory, kVTable, library); } @@ -221,6 +230,15 @@ int NetworkLibrary::request(lua_State *L) return thiz->sendRequest(L); } +size_t curlHeaderCallback(char *buffer, size_t size, size_t nitems, void *userdata) { + size_t totalSize = size * nitems; + + UTF8String *headers = static_cast(userdata); + headers->append(buffer, totalSize); + + return totalSize; +} + int NetworkLibrary::sendRequest(lua_State *L) { smart_ptr requestParams = new NetworkRequestParameters(L); @@ -233,10 +251,11 @@ int NetworkLibrary::sendRequest(lua_State *L) curl_multi_add_handle(curlMulti, curl); requestParams->setCURL(curlMulti, curl); - const std::string& method = requestParams->getRequestMethod(); + // const std::string& method = requestParams->getRequestMethod(); CURLcode rc; const Body* body = requestParams->getRequestBody(); + std::string fileSize = ""; switch (body->bodyType) { case TYPE_STRING: @@ -249,13 +268,32 @@ int NetworkLibrary::sendRequest(lua_State *L) } case TYPE_BYTES: { - Rtt_ASSERT(body->bodyString); + Rtt_ASSERT(body->bodyBytes); unsigned char* buf = &body->bodyBytes->operator[](0); long buflen = body->bodyBytes->size(); rc = curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buf); rc = curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, buflen); break; } + case TYPE_FILE: + { + Rtt_ASSERT(body->bodyFile); + FILE *uploadFile = fopen(body->bodyFile->getFullPath().c_str(), "rb"); + if (uploadFile == NULL) { + break; + } + // Record the file handle, to be cleaned up together with curl. + requestParams->setFileHandle(uploadFile); + rc = curl_easy_setopt(curl, CURLOPT_READDATA, uploadFile); + // Get and set the file size. + long size = fseek(uploadFile, 0, SEEK_END) ? -1 : ftell(uploadFile); + fseek(uploadFile, 0, SEEK_SET); + rc = curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)size); + fileSize = "Content-Length: " + std::to_string(size); + // Set the POST request. + rc = curl_easy_setopt(curl, CURLOPT_POST, 1L); + break; + } case TYPE_NONE: break; @@ -276,7 +314,16 @@ int NetworkLibrary::sendRequest(lua_State *L) UTF8String requestHeaders = key + ": " + value; headers = curl_slist_append(headers, requestHeaders.c_str()); } + // Set the size of the file to be uploaded. + if (!fileSize.empty()) { + curl_slist_append(headers, fileSize.c_str()); + } rc = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + } else { + // Set the size of the file to be uploaded. + if (!fileSize.empty()) { + rc = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_slist_append(NULL, fileSize.c_str())); + } } rc = curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); @@ -286,9 +333,14 @@ int NetworkLibrary::sendRequest(lua_State *L) rc = curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L); + // Set the callback function for response headers. + rc = curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, curlHeaderCallback); + rc = curl_easy_setopt(curl, CURLOPT_HEADERDATA, &requestParams->fResponseHeaders); + rc = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &requestParams->fResponse); rc = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlWriteData); rc = curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); + rc = curl_easy_setopt(curl, CURLOPT_TIMEOUT, requestParams->getTimeout()); long status = 0; smart_ptr requestState = new NetworkRequestState(); @@ -458,7 +510,7 @@ int NetworkLibrary::RemoveSystemEventListener(lua_State *L, int systemEventListe // ---------------------------------------------------------------------------- -} // namespace Corona +// }// namespace Corona // ---------------------------------------------------------------------------- diff --git a/platform/linux/src/NetworkLibrary.h b/platform/linux/src/NetworkLibrary.h index 0f6f59187..a2e5f3924 100644 --- a/platform/linux/src/NetworkLibrary.h +++ b/platform/linux/src/NetworkLibrary.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // // This file is part of the Corona game engine. -// For overview and more information on licensing please refer to README.md +// For overview and more information on licensing please refer to README.md // Home page: https://github.com/coronalabs/corona // Contact: support@coronalabs.com // @@ -14,8 +14,10 @@ #include "Corona/CoronaLua.h" #include "Corona/CoronaMacros.h" +#include "Rtt_Event.h" #include "Rtt_LinuxContainer.h" #include "NetworkSupport.h" +#include "Rtt_Scheduler.h" namespace Rtt { @@ -29,7 +31,7 @@ namespace Rtt fRequestState(requestState) { } - + virtual ~NetworkCompletionEvent() { delete fRequestState; @@ -38,7 +40,7 @@ namespace Rtt static const char kName[]; virtual const char* Name() const { return kName; }; virtual int Push( lua_State *L ) const; - + smart_ptr fRequestState; }; @@ -79,20 +81,20 @@ namespace Rtt class NetworkNotifierTask : public Task { public: - + NetworkNotifierTask(NetworkRequestParameters* requestParams, NetworkRequestState* requestState, NetworkLibrary* lib) : Task(true) - , fRequestParams(requestParams) - , fRequestState(requestState) + , fRequestParams(requestParams) + , fRequestState(requestState) , fNetworkLibrary(lib) { } virtual void operator()( Scheduler & sender ); - + smart_ptr fRequestParams; smart_ptr fRequestState; NetworkLibrary* fNetworkLibrary; - }; - + }; +} #endif // _NetworkLibrary_H__ diff --git a/platform/linux/src/NetworkSupport.cpp b/platform/linux/src/NetworkSupport.cpp index baf992cf6..dd422db7b 100644 --- a/platform/linux/src/NetworkSupport.cpp +++ b/platform/linux/src/NetworkSupport.cpp @@ -565,6 +565,7 @@ NetworkRequestParameters::NetworkRequestParameters( lua_State *luaState) fRequestBodySize = 0; fResponseFile = NULL; fLuaCallback = NULL; + fFileHandle = NULL; fCURL = NULL; fMultiCURL = NULL; @@ -1022,9 +1023,14 @@ void NetworkRequestParameters::cancel() curl_easy_cleanup(fCURL); curl_multi_cleanup(fMultiCURL); + if (fFileHandle != NULL) { + fclose(fFileHandle); + } + // to prevent multiple calls fMultiCURL = NULL; fCURL = NULL; + fFileHandle = NULL; } } diff --git a/platform/linux/src/NetworkSupport.h b/platform/linux/src/NetworkSupport.h index 75eb29a13..c465d98b5 100644 --- a/platform/linux/src/NetworkSupport.h +++ b/platform/linux/src/NetworkSupport.h @@ -228,13 +228,16 @@ class NetworkRequestParameters: public ref_counted bool isDebug(); bool getHandleRedirects(); lua_State* getLuaState() const { return fL; }; + FILE* getFileHandle() const { return fFileHandle; }; CURL* getCURL() const { return fCURL; }; CURLM* getMultiCURL() const { return fMultiCURL; }; void setCURL(CURLM* curlMulti, CURL* curl) { fCURL = curl; fMultiCURL = curlMulti; }; + void setFileHandle(FILE* handle) { fFileHandle = handle; }; unsigned int getID() const { return fID; } void cancel(); membuf fResponse; + UTF8String fResponseHeaders; private: @@ -253,6 +256,7 @@ class NetworkRequestParameters: public ref_counted bool fIsValid; bool fHandleRedirects; lua_State* fL; + FILE* fFileHandle; CURL* fCURL; CURLM* fMultiCURL; unsigned int fID; From 786968a01df2221fd9cb413f5d3f576e21d72f57 Mon Sep 17 00:00:00 2001 From: zero-meta Date: Wed, 12 Jun 2024 22:27:23 +0800 Subject: [PATCH 04/21] Maintenance --- platform/linux/src/NetworkLibrary.cpp | 6 ++---- platform/linux/src/NetworkLibrary.h | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/platform/linux/src/NetworkLibrary.cpp b/platform/linux/src/NetworkLibrary.cpp index 579fd1195..daa4964fe 100644 --- a/platform/linux/src/NetworkLibrary.cpp +++ b/platform/linux/src/NetworkLibrary.cpp @@ -17,8 +17,6 @@ #include "NetworkLibrary.h" #include "NetworkSupport.h" -using namespace Rtt; - int luaload_network(lua_State *L); // This corresponds to the name of the library, e.g. [Lua] require "plugin.library" @@ -191,7 +189,7 @@ int NetworkLibrary::Open(lua_State *L) // Leave "library" on top of stack // Set library as upvalue for each library function - lua_CFunction factory = Corona::Lua::Open < luaload_network > ; + lua_CFunction factory = Corona::Lua::Open < Rtt::luaload_network > ; return CoronaLibraryNewWithFactory(L, factory, kVTable, library); } @@ -510,7 +508,7 @@ int NetworkLibrary::RemoveSystemEventListener(lua_State *L, int systemEventListe // ---------------------------------------------------------------------------- -// }// namespace Corona +}// namespace Corona // ---------------------------------------------------------------------------- diff --git a/platform/linux/src/NetworkLibrary.h b/platform/linux/src/NetworkLibrary.h index a2e5f3924..8b83cb73d 100644 --- a/platform/linux/src/NetworkLibrary.h +++ b/platform/linux/src/NetworkLibrary.h @@ -96,5 +96,5 @@ namespace Rtt smart_ptr fRequestState; NetworkLibrary* fNetworkLibrary; }; -} +// } #endif // _NetworkLibrary_H__ From 8fa433394b8136cf8d76e5e3237f9b09e6903e09 Mon Sep 17 00:00:00 2001 From: Vlad Svoka Date: Tue, 16 Jul 2024 13:30:00 -0700 Subject: [PATCH 05/21] Apple: using Xcode 15.4 (#712) --- .github/workflows/build.yml | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46266aa15..35bd7c4c1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,11 +14,16 @@ on: description: 'Build Year' required: true default: '2100' + onlyLatest: + description: "Only Latest Xcode" + type: 'boolean' + required: false + default: false env: WORKSPACE: ${{ github.workspace }} - DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_15.4.app/Contents/Developer BUILD_NUMBER: ${{ github.event.inputs.buildNumber }} YEAR: ${{ github.event.inputs.buildYear }} @@ -26,7 +31,6 @@ env: jobs: source-code: name: Check out and process source code - if: "!contains(github.ref, 'refs/tags/') || github.repository == 'coronalabs/corona'" runs-on: macos-12 steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" @@ -45,7 +49,7 @@ jobs: native: needs: source-code - runs-on: macos-13 + runs-on: macos-14 steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - name: Get processed code @@ -70,9 +74,10 @@ jobs: strategy: matrix: runner: - - macos-13 + - macos-14 xcode: - Xcode_15.3 + - Xcode_15.4 target: - template - template-angle @@ -110,6 +115,7 @@ jobs: Xcode-template-matrix-13: + if: (! github.event.inputs.onlyLatest) strategy: matrix: runner: @@ -152,6 +158,7 @@ jobs: path: ./output Xcode-template-matrix-12: + if: (! github.event.inputs.onlyLatest) strategy: matrix: runner: @@ -199,6 +206,7 @@ jobs: Xcode-template-matrix: + if: (! github.event.inputs.onlyLatest) strategy: matrix: runner: @@ -251,6 +259,7 @@ jobs: - Xcode-template-matrix-13 - Xcode-template-matrix-14 runs-on: ubuntu-20.04 + if: (! failure() && ! cancelled()) steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - uses: actions/checkout@v4 @@ -275,6 +284,8 @@ jobs: needs: - source-code runs-on: macos-13 + env: + DEVELOPER_DIR: /Applications/Xcode_15.2.app/Contents/Developer steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - name: Set up emsdk @@ -423,7 +434,7 @@ jobs: CoronaCards-iOS: needs: source-code - runs-on: macos-13 + runs-on: macos-14 steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - name: Get processed code @@ -450,7 +461,7 @@ jobs: CoronaCards-iOS-angle: needs: source-code - runs-on: macos-13 + runs-on: macos-14 steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - name: Get processed code @@ -484,7 +495,8 @@ jobs: - native - webtemplate - linux - runs-on: macos-13 + if: (! failure() && ! cancelled()) + runs-on: macos-14 steps: - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - name: Get processed code @@ -537,7 +549,7 @@ jobs: run: | curl -sL https://github.com/coronalabs/binary-data/releases/download/1.0/jre.macos.tgz -o jre.macos.tgz - name: required for appdmg - run: python3 -m pip install setuptools + run: brew install python-setuptools - name: install appdmg run: npm install -g appdmg - name: install imagemagick @@ -568,7 +580,7 @@ jobs: check-notarization: - runs-on: macos-13 + runs-on: macos-14 steps: - name: Check notarization credentials run: | From ba941a71d157e661a91dc3d05757a6c703cfbd0d Mon Sep 17 00:00:00 2001 From: Vlad Svoka Date: Fri, 19 Jul 2024 10:44:55 -0700 Subject: [PATCH 06/21] Maintenance (#714) --- platform/iphone/ios.mobileprovision | Bin 17338 -> 17822 bytes platform/tvos/tvos.mobileprovision | Bin 16126 -> 16126 bytes tools/GHAction/Certificates.p12 | Bin 19251 -> 19261 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/platform/iphone/ios.mobileprovision b/platform/iphone/ios.mobileprovision index 6fbfe394cd54938045ab6274bd75d573fe61a816..8aaf29fe038f03cc9cf46795c35683c180107ac3 100644 GIT binary patch delta 8022 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 diff --git a/platform/tvos/tvos.mobileprovision b/platform/tvos/tvos.mobileprovision index c417eb3bda542fc21d15edcdb99dae5a132f027d..9880e68918fc57e2c5f49ba4e2c0810168442fd5 100644 GIT binary patch delta 4523 zcmZWsdlchjot+sF7+?@^7#3#qi1M^EG)bGZ85f*9+qBKANty@hY@4)sv`x~cX&yLJ z)CCqeIxgKaJ19FxWJOsY3l1ubsN>>meGkXQ6_A$?*zusKAc8t|D?;W>7#EWU zX-GOx)QY3jutm^}f(f0a5>?>}=)lin!6O&*RN?B1gpBd1o=>2OJdt^C5>JDYhs#8@ z3n>$^*fWYnLQ$P!f7p?0E{P4AdDEwc4SEQ|rOb9J6|Rp(OtCWO(K%h|Cq-=3i3i}Q ziLi5&3;JWYkcFf^McVL?%-d=WfwY>_rPLA6V@`>mh9!JF(Rv(!(7NSt!@5~cqO|Wp zE{l$%C`wbou8tIZ9;ii!L+4|$%FVL6+O!#yLRg?%pmE-v2w-nCCClvtmuOr__ev!P6mTjRp0!4vtQ5Cv?=V1hOT zFuf?NNH1o}w9%pvsfCq*riXE6Ej0S`NN2-Z!EeG{)&sjq6myk%H1tP=1#n5Xq{ejE z^~dheAC?OmOp8)XxtgEpDH1!yY*7(Mq+VzONLx2GTp7?kpeS1oEeQ3Q!r^VPqVi$J zX)~sb7*;yrCRklh2HjeU$L?@6kdSgUnJI9rF-(sSFmpn747N%RlOCN)Vg_pvzz*T+ zu-~Gkw1svJw-k0zje(R@9e^6|X<$RdO~HUX2x^w{$l}a~10<+GFjBWu4g!v^`a;{n z$BHl(W;4iPdqAh1^#YoU6NVvRWhRK-_RtOnWah-Zsbf~{d3!DnrXJn}e4rh?PZrqB*vl66C5<&eRSCsw1wp+<6RnilR_phwexm zx!Rd6Z$D<&qG$7YT18_Z7?cfbQW;tea~!oI#O&0fDh;w&?9~dmKktp|MBi@sK9VYq zW!lqVR-D!PNH3X`_(`eQ%AjhOn00|7XV$gAEi@A;aYUM{nF7%^lc1QD`IJS-hV5la ztLb!z0F4&iac@k6Folw>8d~rSb%JY|oFhIEwK*Dfq6ExT4$$ktv>ejBUMq4&MP)h$ zZiFD*WI)%e7!At}<)JIH)L_;n1&8c-l~!x8I-ld}Ih@grL`CYbYf65p-X6{d5mlPv z4O}g#S&Q)EE|`ru#p`oPgHIi`Hq@IK$uTS%7A8};;HPuOMHM2A5etfjwo_#cLx&10 zw(7GEr|BB55x#8>v9Xapj>!Ua>^9S36RB@0Oa;|BVK zp2vllP{s{8@L9340x8+KHipA)E2~Y*lu-)C{h9*Ty55}Pl)&KHPSBto1aA|aSf3_v z7wO2=zyT@T)d8Yx=}C~`=Ve*X&^}CPGsqiTh8Q#lH~?v! zV!IaGuX8Nmfe=v|$aA-AgY8OFR$H3i?WE;GsYJyiwBc4Ks5jN9In9n5Hj~0risQqy z1E3SY7VPCWPdon%*@o?;g!{ud(gn=VSCg8rFM$&ezIGKaV#az{&gM-1vV;CyTRwLB zGmDuV&wSU?X$I_!j9EF2QafjTH|}{v9At338WaMi_q!7&H!35Su|{n}z(h%LVy&O%c88kf;d&$Zh=Ex%O-b@FN>B%xW=bwH~~3f{_+WTV0HI#j(KNKw9%-SA&1Ow5pu6l$Z@W-I&I{2*4TB*!GstkfP$bwc@KD7nOidh= z5gkb=3KeJlpVX|qgkugWy%vtB5sItK{VQCy*7XtMb@B(0|%v&5;_$a z%IB-rV9T$Dwrq8#W3^qkDoRu~>yY5XsM;Ka*dQLPLSAngxz^H|(7;W<7uZU@xr&*{ zsc3#*HCrq-s#q?Y#e7d>hoh-t8XThcay{q6I^L%z2$&TR)1x?5nALco);7WfoDU)* zEsn7R`_D?(o+2h(PQk2f0<6cDm*;L~PLZ(^D-TmHUzs3xmX~k770_iRe=#U@8Jp=j zJ=7%t&~v8LlAWQR>oXQ=k9nCM8=mDDwZ>>EZ`r-THMs{_Q>aLHB3!8#plO&(B3kJ7 z$1y-pI@eL8b4%i7or6AVgK_<{tfG0!&oq9wepNKGub%K`U zsaVai85K4v&9PFi7Fzvw^T6pBylw54_Ou8BxI- z^H3Re)3T#$1K*00DogMhI$`Pndg;{ZbiY)OSzPb<^4cG!c;wg^x*M=o!9O>cqOj`^a!snn+DImY4k z$aaP{Zip;}*%Xa62^^6z9k+)QXXw_@1i%TAO^HNrGy{Wi<|c=UCeGqXjgTg_l}<{e zNHuVo66gfTIP$MV+hvL1FTYzfIFhnhJW5DWZ|ID{V5&mm7=z;?;SjdYya=%b>Pje@$iDkDcSeZ;C#*~I(l-8++mXe?~@?6znY347%8)Uwq zX_jJ>KLNeeO=2eGAA$d{UNLPG7>fZlg7{O1E1lZ(s%F-3DdJa$tN;J^RKQ}ZZeQHP zmQj4AZJg4RHpbYvnso)FCE$Do@8wmq<7OR#oI$>X3#BZ_Wf>t-tQFOyUO+I^q#NYz z9xPWWjIai{!Zj_r%(d)!rA}&8D}WLh@JOjZqz4Wa_N+Y>{y$f_13R}3*Ph#jOXV`$ z1-6->)!kM$p~|+ZWg^>3)&K2%=W7pZ-_rEP39r8WrVXF^^=l{XZ(QN(b^M{L93)HJWbo%5U?>O_<_b@xc@lW^6AN=I6 zzR-Q{+>e3_{d4Nk#@;VoyJqiK?m7|OCmy+iTX)rIPdu4ES^IK7|IKYD{nynO?H;`E z$xA-_1bT2+-FoBW|8V@y{ck&G?|U|`QFrvu|M&wpzw_>QZGQIVE6wedr$7FkZ*2@t zlP_rB=6wB*;idPk`69aUiI1*+%{s`={e?@V8*cgG757SMY;*>`lx=Z#oZ&vP`)dBs{)2abPp`k@+Dq zYn*(*FI~6(WlgQUWII>}Dj*70%226l0Ixr8{Tr^TU-j&Uwd;=sHyyh%`S#8eK63I2 z&pkzXSO0kXH}+ohFPGiC99?q#;-1|6eu_xi zuUdCRmcD=1jjcoVi`KNS34zDHX?@2(^1bW!o3A?Mqw-nL4u1IdhmQPa$3N{v*Y&pk EFN9oQ9{>OV delta 4433 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 My=~DS=cMuf1yZt5rvLx| diff --git a/tools/GHAction/Certificates.p12 b/tools/GHAction/Certificates.p12 index 8e3af5dec6340074bd627b8b3c0c169a98563287..a267da62aed88889ec7617e0208b5a950ce4525f 100644 GIT binary patch delta 18939 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

&<$0r> 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 Wli$wXT8RV*b4x6EzVN$a0s#T$x}L=V delta 18951 zcmY(KLv$_*ux4Z9#I|kQwrv|HPX5@oZQHhO+d8q+_YGe6>RGLC)u5^ddsMq86}TxC zn3yq8h5-Z^lrd2H1p=BnR5J7x9vBihKT!G%EKvIBzj!Z!m znF`+*-{Ox~>kF?IG)M$x#L;_ZMA?m%1G)jr{f6kv$xx2vy}}&veuYzmh*D2WiLKcP zTw& z5q9Ux$A>eXknDouYSH_qgVL|Rpe?7jUO9!O&ZYyS4q-?F8xFEmNCTr4iayHgkB|

xNBPLLL^Teu}KqGYCM834XgI5z0M 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 Date: Fri, 19 Jul 2024 13:58:41 -0700 Subject: [PATCH 07/21] Maintenance (#715) --- .github/workflows/build.yml | 49 +------------------------------------ 1 file changed, 1 insertion(+), 48 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35bd7c4c1..31be8b779 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -163,56 +163,9 @@ jobs: matrix: runner: - macos-12 - xcode: - - Xcode_13.4.1 - - Xcode_14.2 - target: - - template - - template-angle - platform: - - iphone - - tvos - needs: source-code - runs-on: ${{ matrix.runner }} - env: - DEVELOPER_DIR: /Applications/${{ matrix.xcode }}.app/Contents/Developer - TEMPLATE_TARGET: ${{ matrix.target }} - TEMPLATE_PLATFORM: ${{ matrix.platform }} - S2D_MIN_VER_IOS: "8.0" - S2D_MIN_VER_TVOS: "9.0" - S2D_MIN_VER_MACOS: "10.9" - steps: - - run: CDR="$(basename "$(pwd)")" ; cd .. ; rm -rf "$CDR" ; mkdir -p "$CDR" ; cd "$CDR" - - name: Get processed code - uses: actions/download-artifact@v4 - with: - name: SourceCode - path: SourceCode - - name: Unpack source code - run: tar -xzf SourceCode/corona.tgz - - run: ./tools/GHAction/daily_env.sh - - name: Build templates - working-directory: ./platform/${{ matrix.platform }} - run: ./gh_build_templates.sh - env: - CERT_PASSWORD: ${{ secrets.CertPassword }} - - name: Build templates JSON spec - run: ./tools/GHAction/generate_xcode_jsons.py - - name: Upload templates - uses: actions/upload-artifact@v4 - with: - name: Templates-${{ matrix.platform }}-${{ matrix.xcode }}-${{ matrix.target }} - path: ./output - - - Xcode-template-matrix: - if: (! github.event.inputs.onlyLatest) - strategy: - matrix: - runner: - - macos-11 xcode: - Xcode_13.2.1 + - Xcode_14.2 target: - template - template-angle From fc521d21cc0ce4df987814dcd118d393ce369a6b Mon Sep 17 00:00:00 2001 From: Vlad Shcherban Date: Sat, 20 Jul 2024 06:25:43 -0700 Subject: [PATCH 08/21] Maintenance --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 31be8b779..cc2bc8309 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -207,7 +207,6 @@ jobs: collect-ios-templates: needs: - - Xcode-template-matrix - Xcode-template-matrix-12 - Xcode-template-matrix-13 - Xcode-template-matrix-14 From 3ab14e34de49423c16b61be0b1e8d35e9252d64f Mon Sep 17 00:00:00 2001 From: Jeremy <53489032+clang-clang-clang@users.noreply.github.com> Date: Mon, 12 Aug 2024 02:25:52 +0800 Subject: [PATCH 09/21] Android: fix audio metatable being covered (#698) --- platform/android/ndk/Rtt_LuaLibOpenSLES.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/android/ndk/Rtt_LuaLibOpenSLES.cpp b/platform/android/ndk/Rtt_LuaLibOpenSLES.cpp index d13a05329..3252a00ee 100644 --- a/platform/android/ndk/Rtt_LuaLibOpenSLES.cpp +++ b/platform/android/ndk/Rtt_LuaLibOpenSLES.cpp @@ -1,6 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // // This file is part of the Corona game engine. +// With contributions from Dianchu Technology // For overview and more information on licensing please refer to README.md // Home page: https://github.com/coronalabs/corona // Contact: support@coronalabs.com @@ -1580,7 +1581,7 @@ namespace Rtt // To provide access to queries via dot-notation (like audio.freeChannels) // I need a metatable on the main audio table. // And that metatable needs to have the __index metamethod defined. - luaL_register(L, "metatable.audio", kVTable_m); + luaL_register(L, "metatable.audio2", kVTable_m); lua_setmetatable(L, -2); lua_pop(L, 1); // pop table From a8265c4194f5fa968ab8195e3f926c2b2eb4d341 Mon Sep 17 00:00:00 2001 From: Vlad Svoka Date: Sun, 11 Aug 2024 11:53:21 -0700 Subject: [PATCH 10/21] [BETA!] Android: API level 34 (#718) --- .github/workflows/build.yml | 2 +- platform/android/Rtt_AndroidAppPackager.cpp | 6 +- platform/android/app/build.gradle.kts | 90 +++--- platform/android/app/proguard-rules.pro | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 - platform/android/build.gradle.kts | 2 +- platform/android/gradle.properties | 5 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 +- platform/android/gradlew | 282 +++++++++++------- platform/android/gradlew.bat | 54 ++-- platform/android/sdk/build.gradle.kts | 38 +-- subrepos/enterprise | 2 +- tools/GHAction/build_native.sh | 3 +- 14 files changed, 266 insertions(+), 230 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cc2bc8309..4a2b8a60c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -61,7 +61,7 @@ jobs: run: tar -xzf SourceCode/corona.tgz - run: ./tools/GHAction/daily_env.sh - name: Build Native - run: JAVA_HOME="$JAVA_HOME_11_X64" ./tools/GHAction/build_native.sh + run: JAVA_HOME="${JAVA_HOME_17_X64:-$JAVA_HOME_17_arm64}" ./tools/GHAction/build_native.sh env: CERT_PASSWORD: ${{ secrets.CertPassword }} - name: Upload Corona Native diff --git a/platform/android/Rtt_AndroidAppPackager.cpp b/platform/android/Rtt_AndroidAppPackager.cpp index d15ac2077..25bbd5d5d 100755 --- a/platform/android/Rtt_AndroidAppPackager.cpp +++ b/platform/android/Rtt_AndroidAppPackager.cpp @@ -257,11 +257,11 @@ AndroidAppPackager::Build( AppPackagerParams * params, const char * tmpDirBase ) gradleGo.append(" && cd template &&"); #if defined(Rtt_MAC_ENV) || defined(Rtt_LINUX_ENV) - bool java11Installed = 0 == system("JAVA_VERSION=11 /usr/bin/java -version > /dev/null 2>/dev/null"); + bool java11Installed = 0 == system("JAVA_VERSION=17 /usr/bin/java -version > /dev/null 2>/dev/null"); if(java11Installed) { - gradleGo.append(" ./setup.sh && JAVA_VERSION=11 ./gradlew"); + gradleGo.append(" ./setup.sh && JAVA_VERSION=17 ./gradlew"); } else { - Rtt_TRACE_SIM(("WARNING: Java 11 does not seems to be available. If build fails, install Java 1.11.")); + Rtt_TRACE_SIM(("WARNING: Java 17 does not seems to be available. If build fails, install Java 17")); gradleGo.append(" ./setup.sh && ./gradlew"); } #else diff --git a/platform/android/app/build.gradle.kts b/platform/android/app/build.gradle.kts index 7e9d4d848..b2cb6fe23 100644 --- a/platform/android/app/build.gradle.kts +++ b/platform/android/app/build.gradle.kts @@ -39,8 +39,10 @@ val coronaSrcDir = project.findProperty("coronaSrcDir") as? String } val coronaBuiltFromSource = file("CMakeLists.txt").exists() && file("../sdk").exists() -val windows = System.getProperty("os.name").toLowerCase().contains("windows") -val linux = System.getProperty("os.name").toLowerCase().contains("linux") +val buildDirectory = layout.buildDirectory.asFile.get() + +val windows = System.getProperty("os.name").lowercase().contains("windows") +val linux = System.getProperty("os.name").lowercase().contains("linux") val shortOsName = if (windows) "win" else if (linux) "linux" else "mac" val nativeDir = if (windows) { @@ -53,7 +55,7 @@ val nativeDir = if (windows) { resourceDir ?: "${System.getenv("HOME")}/Library/Application Support/Corona/Native/" } -val coronaPlugins = file("$buildDir/corona-plugins") +val coronaPlugins = file("$buildDirectory/corona-plugins") val luaCmd = "$nativeDir/Corona/$shortOsName/bin/lua" val isSimulatorBuild = coronaTmpDir != null @@ -77,17 +79,17 @@ val buildToolsDir = "$projectDir/buildTools".takeIf { file(it).exists() } checkCoronaNativeInstallation() copy { from(zipTree("$nativeDir/Corona/android/resource/android-template.zip")) - into("$buildDir/intermediates/corona-build-tools") + into("$buildDirectory/intermediates/corona-build-tools") } - "$buildDir/intermediates/corona-build-tools/template/app/buildTools" + "$buildDirectory/intermediates/corona-build-tools/template/app/buildTools" }() -val generatedPluginsOutput = "$buildDir/generated/corona_plugins" +val generatedPluginsOutput = "$buildDirectory/generated/corona_plugins" val generatedPluginAssetsDir = "$generatedPluginsOutput/assets" val generatedPluginNativeLibsDir = "$generatedPluginsOutput/native" val generatedBuildIdPath = "$generatedPluginsOutput/build" val generatedPluginMegaJar = "$generatedPluginsOutput/plugins.jar" -val generatedMainIconsAndBannersDir = "$buildDir/generated/corona_icons" +val generatedMainIconsAndBannersDir = "$buildDirectory/generated/corona_icons" val parsedBuildProperties: JsonObject = run { coronaTmpDir?.let { srcDir -> @@ -122,9 +124,9 @@ val parsedBuildProperties: JsonObject = run { isIgnoreExitValue = true } if (execResult.exitValue != 0) { - throw InvalidUserDataException("Build.settings file could not be parsed: ${output.toString().replace(luaCmd, "")}") + throw InvalidUserDataException("Build.settings file could not be parsed: ${output.toString(charset("UTF-8")).replace(luaCmd, "")}") } - val parsedBuildSettingsFile = Parser.default().parse(StringBuilder(output.toString())) as? JsonObject + val parsedBuildSettingsFile = Parser.default().parse(StringBuilder(output.toString(charset("UTF-8")))) as? JsonObject return@run JsonObject(mapOf("buildSettings" to parsedBuildSettingsFile, "packageName" to coronaAppPackage, "targetedAppStore" to coronaTargetStore)) } @@ -189,13 +191,14 @@ if (configureCoronaPlugins == "YES") { // android { + namespace = coronaAppPackage lintOptions { isCheckReleaseBuilds = true } - compileSdk = 33 + compileSdk = 34 defaultConfig { applicationId = coronaAppPackage - targetSdk = 33 + targetSdk = 34 minSdk = (extra["minSdkVersion"] as Int) versionCode = coronaVersionCode versionName = coronaVersionName @@ -224,18 +227,6 @@ android { } } - applicationVariants.all { - generateBuildConfigProvider!!.configure { - enabled = false - } - } - testOptions { - testVariants.all { - generateBuildConfigProvider!!.configure { - enabled = false - } - } - } val mainSourceSet = sourceSets["main"] val pluginJniLibs = file(coronaPlugins).walk().maxDepth(2).filter { it.name == "jniLibs" }.toSet() mainSourceSet.jniLibs.srcDirs(pluginJniLibs) @@ -285,7 +276,7 @@ android { // val apkFilesSet = mutableSetOf() -file("$buildDir/intermediates/corona_manifest_gen/CopyToApk.txt").takeIf { it.exists() }?.readLines()?.forEach { +file("$buildDirectory/intermediates/corona_manifest_gen/CopyToApk.txt").takeIf { it.exists() }?.readLines()?.forEach { apkFilesSet.add(it.trim()) } if (!isSimulatorBuild) { @@ -294,7 +285,7 @@ if (!isSimulatorBuild) { } } if (apkFilesSet.isNotEmpty()) { - val generatedApkFiles = "$buildDir/generated/apkFiles" + val generatedApkFiles = "$buildDirectory/generated/apkFiles" val coronaCopyApkFiles = tasks.create("coronaCopyApkFiles") { description = "Creates new resource directory with raw APK files" into(generatedApkFiles) @@ -392,14 +383,16 @@ fun coronaAssetsCopySpec(spec: CopySpec) { } android.applicationVariants.all { - val baseName = this.baseName.toLowerCase() + val baseName = this.baseName.lowercase() + val baseNameCapitalized = baseName.replaceFirstChar(Char::titlecase) + val isRelease = (baseName == "release") - val generatedAssetsDir = "$buildDir/generated/corona_assets/$baseName" - val compiledLuaArchive = "$buildDir/intermediates/compiled_lua_archive/$baseName/resource.car" + val generatedAssetsDir = "$buildDirectory/generated/corona_assets/$baseName" + val compiledLuaArchive = "$buildDirectory/intermediates/compiled_lua_archive/$baseName/resource.car" // fix assets not been merge when lua file changed - val luaArchiveInMergedAssets = "$buildDir/intermediates/assets/$baseName/resource.car" + val luaArchiveInMergedAssets = "$buildDirectory/intermediates/assets/$baseName/resource.car" - val compileLuaTask = tasks.create("compileLua${baseName.capitalize()}") { + val compileLuaTask = tasks.create("compileLua$baseNameCapitalized") { description = "If required, compiles Lua and archives it into resource.car" val luac = "$nativeDir/Corona/$shortOsName/bin/luac" @@ -415,7 +408,7 @@ android.applicationVariants.all { outputs.file(compiledLuaArchive) doLast { val rootFile = file(coronaSrcDir) - val compiledDir = "$buildDir/intermediates/compiled_lua/$baseName" + val compiledDir = "$buildDirectory/intermediates/compiled_lua/$baseName" delete(compiledDir) mkdir(compiledDir) val luaFiles = if (isSimulatorBuild) { @@ -471,8 +464,8 @@ android.applicationVariants.all { coronaBuild = "$coronaBuild", } """.trimIndent() - val metadataConfig = file("$buildDir/tmp/config.$baseName.lua") - val metadataCompiled = file("$buildDir/tmp/config.$baseName.lu") + val metadataConfig = file("$buildDirectory/tmp/config.$baseName.lua") + val metadataCompiled = file("$buildDirectory/tmp/config.$baseName.lu") mkdir(metadataConfig.parent) metadataConfig.writeText(metadataLuaStr) val configEntries = outputsList.filter { file(it).name == "config.lu" } + metadataConfig @@ -498,7 +491,7 @@ android.applicationVariants.all { } } - val taskCopyResources = tasks.create("packageCoronaApp${baseName.capitalize()}") { + val taskCopyResources = tasks.create("packageCoronaApp$baseNameCapitalized") { description = "Copies all resources and compiled Lua to the project" dependsOn(compileLuaTask) @@ -529,6 +522,8 @@ android.applicationVariants.all { dependsOn(taskCopyResources) } android.sourceSets[name].assets.srcDirs(generatedAssetsDir) + tasks.findByName("lintVitalAnalyze${baseNameCapitalized}")?.dependsOn(taskCopyResources) + tasks.findByName("generate${baseNameCapitalized}LintVitalReportModel")?.dependsOn(taskCopyResources) } fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { @@ -564,7 +559,7 @@ fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { "pluginPlatform" to androidDestPluginPlatform, "destinationDirectory" to coronaPlugins.absolutePath )).toJsonString() - val builderInput = file("$buildDir/tmp/builderInput.json") + val builderInput = file("$buildDirectory/tmp/builderInput.json") builderInput.parentFile.mkdirs() builderInput.writeText(buildParams) val builderOutput = ByteArrayOutputStream() @@ -661,7 +656,7 @@ fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { // Run `convert_metadata.lua` which collects plugin metadata into single file logger.lifecycle("Collecting plugin metadata") run { - file("$buildDir/intermediates").mkdirs() + file("$buildDirectory/intermediates").mkdirs() val metadataFiles = fileTree(coronaPlugins) { include("*/metadata.lua") pluginDisabledMetadata.forEach { @@ -674,7 +669,7 @@ fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { , "package.path='$nativeDir/Corona/shared/resource/?.lua;'..package.path" , *luaVerbosityPlug , "$buildToolsDir/convert_metadata.lua" - , "$buildDir/intermediates/plugins_metadata.json" + , "$buildDirectory/intermediates/plugins_metadata.json" , *metadataFiles.toTypedArray() ) } @@ -687,12 +682,12 @@ fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { val inputSettingsFile = if (buildPropsFile.exists()) { buildPropsFile } else { - val buildPropsOut = file("$buildDir/intermediates/corona.build.props") + val buildPropsOut = file("$buildDirectory/intermediates/corona.build.props") buildPropsOut.writeText(parsedBuildProperties.toJsonString()) buildPropsOut } - val manifestGenDir = "$buildDir/intermediates/corona_manifest_gen" + val manifestGenDir = "$buildDirectory/intermediates/corona_manifest_gen" file(manifestGenDir).mkdirs() exec { commandLine(luaCmd @@ -704,7 +699,7 @@ fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { , /*2*/ inputSettingsFile , /*3*/ coronaAppFileName ?: "Corona App" , /*4*/ "$manifestGenDir/AndroidManifest.xml" - , /*5*/ "$buildDir/intermediates/plugins_metadata.json" + , /*5*/ "$buildDirectory/intermediates/plugins_metadata.json" , /*6*/ "$buildToolsDir/strings.xml" , /*7*/ "$manifestGenDir/strings.xml" , /*8*/ "$manifestGenDir/CopyToApk.txt" @@ -754,7 +749,7 @@ fun downloadAndProcessCoronaPlugins(reDownloadPlugins: Boolean = true) { logger.lifecycle("Collecting legacy jar libraries") run { - val megaJarExtracted = "$buildDir/intermediates/corona-mega-jar" + val megaJarExtracted = "$buildDirectory/intermediates/corona-mega-jar" delete(megaJarExtracted) delete(generatedPluginMegaJar) fileTree(coronaPlugins) { @@ -798,9 +793,8 @@ tasks.register("processPluginsNoDownload") { // tasks.register("exportCoronaAppTemplate") { - if (coronaBuiltFromSource) group = "Corona-dev" enabled = coronaBuiltFromSource - destinationDirectory.set(file("$buildDir/outputs")) + destinationDirectory.set(file("$buildDirectory/outputs")) archiveFileName.set("android-template.zip") from(rootDir) { include("build.gradle.kts", "settings.gradle.kts", "gradle.properties") @@ -874,7 +868,7 @@ tasks.register("installAppTemplateToSim") { if (coronaBuiltFromSource) group = "Corona-dev" enabled = coronaBuiltFromSource dependsOn("exportCoronaAppTemplate") - from("$buildDir/outputs") { + from("$buildDirectory/outputs") { include("android-template.zip") } into("$coronaNativeOutputDir/android/resource") @@ -885,7 +879,7 @@ tasks.register("installAppTemplateAndAARToSim") { enabled = coronaBuiltFromSource dependsOn("installAppTemplateToSim") dependsOn(":Corona:assembleRelease") - from("${findProject(":Corona")?.buildDir}/outputs/aar/") { + from("${findProject(":Corona")?.layout?.buildDirectory?.asFile?.get()}/outputs/aar/") { include("Corona-release.aar") rename("Corona-release.aar", "Corona.aar") } @@ -897,7 +891,7 @@ fun copyWithAppFilename(dest: String, appName: String?) { delete("$dest/$coronaAppFileName.aab") var hasODR = false parsedBuildProperties.lookup>("buildSettings.android.onDemandResources").firstOrNull()?.forEach { - it["resource"].let { res -> + it["resource"].let { hasODR = true } } @@ -914,7 +908,7 @@ fun copyWithAppFilename(dest: String, appName: String?) { exclude("*unsigned*") } } - copyTask.from("$buildDir/outputs/bundle/$name") { + copyTask.from("$buildDirectory/outputs/bundle/$name") { include("*.aab") } } @@ -1108,7 +1102,7 @@ tasks.create("copySplashScreen") { tasks.register("createExpansionFile") { enabled = isExpansionFileRequired - destinationDirectory.set(file("$buildDir/outputs")) + destinationDirectory.set(file("$buildDirectory/outputs")) archiveFileName.set(coronaExpansionFileName) from(coronaSrcDir) { diff --git a/platform/android/app/proguard-rules.pro b/platform/android/app/proguard-rules.pro index f1b424510..bded0dce1 100644 --- a/platform/android/app/proguard-rules.pro +++ b/platform/android/app/proguard-rules.pro @@ -18,4 +18,8 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile + +-keep class com.ansca.** { *; } +-keep class com.coronalabs.** { *; } +-keep class com.naef.** { *; } +-keep class **.LuaLoader.** { *; } diff --git a/platform/android/app/src/main/AndroidManifest.xml b/platform/android/app/src/main/AndroidManifest.xml index 242bb7376..688dfa9ba 100644 --- a/platform/android/app/src/main/AndroidManifest.xml +++ b/platform/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@