android - 使用隐藏的api构建Android项目的gradle:在某些构建环境中失败,而在其他构建环境中成功

标签 android gradle

我有一个使用一些隐藏API的android项目(计划在将来但不在现在解决此问题)。

项目的git repo构建的同一主分支是某些构建环境,但是在某些构建环境中,使用隐藏api的代码行会产生编译错误。

我在两种环境中使用的命令是:./gradlew clean assembleRelease
在一种环境中,它构建良好。在另一个环境中,它会给出编译错误,例如:

> Task :myproject:compileReleaseJavaWithJavac FAILED
/home/farrukh/myproject/src/main/java/com/mycompany/myproject/MyClass.java:4: error: cannot find symbol
import android.os.SystemProperties;
                 ^
  symbol:   class SystemProperties
  location: package android.os
/home/farrukh/myproject/src/main/java/com/mycompany/myproject/MyClass.java:82: error: cannot find symbol
            partNumber = SystemProperties.get("ro.boot.partnumber", null);
                         ^
  symbol:   variable SystemProperties
  location: class MyClass
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
2 errors

在这两种情况下,Android SDK均已安装Android 9.0(API 28),但特定的子版本可能有所不同。

在构建失败的环境中,从sdkmanager --list生成以下信息:
Path                 | Version | Description                    | Location             
  -------              | ------- | -------                        | -------              
  build-tools;28.0.3   | 28.0.3  | Android SDK Build-Tools 28.0.3 | build-tools/28.0.3/  
  build-tools;29.0.2   | 29.0.2  | Android SDK Build-Tools 29.0.2 | build-tools/29.0.2/  
  emulator             | 30.0.0  | Android Emulator               | emulator/            
  patcher;v4           | 1       | SDK Patch Applier v4           | patcher/v4/          
  platform-tools       | 29.0.6  | Android SDK Platform-Tools     | platform-tools/      
  platforms;android-18 | 3       | Android SDK Platform 18        | platforms/android-18/
  platforms;android-23 | 3       | Android SDK Platform 23        | platforms/android-23/
  platforms;android-24 | 2       | Android SDK Platform 24        | platforms/android-24/
  platforms;android-26 | 2       | Android SDK Platform 26        | platforms/android-26/
  platforms;android-27 | 3       | Android SDK Platform 27        | platforms/android-27/
  platforms;android-28 | 6       | Android SDK Platform 28        | platforms/android-28/
  platforms;android-29 | 4       | Android SDK Platform 29        | platforms/android-29/
  sources;android-28   | 1       | Sources for Android 28         | sources/android-28/  
  sources;android-29   | 1       | Sources for Android 29         | sources/android-29/  
  tools                | 26.1.1  | Android SDK Tools              | tools/       

它的工作环境是Jenkins构建,而sdkmanager --list显示以下内容:
Installed packages:
  Path                        | Version | Description                    | Location                    
  -------                     | ------- | -------                        | -------                     
  build-tools;27.0.1          | 27.0.1  | Android SDK Build-Tools 27.0.1 | build-tools/27.0.1/         
  build-tools;27.0.2          | 27.0.2  | Android SDK Build-Tools 27.0.2 | build-tools/27.0.2/         
  emulator                    | 29.0.11 | Android Emulator               | emulator/                   
  extras;android;m2repository | 47.0.0  | Android Support Repository     | extras/android/m2repository/
  extras;google;m2repository  | 58      | Google Repository              | extras/google/m2repository/ 
  patcher;v4                  | 1       | SDK Patch Applier v4           | patcher/v4/                 
  platform-tools              | 29.0.1  | Android SDK Platform-Tools     | platform-tools/             
  tools                       | 26.1.1  | Android SDK Tools              | tools/   

知道什么会导致构建行为发生差异吗?

生成工具版本的差异(工作环境的版本为27.0.1,而不工作环境的版本为28.0.3)是否可以引起此差异?

更新:使用上面列出的相同android SDK软件包构建的两个非常相似的jenkins作业产生了相似的不同结果,其中一个可以很好地编译代码,而另一个则无法使用隐藏的api来编译代码。因此,区别不在于SDK软件包版本。在工作环境与非工作环境之间,我还应该寻找什么?

最佳答案

我能够解决我的问题,如下所示:

  • 卸载我的SDK中用于构建工具的所有版本:
  • $ANDROID_HOME/tools/bin/sdkmanager --uninstall "build-tools;28.0.3"
    $ANDROID_HOME/tools/bin/sdkmanager --uninstall "build-tools;29.0.2"
    
  • 然后我安装了构建工具; 27.0.2

  • `$ ANDROID_HOME / tools / bin / sdkmanager --install“build-tools; 27.0.2”
  • 然后我刚刚完成了gradle的构建:./gradlew clean assembleRelease

  • 这自动下载并安装了构建工具; 28.0.3作为我的gradle项目将其指定为targetSdkVersion和compileSdkVersion>,构建成功!

    我相信在上述所有步骤中,删除构建工具; 29.0.2是最重要的部分。怀疑版本的构建工具会添加其他讨厌的检查,以使编译失败。

    注意:我必须切换到JDK 8才能运行sdkmanager

    关于android - 使用隐藏的api构建Android项目的gradle:在某些构建环境中失败,而在其他构建环境中成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60419181/

    相关文章:

    android - 运行一个安卓项目

    java - Android 用两根手指点击 MapView

    java - Android 应用程序因 Fragment 中的 OnClickListener 崩溃

    android - 如何制作测试列表并只运行它们?

    java - 无法构建gradle项目:无效的类型代码:使用Java 11的B3

    java - 无法合并Dex

    java - 从Maven生成类似Gradle的测试报告

    android - 为什么 Android ScrollView 在它的 child 的高度小于屏幕时调用 onScrollChanged()?

    java - SQL rawQuery 如果包含

    Gradle:在调用根任务时排除触发子项目任务