cocosCreator2.4 googlePlay登錄升級、API 35、16KB內存頁面的支持

環境:我這里是cocosCreator 2.4.12 導出的android 工程

登錄升級

后臺收到的google 的提醒:
在這里插入圖片描述
之前是通過implementation 'com.google.android.gms:play-services-auth:20.0.0' 來獲取玩家 uid 和 郵箱,然后發送到我們的服務器獲取賬號。

升級文檔:從舊版 Google 登錄服務遷移到 Credential Manager 和 AuthorizationClient

這位網友的文檔寫的很好:接入谷歌最新登錄SDK憑據管理器Credential Manager

具體細節不考慮的話我們這邊只要能從新的登錄方式中繼續獲取玩家的 uid 和 郵箱,后續按照之前的邏輯繼續下去就行了。

build.gradle 中引入新的sdk:

//google登錄
implementation "androidx.credentials:credentials:1.3.0"
implementation "androidx.credentials:credentials-play-services-auth:1.3.0"
implementation "com.google.android.libraries.identity.googleid:googleid:1.1.0"

登錄主要代碼:

public static AppActivity app; // 在onCreate里保存的  app = this;
static final String TAG = "MainActivity";private static CredentialManager credentialManager;
private static boolean oneTapStatus = false;public static void googleSignIn(String str) {credentialManager = CredentialManager.create(app);GetSignInWithGoogleOption signInWithGoogleOption = new GetSignInWithGoogleOption.Builder(app.getString(R.string.web_client_id)).build(); //這里是web client idGetCredentialRequest request = new GetCredentialRequest.Builder().addCredentialOption(signInWithGoogleOption).build();android.os.CancellationSignal cancellationSignal = new android.os.CancellationSignal();cancellationSignal.setOnCancelListener(() -> {if (oneTapStatus) oneTapStatus = false;showToast("Preparing credentials with Google was cancelled.");});credentialManager.getCredentialAsync(app,request,cancellationSignal,Executors.newSingleThreadExecutor(),new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {@Overridepublic void onResult(GetCredentialResponse result) {handleGoogleSignIn(result);}@Overridepublic void onError(GetCredentialException e) {Log.e(TAG, "googleSignIn Error: " + e);}});}// Handle the successfully returned credential.public static void handleGoogleSignIn(GetCredentialResponse result) {Credential credential = result.getCredential();if (credential instanceof CustomCredential) {if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {// Use googleIdTokenCredential and extract id to validate and// authenticate on your serverGoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(credential.getData());String email = googleIdTokenCredential.getId();String idToken = googleIdTokenCredential.getIdToken();Log.d(TAG, "handleGoogleSignIn: " + email);app.nativeCallLoginWithGoogle(email, idToken);} else {// Catch any unrecognized custom credential type here.Log.e(TAG, "Unexpected type of credential");}} else {// Catch any unrecognized credential type here.Log.e(TAG, "Unexpected type of credential");}}public void nativeCallLoginWithGoogle(String email, String token){Log.d(TAG, "signIn token:" + token);Cocos2dxHelper.runOnGLThread(new Runnable() {@Overridepublic void run() {Cocos2dxJavascriptJavaBridge.evalString("cc.sdkMgr.googleSignIn(\""+email+"\",\""+token+"\")");}});}

這里的 token 是 JWT,可以直接解出來。JWT網站。

我這里把token放在JS里解析的,加了一個解析函數:

	getDataFromJWT(token) {try {//分割 Token 的三個部分const parts = token.split('.');if (parts.length !== 3) {throw new Error("Invalid JWT format");}//獲取 Payload (Base64Url 部分)const payloadBase64Url = parts[1];//Base64Url 轉 Base64let base64 = payloadBase64Url.replace(/-/g, '+').replace(/_/g, '/');//補全 Base64 末尾的 '='switch (base64.length % 4) {case 2: base64 += '=='; break;case 3: base64 += '='; break;}//解碼 Base64 → 字符串const buffer = Buffer.from(base64, 'base64');let decodedPayload = buffer.toString('utf-8');//解析為 JSON 對象return JSON.parse(decodedPayload);} catch (error) {console.error("JWT 解析失敗:", error);return null;}},}

解出來是這樣的數據(其中sub 就是uid,email就是郵箱):

{"iss": "https://accounts.google.com","azp": "xxxxxxxxx.apps.googleusercontent.com","aud": "xxxxxxxxxx.apps.googleusercontent.com","sub": "11111111111","email": "222222222222222222@gmail.com","email_verified": true,"name": "ZZZZZZZZZZZZZZZZ","picture": "https://lh3.googleusercontent.com/ZZZZZZZZZZZZZZZZ","given_name": "ZZZZZZZZZZZZZZZZ","family_name": "ZZZZZZZZZZZZZZZZ","iat": 1752744039,"exp": 1752747639
}

我們這邊由于是托管給 googlePlay 簽名的,就導致本地調試登錄會因為簽名問題無法進行,只能上內部軌道。后來同事將develop的簽名信息上傳的google后臺,這樣就可以在本地用androidStudio進行調試了(具體是在后臺添加了多個簽名,還是用develop簽名新建了一個測試項目我就不清楚)。
參考:Google Play 簽名維護

升級API 35

參考鏈接:請教各位,2025年,如何打包符合google商店要求的apk?

在這里插入圖片描述

1.下載新一些的androidStudio,下載鏈接,我選的版本是:Android Studio Meerkat Feature Drop | 2024.3.2 Patch 1

2.打開 Tools >> SDK Manager
SDK Platforms 下載 Android 15.0
SDK Tools 下載 35.0.0

3.升級gradle,使用的版本是:
在這里插入圖片描述
gradle sync失敗的話可以手動處理一下:Android Studio 手動下載Gradle配置的方法

4.在gradle.properties中升級API35相關的配置:(cocosCreator 可以在導出項目的時候先選擇 api-35,其它不一樣的再手動改)
在這里插入圖片描述
5.新版的AndroidStudio 需要在build.gradle 中也要配置一下ndkVerison(注意要跟 local.properties 中的一致 )
在這里插入圖片描述
6.如果還 編不過去的話,可以嘗試升級ndk到r26,如果需要支持16KB內存頁面,直接升級到r28。

16KB內存頁面的支持

參考鏈接:cocos2.4系列,如何打包支持16KB對齊的安卓應用???

先說如何檢測是否支持,官方文檔里有說 :支持 16 KB 的頁面大小,我使用的是mac,直接按照下面的方法:

使用 check_elf_alignment.sh 腳本(Linux 或 macOS) 請按照以下步驟使用
check_elf_alignment.sh 腳本檢查 ELF 段的對齊情況:

將 check_elf_alignment.sh 腳本保存到文件中。

對應用的 APK 文件運行腳本:

check_elf_alignment.sh APK_NAME.apk
該腳本會針對所有 arm64-v8a 共享庫輸出 ALIGNED 或 UNALIGNED。

如果任何 arm64-v8a 或 x86_64 共享庫是
UNALIGNED,您需要更新這些庫的打包,然后重新編譯應用,并按照本部分中的步驟重新測試。

其中 check_elf_alignment.sh腳本中的內容是:

#!/bin/bash
progname="${0##*/}"
progname="${progname%.sh}"# usage: check_elf_alignment.sh [path to *.so files|path to *.apk]cleanup_trap() {if [ -n "${tmp}" -a -d "${tmp}" ]; thenrm -rf ${tmp}fiexit $1
}usage() {echo "Host side script to check the ELF alignment of shared libraries."echo "Shared libraries are reported ALIGNED when their ELF regions are"echo "16 KB or 64 KB aligned. Otherwise they are reported as UNALIGNED."echoecho "Usage: ${progname} [input-path|input-APK|input-APEX]"
}if [ ${#} -ne 1 ]; thenusageexit
ficase ${1} in--help | -h | -\?)usageexit;;*)dir="${1}";;
esacif ! [ -f "${dir}" -o -d "${dir}" ]; thenecho "Invalid file: ${dir}" >&2exit 1
fiif [[ "${dir}" == *.apk ]]; thentrap 'cleanup_trap' EXITechoecho "Recursively analyzing $dir"echoif { zipalign --help 2>&1 | grep -q "\-P <pagesize_kb>"; }; thenecho "=== APK zip-alignment ==="zipalign -v -c -P 16 4 "${dir}" | egrep 'lib/arm64-v8a|lib/x86_64|Verification'echo "========================="elseecho "NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher."echo "  You can install the latest build-tools by running the below command"echo "  and updating your \$PATH:"echoecho "    sdkmanager \"build-tools;35.0.0-rc3\""fidir_filename=$(basename "${dir}")tmp=$(mktemp -d -t "${dir_filename%.apk}_out_XXXXX")unzip "${dir}" lib/* -d "${tmp}" >/dev/null 2>&1dir="${tmp}"
fiif [[ "${dir}" == *.apex ]]; thentrap 'cleanup_trap' EXITechoecho "Recursively analyzing $dir"echodir_filename=$(basename "${dir}")tmp=$(mktemp -d -t "${dir_filename%.apex}_out_XXXXX")deapexer extract "${dir}" "${tmp}" || { echo "Failed to deapex." && exit 1; }dir="${tmp}"
fiRED="\e[31m"
GREEN="\e[32m"
ENDCOLOR="\e[0m"unaligned_libs=()echo
echo "=== ELF alignment ==="matches="$(find "${dir}" -type f)"
IFS=$'\n'
for match in $matches; do# We could recursively call this script or rewrite it to though.[[ "${match}" == *".apk" ]] && echo "WARNING: doesn't recursively inspect .apk file: ${match}"[[ "${match}" == *".apex" ]] && echo "WARNING: doesn't recursively inspect .apex file: ${match}"[[ $(file "${match}") == *"ELF"* ]] || continueres="$(objdump -p "${match}" | grep LOAD | awk '{ print $NF }' | head -1)"if [[ $res =~ 2\*\*(1[4-9]|[2-9][0-9]|[1-9][0-9]{2,}) ]]; thenecho -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"elseecho -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"unaligned_libs+=("${match}")fi
doneif [ ${#unaligned_libs[@]} -gt 0 ]; thenecho -e "${RED}Found ${#unaligned_libs[@]} unaligned libs (only arm64-v8a/x86_64 libs need to be aligned).${ENDCOLOR}"
elif [ -n "${dir_filename}" ]; thenecho -e "ELF Verification Successful"
fi
echo "====================="

注意執行 腳本前需要搞一下環境:export PATH=/Users/loofnn/Library/Android/sdk/build-tools/35.0.0:$PATH
輸出是這個樣子的:

=== APK zip-alignment ===
4570074 lib/arm64-v8a/libcocos2djs.so (OK - compressed)
Verification succesful
============================ ELF alignment ===
/var/folders/4v/qgw2n0k93k33q9kbl3b6n_7c0000gn/T/app-release3_out_XXXXX.gxZM5X8KG7/lib/armeabi-v7a/libcocos2djs.so: \e[31mUNALIGNED\e[0m (2**12)
/var/folders/4v/qgw2n0k93k33q9kbl3b6n_7c0000gn/T/app-release3_out_XXXXX.gxZM5X8KG7/lib/arm64-v8a/libcocos2djs.so: \e[32mALIGNED\e[0m (2**14)

需要關注的是 arm64 和 x86_64 的括號內輸出。如果是(2**12)就是要升級。(上邊的輸出是我升級之后的)。

升級16KB這個非常簡單,按照網友說的 升級 NDK 到 r28就可以了。

如何升級ndk: 打開 Tools >> SDK Manager,SDK Tools 下載 NDK 28.1.13356709

如果幫到你的話,點個贊贊吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93898.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93898.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93898.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unity avpro實現互動影游關鍵問題

創建視頻播放器?在Hierarchy面板中右鍵創建&#xff1a;Video > AVPro Video - MediaPlayer創建后會生成一個MediaPlayer對象&#xff0c;用于控制視頻播放添加視頻資源將視頻文件放入項目的StreamingAssets文件夾下在MediaPlayer組件的設置中選擇要播放的視頻文件在UI上顯…

【C找第一個只出現一次的字符】2022-8-18

緣由樣例通過&#xff0c;請問為什么錯了呢&#xff1f;(語言-c語言)-編程語言-CSDN問答 char str[100000];fgets(str, 100000, stdin);int a[26]{}, i, count 0;int len strlen(str);for (i 0; i<len; i) a[str[i] - a];for (i 0; i<len; i){if (a[str[i] - a] 1){…

MCP AI應用通信的底層機制

技術小館專注AI與Java領域的前沿技術知識庫 技術小館官網 在AI應用快速發展的今天&#xff0c;不同AI系統之間的高效通信成為技術架構的關鍵挑戰。MCP&#xff08;Model Context Protocol&#xff09;作為新一代AI應用通信協議&#xff0c;正在重新定義AI工具生態的構建方式。…

UI測試平臺TestComplete如何實現從Git到Jenkins的持續測試

還在為手動做UI測試又慢又累發愁&#xff1f;更頭痛的是&#xff0c;代碼改完還得等半天才能測&#xff0c;測完了結果又散得到處都是&#xff0c;根本看不清質量全貌?TestComplete幫你搞定&#xff1a;直接連上你的Git倉庫&#xff0c;代碼一有動靜就能感知。接著&#xff0c…

【Debian】4-?2 Gitea搭建

【Debian】4-?2 Gitea搭建一、準備工作二、創建 Gitea 用戶&#xff08;推薦&#xff09;三、下載并安裝 Gitea四、配置Gitea4-1 創建目錄結構4-2 創建配置目錄五、配置 Systemd 服務六、訪問 Gitea Web 界面七、小插曲一、準備工作 更新系統軟件為最新 sudo apt update &am…

【CDH × Docker】一次測試部署,N 次復用的環境鏡像方案

&#x1f680; 一次測試環境的探索&#xff1a;我如何將 CDH 集群打包成 Docker 鏡像&#xff0c;留給未來的自己 &#x1f9e9; 背景故事 最近在項目中&#xff0c;我們計劃上線一個基于 CDH&#xff08;Cloudera Distribution Hadoop&#xff09; 的大數據平臺。正式上生產環…

Java 日期時間格式化模式說明

Java 中日期時間格式化使用特定的模式字符串來定義輸出格式。以下是常見的格式化符號及其含義&#xff0c;適用于 SimpleDateFormat 和 DateTimeFormatter一、日期部分格式化符號符號含義示例y年 (Year)yyyy → 2023M月 (Month)MM → 09, MMM → Sep, MMMM → Septemberd月中的…

代碼隨想錄算法訓練營三十三天|動態規劃part06

LeetCode 322 零錢兌換 題目鏈接&#xff1a;322. 零錢兌換 - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。 計算并返回可以湊成總金額所需的 最少的硬幣個數 。…

【大模型LLM】大模型訓練加速 - 梯度累積(Gradient Accumulation)原理詳解

梯度累積&#xff08;Gradient Accumulation&#xff09;原理詳解 梯度累積是一種在深度學習訓練中常用的技術&#xff0c;特別適用于顯存有限但希望使用較大批量大小&#xff08;batch size&#xff09;的情況。通過梯度累積&#xff0c;可以在不增加單個批次大小的情況下模擬…

【數據分享】各省文旅融合耦合協調度及原始數據(2012-2022)

數據介紹引言 文旅融合是推動區域經濟高質量發展、促進共同富裕的重要路徑。黨的二十大報告明確提出“推進文化和旅游深度融合發展”的戰略目標&#xff0c;文旅產業通過資源整合與業態創新&#xff0c;可顯著縮小城鄉、區域差距&#xff0c;提升物質與精神雙重福祉&#xff08…

Linux編程: 10、線程池與初識網絡編程

今天我計劃通過一個小型項目&#xff0c;系統講解線程池與網絡編程的核心原理及實踐。項目將圍繞 “利用線程池實現高并發網絡通信” 這一核心需求展開&#xff0c;具體設計如下&#xff1a; 為保證線程安全&#xff0c;線程池采用單例模式設計&#xff0c;確保全局唯一實例避…

藏云閣 Logo 庫(開源項目SVG/PNG高清Logo)

在日常技術方案設計、架構圖繪制或PPT制作中&#xff0c;常常會遇到一些問題&#xff0c;比如&#xff1a; 找不到統一風格的開源項目組件圖標&#xff0c;PPT中的logo五花八門下載的圖標分辨率不足&#xff0c;放大后模糊失真不同來源的圖標顏色風格沖突&#xff0c;破壞整體…

從0開始學習R語言--Day64--決策樹回歸

對于沒有特征或者說需要尋找另類關系的數據集&#xff0c;我們通常會用聚合或KNN近鄰的方法來分類&#xff0c;但這樣的分類或許在結果上是好的&#xff0c;但是解釋性并不好&#xff0c;有時候我們甚至能看到好的結果反直覺&#xff1b;而決策樹回歸做出的結果&#xff0c;由于…

B+樹高效實現與優化技巧

B樹的定義 一顆M階B樹T,滿足以下條件 每個結點至多擁有M課子樹 根結點至少擁有兩顆子樹 除了根結點以外,其余每個分支結點至少擁有M/2課子樹 所有的葉結點都在同一層上 有k棵子樹的分支結點則存在k-1個關鍵字,關鍵字按照遞增順序進行排序 關鍵字數量滿足 ceil( M/2 ) - 1 &…

Android 基礎入門學習目錄(持續更新)

四大組件 Activity&#xff1a; Service&#xff1a; BroadcastReceiver&#xff1a; ContentProvider&#xff1a; UI 與交互開發 常見的UI布局和UI控件 樣式與主題 Fragment Intent 數據存儲 自定義View和自定義Group 自定義View 自定義ViewGroup 事件分發 Key…

Linux移動大量文件命令

背景 使用 mv 命令報“/bin/mv: 參數列表過長”&#xff0c;也是第一遇到&#xff0c;查了一下&#xff0c;最后用rsync命令解決了。還好每臺服務器&#xff0c;都必裝rsync了&#xff0c;記錄如下。 命令 nohup rsync -av --remove-source-files --progress /public/tmp/video…

SQL中的HAVING用法

HAVING 是 SQL 中專門對 “分組之后的聚合結果” 再做篩選的子句。 它一般跟在 GROUP BY 后面&#xff0c;不能單獨使用&#xff0c;作用類似于分組版的 WHERE。? 1. 語法位置 SELECT 列1, 聚合函數(列2) AS 別名 FROM 表 GROUP BY 列1 HAVING 聚合條件; -- 這里寫對聚合…

【Halcon 】Halcon 實戰:如何為 XLD 模板添加極性信息以提升匹配精度?

Halcon 實戰&#xff1a;如何為 XLD 模板添加極性信息以提升匹配精度&#xff1f; 在使用 Halcon 進行模板匹配時&#xff0c;我們通常有兩種方式創建模板&#xff1a; 基于圖像灰度&#xff08;CreateScaledShapeModel&#xff09;基于輪廓 XLD&#xff08;CreateScaledShapeM…

grafana/lock-stack 日志 Pipeline 配置

前言 本文使用的是 grafana/loki-stack chart 抓取的 k8s 日志。其他 chart 配置都差不多。 日志問題 docker 容器運行時 pod 內原始日志 [cpu-4] Hello, 第 9788 次報時&#xff0c;時間&#xff1a;2025-08-01T06:35:420000 {"HOSTNAME":"cpu-4",&qu…

appium2.0+之PointerActions詳解

以下內容在 夜神模擬器 上進行。 一、應用場景 一些針對手勢的操作&#xff0c;比如滑動、長按、拖動等。可以將這些基本手勢組合成一個相對復雜的手勢。 二、使用步驟創建觸摸輸入設備&#xff08;模擬手指操作&#xff09; touch_input PointerInput(interaction.POINTER_TO…