全部产品
云市场
云游戏

常见问题

更新时间:2020-08-06 11:07:20

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

编译时无网络连接

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

  1. 确认已连接到互联网。
  2. 确认未连接网络代理,包括浏览器代理设置、第三方网络代理软件等。
  3. 确认未设置 IDE 代理。
    idea 代理
  4. 在 gradle.properties 文件中,确认未设置 Gradle 代理,即未设置 systemProp.http.proxyHostsystemProp.http.proxyPort 属性。如果有设置,删除相关属性即可。
    gradle代理

程序编译失败

如果程序编译失败,可通过以下步骤进行排错与解决。

  1. 根据 上文步骤,确认编译环境网络已正常连接。
  2. 检查 Gradle 执行记录,确认新增的依赖有效。
  3. 检查依赖的 GAV(group, artifact, version)参数设置正确。
    1. //引用 debug 包group:artifact:version:raw@jar
    2. bundle "com.app.xxxxx.xxxx:test-build:1.0-SNAPSHOT:raw@jar"
    3. //引用 release 包group:artifact:version@jar
    4. bundle "com.app.xxxxx.xxxx:test-build:1.0-SNAPSHOT@jar"
    5. manifest "com.app.xxxxx.xxxx:test-build:1.0-SNAPSHOT:AndroidManifest@xml"
  4. 在系统自带的命令行工具中,执行以下命令,导出 Gradle 执行记录:
    1. // 执行命令前,确认未定义 productflavor 属性。否则,命令会运行失败。
    2. // 以下命令将执行记录导出至 log.txt 文件中。
    3. gradle buildDebug --info --debug -Plog=true > log.txt
  5. 查看步骤 4 中导出的记录文件,在最新生成的记录中,会看到类似如下记录,表示新增的依赖不存在。
    1. 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).
    2. Searched in the following locations:
    3. 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
    4. at org.gradle.internal.resolve.result.DefaultBuildableArtifactResolveResult.notFound(DefaultBuildableArtifactResolveResult.java:38)
    5. at org.gradle.api.internal.artifacts.ivyservice.ivyresolve.CachingModuleComponentRepository$LocateInCacheRepositoryAccess.resolveArtifactFromCache(CachingModuleComponentRepository.java:260)

  6. 访问该记录中的 http 链接(如上一步所列记录中的第 3 行)并登录,查看 Maven 仓库。

    说明:您可以在 build.gradle 文件中查看登录时需要提供的账户名和密码。

  7. 执行以下命令刷新 gradle 缓存。
    1. gradle clean --refresh-dependencies
  8. 如果 Maven 仓库有对应依赖,删除个人目录下 Gradle 缓存,然后重新编译。

    说明:删除 Gradle 缓存的方法如下。

    • 在 MacOS、Linux、Unix 等系统中,运行以下命令:
      1. cd ~
      2. cd .gradle
      3. cd caches
      4. rm -rf modules-2
    • 在 Windows 系统中,默认情况下,路径定位到 C:\Users\\{用户名}\\.gradle\caches,删除 modules-2 文件夹。

编译过程中出现卡顿

如果编译过程卡顿(等待超过 20 分钟),您可以通过以下步骤提高编译效率。

  1. 根据 上文步骤,确认编译环境网络已正常连接。
  2. 确认防火墙已关闭。
  3. 确认未开启 IntelliJ IDEA 编译器的网络配置。
  4. 在代码中,提前加载 Maven 镜像。例如,以下是阿里云加载 Maven 镜像的代码。
  1. apply plugin: 'maven'
  2. buildscript {
  3. repositories {
  4. mavenLocal()
  5. // 开始先加载 Maven 镜像
  6. maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
  7. maven {
  8. credentials {
  9. username "请使用已知用户"
  10. password "请使用已知密码"
  11. }
  12. url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
  13. }
  14. }
  15. dependencies {
  16. classpath 'com.android.tools.build:gradle:2.1.3'
  17. classpath 'com.alipay.android:android-gradle-plugin:2.1.3.3.3'
  18. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  19. }
  20. }
  21. allprojects {
  22. repositories {
  23. flatDir {
  24. dirs 'libs'
  25. }
  26. mavenLocal()
  27. maven {
  28. credentials {
  29. username "xxxxxxxxx"
  30. password "xxxxxxx"
  31. }
  32. url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
  33. }
  34. maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
  35. }
  36. }

进行专有云接入时,下载配置、接入 mPaaS 后,编译不通过,出现 NullPointerException

空指针异常一般都是配置文件(conf 文件)的问题,需要对字段进行检查。检查 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. 对希望调试的代码行设置断点,然后附着到应用所在进程即可,如图。

    img img

应用运行后调试

  • 使用场景

    在触发某个事件之后进行调试,比如点击某个按钮或者跳转某个页面才需要调试。

  • 操作步骤

    在应用运行后,点击附着进程(process)按钮,或者在执行上述命令后,再点击附着按钮开始调试。

mPaaS Inside 工程使用 MultiDex 的注意事项

  1. 接入 mPaaS Inside 的时候,我们已经提供了 MultiDex,因此您可以把官方提供的 MultiDex 从 implementation 中删除。

    1. dependencies{
    2. implementation 'com.android.support:multidex:1.0.3' //删除此行
    3. }

    同时,建议您在 gradle 中的 android 这个模块下,把 multiDexEnabled true 加上。

    1. android {
    2. defaultConfig {
    3. multiDexEnabled true
    4. }
    5. }
  2. 如果您使用了 mPaaS Inside,同时不接入热修复,并且您需要 MultiDex 支持的话,您依旧要在Application中调用MultiDex.install(this)

    1. public class App extends Application() {
    2. public void attachBaseContext(Context context) {
    3. super.attachBaseContext(context);
    4. MultiDex.install(this);
    5. }
    6. }
  3. 如果您使用了热修复,也就是使用了 QuinoxlessApplication,您不需要在代码中显式调用。

MultiDex 是为了解决 Android 5.0 以下 Dex 方法的数量或者类的数量超过 65535 这个问题的方案。

在当前应用功能膨胀的情况下,我们需要对 Dex 做一些规划。

由于 mPaaS 接入方式是基于 bundle。在打包的时候,bundle 会尝试和用户的 Dex 做一次合并,但 mPaaS 会优先保证用户的首个 Dex 的顺序。

在这种情况下,为了接入 mPaaS,请您尽量避免在 Application 中添加过多的逻辑,使得第一个 dex 尽可能的小。您可以使用 --main-dex-list 参数指定您在第一个 Dex 中的类。

如果您的 apk 中第一个 Dex 类过多导致 mPaaS 必要的几个 bundle 无法合并的话,可能在 Android 5.0 以下的运行时环境中造成无法启动框架(ClassNotFound 或者 ClassNotDef 等问题)。

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.0 的 API。

引入方式的变化

  1. 您只需要通过添加以下依赖来引入我们的插件,不需要引入 Android Gradle Plugin 官方插件,因为依赖传递的关系,会自动引入。
    1. dependencies {
    2. classpath 'com.alipay.android:android-gradle-plugin:3.5.4'
    3. }
  2. Gradle Wrapper 的版本需要升级到 5.6 以上,推荐使用最新版 6.0.1。

使用方式的变化

  1. 不再需要使用 apply plugin:'com.android.application',如果您是 portal 工程,仅需要使用 apply plugin:'com.alipay.portal'
  2. 如果您是 bundle 工程,也需要删除 apply plugin:'com.android.application', 仅需要使用 apply plugin:'com.alipay.bundle'
  3. library 工程依然使用 apply plugin:'com.android.library'
  4. 如果使用最新稳定版本 Android Studio 3.5 或以上,那么您需要在 gradle.properties 里面新增 android.buildOnlyTargetAbi=false
  5. 由于我们的无线保镖组件暂不支持 V2 签名,如果您需要使用 Android Studio 调试并安装您的 APK,那么您需要禁用 V2 签名;如果您使用命令行进行构建,且您的 minSdkVersion 大于等于 24,则您也需要禁用 V2 签名。禁用 V2 签名的方式如下:

    1. v2SigningEnabled false

其他注意

  1. 强烈推荐配合 inside 模式使用。
  2. 需要多观察确认 nebula metainfo 的问题。

在华为 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。
    1. import android.support.v4.content.FileProvider;
    2. public class NebulaDemoFileProvider extends FileProvider {
    3. }
  2. 在 res/xml 中新建 nebula_fileprovider_path.xml。
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <paths xmlns:android="http://schemas.android.com/apk/res/android">
    3. <external-path name="external" path="."/>
    4. </paths>
  3. 在 AndroidManifest 中加入配置。
    1. <provider
    2. android:name="com.mpaas.demo.nebula.NebulaDemoFileProvider"
    3. android:authorities="com.mpaas.demo.nebula.provider"
    4. android:exported="false"
    5. android:grantUriPermissions="true">
    6. <meta-data
    7. android:name="android.support.FILE_PROVIDER_PATHS"
    8. android:resource="@xml/nebula_fileprovider_path" />
    9. </provider>

3. 实现 H5NebulaFileProvider

  1. 新建 Java 类,实现 H5NebulaFileProvider,实现 getUriForFile 方法,在该方法中,调用上面实现的 FileProvider 生成 URI。

    1. public class H5NebulaFileProviderImpl implements H5NebulaFileProvider {
    2. private static final String TAG = "H5FileProviderImpl";
    3. @Override
    4. public Uri getUriForFile(File file) {
    5. try {
    6. return getUriForFileImpl(file);
    7. } catch (Exception e) {
    8. H5Log.e(TAG, e);
    9. }
    10. return null;
    11. }
    12. private static Uri getUriForFileImpl(File file) {
    13. Uri fileUri = null;
    14. if (Build.VERSION.SDK_INT >= 24) {
    15. fileUri = NebulaDemoFileProvider.getUriForFile(LauncherApplicationAgent.getInstance().getApplicationContext(), "com.mpaas.demo.nebula.provider", file);
    16. } else {
    17. fileUri = Uri.fromFile(file);
    18. }
    19. return fileUri;
    20. }
    21. }
  2. 注册 H5NebulaFileProvider
    在 mPaaS 初始化完成之后,启动离线包之前,对 H5NebulaFileProvider 进行注册,注册一次即可全局生效。
    1. H5Utils.setProvider(H5NebulaFileProvider.class.getName(), new H5NebulaFileProviderImpl());