全部產品
Search
文件中心

Mobile Platform as a Service:常見問題

更新時間:Jul 13, 2024

查看以下常見問題列表,單擊具體的問題即可查看相應解答。

編譯時間無網路連接

在編譯檔案時,如果沒有網路,很有可能造成編譯失敗。通過以下步驟,確認編譯環境的網路已串連。

  1. 確認已串連到互連網。

  2. 確認未串連網路代理程式,包括瀏覽器代理設定、第三方網路代理程式軟體等。

  3. 確認未設定 IDE 代理。

    idea 代理

  4. gradle.properties 檔案中,確認未設定 Gradle 代理,即未設定 systemProp.http.proxyHostsystemProp.http.proxyPort 屬性。如果有設定,刪除相關屬性即可。 gradle代理

程式編譯失敗

如果程式編譯失敗,可通過以下步驟進行排錯與解決。

  1. 根據 編譯時間無網路連接,確認編譯環境網路已正常串連。

  2. 檢查 Gradle 執行記錄,確認新增的依賴有效。

  3. 檢查依賴的 GAV(groupartifactversion)參數設定正確。

    //引用 debug 包group:artifact:version:raw@jar
    bundle "com.app.xxxxx.xxxx:test-build:1.0-SNAPSHOT:raw@jar"
    //引用 release 包group:artifact:version@jar
    bundle "com.app.xxxxx.xxxx:test-build:1.0-SNAPSHOT@jar"
    manifest "com.app.xxxxx.xxxx:test-build:1.0-SNAPSHOT:AndroidManifest@xml"
  4. 在系統內建的命令列工具中,執行以下命令,匯出 Gradle 執行記錄:

    // 執行命令前,確認未定義 productflavor 屬性。否則,命令會運行失敗。
    // 以下命令將執行記錄匯出至 log.txt 檔案中。
    gradle buildDebug --info --debug -Plog=true > log.txt
  5. 查看步驟 4 中匯出的記錄檔案,在最新產生的記錄中,會看到類似如下記錄,表示新增的依賴不存在。

    Caused by: org.gradle.internal.resolve.ArtifactNotFoundException: Could not find nebulacore-build-AndroidManifest.xml (com.alipay.android.phone.wallet:nebulacore-build:1.6.0.171211174825).
    Searched in the following locations:
    http://mvn.cloud.alipay.com/nexus/content/repositories/releases/com/alipay/android/phone/wallet/nebulacore-build/1.6.0.171211174825/nebulacore-build-1.6.0.171211174825-AndroidManifest.xml
         at org.gradle.internal.resolve.result.DefaultBuildableArtifactResolveResult.notFound(DefaultBuildableArtifactResolveResult.java:38)
         at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveArtifactFromCache(CachingModuleComponentRepository.java:260)
  6. 訪問該記錄中的 HTTP 連結(如上一步所列記錄中的第 3 行)並登入,查看 Maven 倉庫。

    說明

    您可以在 build.gradle 檔案中查看登入時需要提供的賬戶名和密碼。

  7. 執行以下命令重新整理 gradle 緩衝。

    gradle clean --refresh-dependencies
  8. 如果 Maven 倉庫有對應依賴,刪除個人目錄下 Gradle 緩衝,然後重新編譯。刪除 Gradle 緩衝的方法如下:

    • 在 macOS、Linux、Unix 等系統中運行以下命令。

      cd ~
      cd .gradle
      cd caches
      rm -rf modules-2
    • 在 Windows 系統中,預設情況下,路徑定位到 C:\Users\\{使用者名稱}\\.gradle\caches,刪除 modules-2 檔案夾。

編譯過程中出現卡頓

如果編譯過程卡頓(等待超過 20 分鐘),您可以通過以下步驟提高編譯效率。

  1. 根據 上文步驟,確認編譯環境網路已正常串連。

  2. 確認防火牆已關閉。

  3. 確認未開啟 IntelliJ IDEA 編譯器的網路設定。

  4. 在代碼中,提前載入 Maven 鏡像。例如,以下是阿里雲載入 Maven 鏡像的代碼。

     apply plugin: 'maven'
     buildscript {
         repositories {
             mavenLocal()
    
     // 開始先載入 Maven 鏡像
             maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
    
             maven {
                 credentials {
                     username "請使用已知使用者"
                     password "請使用已知密碼"
                 }
                 url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
             }
         }
         dependencies {
             classpath 'com.android.tools.build:gradle:2.1.3'
             classpath 'com.alipay.android:android-gradle-plugin:2.1.3.3.3'
             classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
         }
     }
     allprojects {
         repositories {
             flatDir {
                 dirs 'libs'
             }
             mavenLocal()
             maven {
                 credentials {
                     username "xxxxxxxxx"
                     password "xxxxxxx"
                 }
                 url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
             }
             maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
         }
     }

編譯不通過且出現 NullPointerException

null 指標異常在接入專有雲時,下載設定檔並接入 mPaaS 後,編譯不通過並且出現 NullPointerException。如果遇到此類問題,一般需要對 config 設定檔中的欄位進行檢查。檢查 13 個欄位是否有缺少,和公用雲端下載過來的檔案進行對比,確認欄位名是否正確。

如何調試應用

開發過程中需要調試代碼,本文介紹兩種調試方式。

  • 以偵錯模式啟動應用

  • 應用運行後調試

以偵錯模式啟動應用

  • 使用情境

    希望調試應用啟動時的最初代碼,比如在 application init 時初始化代碼。

  • 操作步驟

  1. 執行命令 adb shell am start -W -S -D 應用程式套件名/應用第一個啟動的頁面類名。例如,mPaaS Demo 的包名是 com.mpaas.demo,應用第一個啟動的頁面類名是com.alipay.mobile.quinox.LauncherActivity,那麼可以使用命令列 adb shell am start -W -S -D com.mpaas.demo/com.alipay.mobile.quinox.LauncherActivity 以偵錯模式啟動應用。第一個啟動的類名如下圖所示。

    img

  2. 執行命令之後,手機會彈出如下對話方塊。

  3. 對希望調試的程式碼設定斷點,然後附著到應用所在進程即可,如圖。

    修改2.jpg

應用運行後調試

  • 使用情境

    在觸發某個事件之後進行調試,比如單擊某個按鈕或者跳轉某個頁面才需要調試。

  • 操作步驟

    在應用運行後,單擊附著進程(process)按鈕,或者在執行上述命令後,再單擊附著按鈕開始調試。

在 mPaaS Portal/Bundle 工程中使用 MultiDex 的注意事項

Portal 和 Bundle 不建議介入 MultiDex,除非您是單 portal 工程,需要使用multiDexEnabled true。如果您的 Bundle 過大,目前只能使用拆分 bundle 的方式進行,不要在 bundle 中開啟 multidex 支援。

如何清除 Gradle 緩衝

開啟 Gradle 外掛程式的設定介面,單擊 Clean Cache 按鈕,即可刪除 Gradle 外掛程式的所有快取資料。

外掛程式設定介面

如何升級到最新的 Gradle 外掛程式

說明

本節內容只適用於 10.1.68 系列基準。更多關於該版本基準的資訊,請參見 基準簡介10.1.68 系列基準發布說明

目前 Google 官方提供的 Android Gradle Plugin 是 3.5.x 版本。

mPaaS 也提供了 3.5.x 版本的外掛程式作為適配,可支援 Google Android Gradle Plugin 3.5.3 和 Gradle 6.2 的 API。

引入方式的變化

  1. 您只需要通過添加以下依賴來引入我們的外掛程式,不需要引入 Android Gradle Plugin 官方外掛程式,因為依賴傳遞的關係,會自動引入。

    dependencies {
    classpath 'com.alipay.android:android-gradle-plugin:3.5.18'
    }
  2. Gradle Wrapper 的版本需要升級到 5.6 以上,推薦使用 6.2。

使用方式的變化

  • 不再需要使用 apply plugin:'com.android.application'

    • 如果您是 portal 工程,僅需要使用 apply plugin:'com.alipay.portal'

    • 如果您是 bundle 工程,需要刪除 apply plugin:'com.android.application', 僅需要使用 apply plugin:'com.alipay.bundle'

    • 如果您是 library 工程,需要刪除 apply plugin:'com.alipay.library', 僅需要使用 apply plugin:'com.android.library

  • 如果使用最新穩定版本 Android Studio 3.5 或以上,那麼您需要在 gradle.properties 裡面新增 android.buildOnlyTargetAbi=false

  • 由於我們的無線保鏢組件暫不支援 V2 簽名,如果您需要使用 Android Studio 調試並安裝您的 APK,那麼您需要禁用 V2 簽名;如果您使用命令列進行構建,且您的 minSdkVersion 大於等於 24,則您也需要禁用 V2 簽名。禁用 V2 簽名的方式如下:

    v2SigningEnabled false

重要

清除緩衝後需觀察確認小程式和 H5 能否正常工作。

在華為 EMUI 10 系統中 input file 標籤無法開啟相機

由於華為10 系統 URI 的實現和標準 Android 存在部分差異,因此,在華為 10 上可能存在無法開啟攝像機的問題。您需要執行以下操作以解決這個問題。

1. 升級基準

  • 如果您採用的是 32 系列基準,則需要升級至 10.1.32.18 及以上。

  • 如果您採用的是 60 系列基準,則需要升級至 10.1.60.9 及以上。

  • 如果您採用的是 68 系列基準,則需要升級至 10.1.68-beta.3 及以上。

2. 配置 FileProvider

您可以複用您現有的 FileProvider,也可以建立一個 FileProvider。

  1. 建立 Java 類,繼承 FileProvider。

    import android.support.v4.content.FileProvider;
    public class NebulaDemoFileProvider extends FileProvider {
    }
  2. 在 res/xml 中建立 nebula_fileprovider_path.xml。

    <?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
     <external-path name="external" path="."/>
    </paths>
  3. 在 AndroidManifest 中加入配置。

    <provider
     android:name="com.mpaas.demo.nebula.NebulaDemoFileProvider"
     android:authorities="com.mpaas.demo.nebula.provider"
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
         android:name="android.support.FILE_PROVIDER_PATHS"
         android:resource="@xml/nebula_fileprovider_path" />
    </provider>
    說明

    此處 android:authorities 的值 com.mpaas.demo.nebula.provider 為 mPaaS 的程式碼範例資訊,您需要根據自己的應用進行設定,並且不能設定為 com.mpaas.demo.nebula.provider,以免與其他 mPaaS 應用產生衝突。

3. 實現 H5NebulaFileProvider

  1. 建立 Java 類,實現 H5NebulaFileProvider,實現 getUriForFile 方法,在該方法中,調用上面實現的 FileProvider 產生 URI。

    public class H5NebulaFileProviderImpl implements H5NebulaFileProvider {
     private static final String TAG = "H5FileProviderImpl";
    
     @Override
     public Uri getUriForFile(File file) {
         try {
             return getUriForFileImpl(file);
         } catch (Exception e) {
             H5Log.e(TAG, e);
         }
         return null;
     }
    
     private static Uri getUriForFileImpl(File file) {
         Uri fileUri = null;
         if (Build.VERSION.SDK_INT >= 24) {
             fileUri = NebulaDemoFileProvider.getUriForFile(LauncherApplicationAgent.getInstance().getApplicationContext(), "com.mpaas.demo.nebula.provider", file);
         } else {
             fileUri = Uri.fromFile(file);
         }
         return fileUri;
     }
    }
  2. 註冊 H5NebulaFileProvider。 在 mPaaS 初始化完成之後,啟動離線包之前,對 H5NebulaFileProvider 進行註冊,註冊一次即可全域生效。

    H5Utils.setProvider(H5NebulaFileProvider.class.getName(), new H5NebulaFileProviderImpl());

如何在 Library 中使用/依賴 mPaaS

在使用 mPaaS 架構過程中,有時需要複用模組。複用時需要按照使用 Module 依賴的方式添加模組。本文以複用 mPaaS 掃碼組件的 Module 為例進行說明。

前提條件

已按照原生 AAR 接入方式將工程接入 mPaaS。

操作步驟

  1. 在 Android 工程中建立 Android Library 類型的模組 scan

  2. 在新建立的 scan 模組的 build.gradle 檔案中添加 api platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")。樣本如下:

     dependencies {
         ……
         //moudle 裡使用 mPaaS 組件功能時,必須添加。
         api platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")
    
         ……
      }
  3. 通過 Android Studio mPaaS 外掛程式為 scan 模組安裝掃碼組件。具體菜單路徑為:mPaaS > 原生 AAR 接入 > 配置/更新群組件 > 開始配置。安裝後,掃碼組件會自動載入。

  4. 配置 App 主工程。

     plugins {
         id 'com.android.application'
    
         ......    
         //必須在 app 下的 build.gradle 檔案中添加 baseline.config(基準)。
         id 'com.alipay.apollo.baseline.config'
     }
  5. 調用組件模組。在使用掃碼組件的地方,匯入 scan 模組。

     dependencies {
         api platform("com.mpaas.android:$mpaas_artifact:$mpaas_baseline")
    
         ....
         api project(':scan')//掃碼組件
     }

如何解決運行時出現的 608 錯誤或 libsgmain 的 native 錯誤

在運行時如果發生異常,在 Android Studio 作業記錄中搜尋索引鍵 SecExcetpion,發現有 608 錯誤碼或 libsgmain 的 native 錯誤,可以按照以下步驟進行排查。

  1. 檢查是否存在 res/drawable/yw_1222.jpg 檔案。

    • 檢查 config 設定檔中是否有 Base64。

    • 檢查 Gradle 外掛程式 baseline.update 或者 baseline.config 是否有應用。2

  2. 檢查 META-INF 是否有 CERT.SF、MANIFEST.MF、和 CERT.RSA 等三個檔案.

  • app/build.gradle 開啟 v1SignEnabled

  • 專案根目錄下的 build.gradle 中是否有 apply plugin: 'com.alipay.apollo.optimize'3

執行以上檢查步驟後,且確認結果檢查無誤,則說明在控制台上傳的簽過名的 APK 包有問題,如簽名錯誤,需重新上傳 APK 包。