我有一个使用一些隐藏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软件包版本。在工作环境与非工作环境之间,我还应该寻找什么?
最佳答案
我能够解决我的问题,如下所示:
$ANDROID_HOME/tools/bin/sdkmanager --uninstall "build-tools;28.0.3"
$ANDROID_HOME/tools/bin/sdkmanager --uninstall "build-tools;29.0.2"
`$ ANDROID_HOME / tools / bin / sdkmanager --install“build-tools; 27.0.2”
./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/