首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 百度地圖定位失效:APK 加密重簽名導致 SHA1 指紋變更

     編輯:程式設計疑難解答

問題現象

APP 加固/加密前百度地圖定位正常,加固後**重新簽名**發布,定位功能失效(無法獲取經緯度、定位圖標閃爍不定位)。

核心原因

百度地圖 SDK 鑑權綁定「包名 + 簽名 SHA1 指紋」。
加固工具重新簽名會**改變 APK 的簽名證書**,導致 SHA1 指紋變更,與百度雲控制台配置的 SHA1 不一致,SDK 鑑權失敗,定位服務拒絕響應。

解決方案:獲取新簽名 SHA1 → 更新百度雲控制台

步驟 1:獲取加固後 APK 的簽名 SHA1

加固工具通常會輸出一個 .jks 或 .keystore 文件(如 signed.jks)。使用 JDK keytool 導出:

keytool -v -list -keystore signed.jks
# 輸入 keystore 密碼
# 輸出中找到 "SHA1:" 開頭的指紋,如:
# SHA1: 1A:2B:3C:4D:5E:6F:7A:8B:9C:0D:1E:2F:3A:4B:5C:6D:7E:8F:9A

若加固工具未直接給出 keystore,可從加固後 APK 提取:

# 1. 解壓 APK 獲取 META-INF/CERT.RSA
# 2. keytool -printcert -file CERT.RSA

步驟 2:百度地圖開放平台配置新 SHA1

  1. 登錄 百度地圖開放平台 控制台。
  2. 找到對應應用(或創建新應用),進入「安全碼/白名單」設置。
  3. **添加**新獲取的 SHA1 指紋(包名保持不變)。
  4. 保存,等待幾分鐘生效。

關鍵策略:雙應用/雙 SHA1 並存

為了同時支持**開發調試包(未加固簽名)**與**發布包(加固簽名)**,建議在百度控制台:

  • 創建兩個應用(或同一應用下添加兩條記錄):
    - 應用 A:包名 com.example.app + **開發機簽名 SHA1** (debug.keystore)
    - 應用 B:包名 com.example.app + **加固後簽名 SHA1** (signed.jks)
  • 代碼中動態根據渠道/構建類型初始化對應的 AK (API Key):
String apiKey = BuildConfig.IS_RELEASE ? "RELEASE_AK" : "DEBUG_AK";
SDKInitializer.initialize(this, apiKey); // 或在 Manifest 中配置 meta-data

常見誤區

誤區真相
以為加固不改變簽名主流加固(360、騰訊樂固、愛加密等)均會重簽名,SHA1 必變
只更新一個 SHA1會導致開發包或發布包其中一方定位失效,需雙 SHA1 並存
以為包名變了包名通常不變,鑑權核心是「包名+SHA1」組合
忽略 keytool 密碼加固平台通常提供 keystore 密碼,需妥善保存

驗證步驟

  1. 安裝加固後 APK,開啟定位權限。
  2. 查看 Logcat 過濾 BaiduMap 或 loc,確認無 auth failed、error code: 161 等鑑權錯誤。
  3. 測試定位是否能在幾秒內返回經緯度。

總結

**APK 加固重簽名 → SHA1 變更 → 百度鑑權失敗 → 定位失效。** 解決核心:**提取新簽名 SHA1 → 百度控制台添加/更新 → 雙環境雙 SHA1 並存配置。** 此原理同樣適用于高德地圖、騰訊地圖、微信分享、支付 SDK 等所有綁定簽名指紋的第三方服務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved