文档

常见问题

更新时间:

查看以下常见问题列表,单击具体的问题即可查看相应解答。

编译时无网络连接

在编译文件时,如果没有网络,很有可能造成编译失败。通过以下步骤,确认编译环境的网络已连接。

  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

空指针异常在接入专有云时,下载配置文件并接入 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 包。

  • 本页导读 (0)
文档反馈