基础配置以及常见错误
目前版本的Android Studio 3.6.3/4.0/4.1/4.2使用最新的Robolectric-4.5.1,只能配合Powermock-1.6.6,不能高于这个版本PowerMock, 尽管软件源中的版本已经更新升级到2.0.7版本了,但是Robolectric并没有及时更新依赖。尝试过使用最新版本的PowerMock,结果很多莫名的报错。
build.gradle
Vim
// 单元测试
testImplementation "com.android.support.test:runner:1.0.2"
testImplementation "junit:junit:4.13"
testImplementation "org.robolectric:robolectric:4.5.1"
// 注意AndroidX环境下,不能引入shadows-supportv4,Jetifier转换的时候报错
testImplementation "org.robolectric:shadows-supportv4:4.5.1"
// MultiDex支持
testImplementation "org.robolectric:shadows-multidex:4.5.1"
// 此处版本更新需要特别小心,目前 robolectric 跟 powermock 存在兼容问题,
// 需要固定的某些版本才能正常配合
// 依赖关系参考
// https://github.com/robolectric/robolectric/wiki/Using-PowerMock
testImplementation "org.powermock:powermock-module-junit4:1.6.6"
testImplementation "org.powermock:powermock-module-junit4-rule:1.6.6"
testImplementation "org.powermock:powermock-classloading-xstream:1.6.6"
testImplementation "org.powermock:powermock-api-mockito:1.6.6"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//单元测试
testImplementation"com.android.support.test:runner:1.0.2"
testImplementation"junit:junit:4.13"
testImplementation"org.robolectric:robolectric:4.5.1"
//注意AndroidX环境下,不能引入shadows-supportv4,Jetifier转换的时候报错
testImplementation"org.robolectric:shadows-supportv4:4.5.1"
//MultiDex支持
testImplementation"org.robolectric:shadows-multidex:4.5.1"
//此处版本更新需要特别小心,目前robolectric跟powermock存在兼容问题,
//需要固定的某些版本才能正常配合
//依赖关系参考
//https://github.com/robolectric/robolectric/wiki/Using-PowerMock
testImplementation"org.powermock:powermock-module-junit4:1.6.6"
testImplementation"org.powermock:powermock-module-junit4-rule:1.6.6"
testImplementation"org.powermock:powermock-classloading-xstream:1.6.6"
testImplementation"org.powermock:powermock-api-mockito:1.6.6"
如果 Windows 系统下出现如下提示,受限于Windows系统路径不能超过260个字符的限制
13:36 Error running 'xxxTest': Command line is too long. Shorten command line for xxxTest or also for Android JUnit default configuration.
1
13:36Errorrunning'xxxTest':Commandlineistoolong.ShortencommandlineforxxxTestoralsoforAndroidJUnitdefaultconfiguration.
在项目/.idea/workspace.xml文件中添加一行代码如下
/.idea/workspace.xml
XHTML
...
1
2
3
4
...
对于使用MultiDex的应用,如果报告如下错误:
java.lang.RuntimeException: MultiDex installation failed (/var/folders/h6/4__l0pyn32j1mkkysynnxydr0000gn/T/robolectric-Method_xxxxxxxxxxxx_isCorrect4035485067136008322/com.xxxx.xxxx.app-sourceDir (Is a directory)).
at android.support.multidex.MultiDex.install(MultiDex.java:121)
at com.xxx.xx.app.xx.application.xxxxxx.attachBaseContext(MyApplication.java:212)
at android.app.Application.attach(Application.java:212)
at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:283)
at org.robolectric.shadows.ShadowApplication.callAttach(ShadowApplication.java:79)
at org.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:250)
at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:169)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:301)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:243)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
java.lang.RuntimeException:MultiDexinstallationfailed(/var/folders/h6/4__l0pyn32j1mkkysynnxydr0000gn/T/robolectric-Method_xxxxxxxxxxxx_isCorrect4035485067136008322/com.xxxx.xxxx.app-sourceDir(Isadirectory)).
atandroid.support.multidex.MultiDex.install(MultiDex.java:121)
atcom.xxx.xx.app.xx.application.xxxxxx.attachBaseContext(MyApplication.java:212)
atandroid.app.Application.attach(Application.java:212)
atorg.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:283)
atorg.robolectric.shadows.ShadowApplication.callAttach(ShadowApplication.java:79)
atorg.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:250)
atorg.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:169)
atorg.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:301)
atorg.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:243)
atorg.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
atjava.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
atjava.util.concurrent.FutureTask.run(FutureTask.java)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
atjava.lang.Thread.run(Thread.java:748)
需要在build.gradle中引入
build.gradle
Vim
// MultiDex支持
testImplementation "org.robolectric:shadows-multidex:4.5.1"
1
2
3
//MultiDex支持
testImplementation"org.robolectric:shadows-multidex:4.5.1"
例子测试代码:
ExampleUnitTest.java
Java
package com.mobibrw.example;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.multidex.ShadowMultiDex;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see Testing documentation
*/
@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore("jdk.internal.reflect.*")
@Config(shadows = ShadowMultiDex.class)
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
packagecom.mobibrw.example;
importorg.junit.Test;
importstaticorg.junit.Assert.*;
importorg.junit.runner.RunWith;
importorg.robolectric.RobolectricTestRunner;
importorg.robolectric.annotation.Config;
importorg.robolectric.shadows.multidex.ShadowMultiDex;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see Testing documentation
*/
@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore("jdk.internal.reflect.*")
@Config(shadows=ShadowMultiDex.class)
publicclassExampleUnitTest{
@Test
publicvoidaddition_isCorrect(){
assertEquals(4,2+2);
}
}
注意,需要
@Config(shadows = ShadowMultiDex.class)
1
@Config(shadows=ShadowMultiDex.class)
才能使得配置生效。
如果发生如下错误:
java.lang.VerifyError: Expecting a stackmap frame at branch target 43
Exception Details:
Location:
com/meizu/cloud/pushsdk/base/IntentReceiver.onReceive(Landroid/content/Context;Landroid/content/Intent;)V @6: ifne
Reason:
Expected stackmap frame at this location.
Bytecode:
0x0000000: b200 08b6 0013 9a00 25bb 0004 5912 0110
0x0000010: 0ab7 000e 59b3 000a b600 10bb 0003 59b2
0x0000020: 000a b600 0fb7 000c b300 09b2 0009 bb00
0x0000030: 0659 2a2b 2cb7 0011 b600 0d57 b1
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
at java.lang.Class.getConstructor0(Class.java:3075)
at java.lang.Class.getDeclaredConstructor(Class.java:2178)
at org.robolectric.util.ReflectionHelpers.callConstructor(ReflectionHelpers.java:396)
at org.robolectric.internal.bytecode.ShadowImpl.newInstanceOf(ShadowImpl.java:18)
at org.robolectric.shadow.api.Shadow.newInstanceOf(Shadow.java:35)
at org.robolectric.android.internal.AndroidTestEnvironment.registerBroadcastReceivers(AndroidTestEnvironment.java:541)
at org.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:265)
at org.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:169)
at org.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:301)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:243)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
java.lang.VerifyError:Expectingastackmapframeatbranchtarget43
ExceptionDetails:
Location:
com/meizu/cloud/pushsdk/base/IntentReceiver.onReceive(Landroid/content/Context;Landroid/content/Intent;)V@6:ifne
Reason:
Expectedstackmapframeatthislocation.
Bytecode:
0x0000000:b20008b600139a0025bb000459120110
0x0000010:0ab7000e59b3000ab60010bb000359b2
0x0000020:000ab6000fb7000cb30009b20009bb00
0x0000030:06592a2b2cb70011b6000d57b1
atjava.lang.Class.getDeclaredConstructors0(NativeMethod)
atjava.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
atjava.lang.Class.getConstructor0(Class.java:3075)
atjava.lang.Class.getDeclaredConstructor(Class.java:2178)
atorg.robolectric.util.ReflectionHelpers.callConstructor(ReflectionHelpers.java:396)
atorg.robolectric.internal.bytecode.ShadowImpl.newInstanceOf(ShadowImpl.java:18)
atorg.robolectric.shadow.api.Shadow.newInstanceOf(Shadow.java:35)
atorg.robolectric.android.internal.AndroidTestEnvironment.registerBroadcastReceivers(AndroidTestEnvironment.java:541)
atorg.robolectric.android.internal.AndroidTestEnvironment.installAndCreateApplication(AndroidTestEnvironment.java:265)
atorg.robolectric.android.internal.AndroidTestEnvironment.setUpApplicationState(AndroidTestEnvironment.java:169)
atorg.robolectric.RobolectricTestRunner.beforeTest(RobolectricTestRunner.java:301)
atorg.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$0(SandboxTestRunner.java:243)
atorg.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:89)
atjava.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
atjava.util.concurrent.FutureTask.run(FutureTask.java)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
atjava.lang.Thread.run(Thread.java:748)
JDK 1.7引入了代码校验,这个我们需要关闭这个功能才行,如下图:
可惜的是, 目前如果需要在Android Studio中运行或者测试单个测试用例,需要每个测试文件单独添加才行。
对于使用
$ bash gradlew test
1
$bashgradlewtest
运行测试的情况来说,需要在项目app/build.gradle下添加如下内容:
build.gradle
Vim
android {
...............................
testOptions {
unitTests.all { jvmArgs '-noverify' }
}
...............................
}
1
2
3
4
5
6
7
android{
...............................
testOptions{
unitTests.all{jvmArgs'-noverify'}
}
...............................
}
也可以添加到defaultConfig下面,如下:
build.gradle
Vim
android {
...............................
defaultConfig {
.....................
testOptions {
unitTests.all { jvmArgs '-noverify' }
}
.....................
}
...............................
}
1
2
3
4
5
6
7
8
9
10
11
android{
...............................
defaultConfig{
.....................
testOptions{
unitTests.all{jvmArgs'-noverify'}
}
.....................
}
...............................
}
这个问题更详细的解释如下:
Java 7引入了更严格的验证,并稍微改变了类格式 - 以包含用于验证代码是否正确的堆栈映射。您看到的异常意味着某些方法没有有效的堆栈映射。
Java版本或字节码工具都可能是责任。通常这意味着应用程序使用的库生成的节码不能通过更严格的验证。因此,可以将其作为一个错误报告给库的开发者。
作为解决方法,您可以添加-noverify到JVM参数以禁用验证。
在Java 7中,还可以通过添加 -XX:-UseSplitVerifier 使用较不严格的验证方法,但在Java 8中删除了该选项(-XX:-UseSplitVerifier)。
很大的可能是第三方库是低版本的JDK编译的,然后在高版本的JDK版本中使用。
1
2
3
4
5
6
7
8
9
Java7引入了更严格的验证,并稍微改变了类格式-以包含用于验证代码是否正确的堆栈映射。您看到的异常意味着某些方法没有有效的堆栈映射。
Java版本或字节码工具都可能是责任。通常这意味着应用程序使用的库生成的节码不能通过更严格的验证。因此,可以将其作为一个错误报告给库的开发者。
作为解决方法,您可以添加-noverify到JVM参数以禁用验证。
在Java7中,还可以通过添加-XX:-UseSplitVerifier使用较不严格的验证方法,但在Java8中删除了该选项(-XX:-UseSplitVerifier)。
很大的可能是第三方库是低版本的JDK编译的,然后在高版本的JDK版本中使用。
脚本中运行全部单元测试:
$ bash gradlew test
1
$bashgradlewtest
打包编译发行版本:
$ bash gradlew clean assembleRelease
1
$bashgradlewcleanassembleRelease
最后,编译执行的JDK的版本一般建议跟Android Studio使用的JDK一致,完全可以使用Android Studio自带的JDK进行编译。
$ echo "export JAVA_HOME='/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home'" >> ~/.bashrc
$ source ~/.bashrc
# 由于macOS Catalina 10.15.6已经切换到zsh了,因此需要配置zsh的配置文件
$ echo "export JAVA_HOME='/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home'" >> ~/.zprofile
$ source ~/.zprofile
1
2
3
4
5
6
7
8
$echo"export JAVA_HOME='/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home'">>~/.bashrc
$source~/.bashrc
# 由于macOS Catalina 10.15.6已经切换到zsh了,因此需要配置zsh的配置文件
$echo"export JAVA_HOME='/Applications/Android Studio.app/Contents/jre/jdk/Contents/Home'">>~/.zprofile
$source~/.zprofile
当前建议的版本
Android Studio 4.0/4.1 JDK Version
Shell
$ java -version
openjdk version "1.8.0_242-release"
OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
OpenJDK 64-Bit Server VM (build 25.242-b3-6222593, mixed mode)
1
2
3
4
$java-version
openjdkversion"1.8.0_242-release"
OpenJDKRuntimeEnvironment(build1.8.0_242-release-1644-b3-6222593)
OpenJDK64-BitServerVM(build25.242-b3-6222593,mixedmode)
目前,暂时不建议在生产环境中使用Android Studio 4.2发布版本,目前测试发现Android Studio 4.2编译出的代码,在华为系列手机上存在问题,主要是崩溃问题。可能出现如下崩溃日志:
A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
A/DEBUG: Build fingerprint: 'HONOR/BMH-AN10/HWBMH:10/HUAWEIBMH-AN10/11.0.0.168C00:user/release-keys'
A/DEBUG: Revision: '0'
A/DEBUG: ABI: 'arm64'
A/DEBUG: SYSVMTYPE: Maple
APPVMTYPE: Art
A/DEBUG: Timestamp: 2021-05-10 17:32:02+0800
A/DEBUG: pid: 25826, tid: 25843, name: HeapTaskDaemon >>> com.xx.xxx <<<
A/DEBUG: uid: 10587
A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x10
A/DEBUG: Cause: null pointer dereference
A/DEBUG: x0 00000079388b9200 x1 000000792cc8ea98 x2 0000000000000008 x3 000000007145cdf0
A/DEBUG: x4 0000000000000474 x5 000000001339122c x6 12ec18c812ec2148 x7 0000000071485dd0
A/DEBUG: x8 0000000000000000 x9 89793691a5863ce4 x10 0000000052c00000 x11 0000000000000008
A/DEBUG: x12 000000000000000b x13 000009ec00000079 x14 0005ffb86a66d4d9 x15 00000aff3f1ff8cb
A/DEBUG: x16 00000079387f9e38 x17 00000079ba841b40 x18 00000078d47be000 x19 000000792cc8ea98
A/DEBUG: x20 000000007145cdf0 x21 0000000000000008 x22 0000000071bdb820 x23 0000000071bd9f98
A/DEBUG: x24 0000000000000028 x25 0000000000002a30 x26 000000792cc90020 x27 0000000000001888
A/DEBUG: x28 0000000071bd9fb0 x29 000000792cc8ea80
A/DEBUG: sp 000000792cc8ea10 lr 0000007938432790 pc 000000793843276c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
A/DEBUG:************************************************
A/DEBUG:Buildfingerprint:'HONOR/BMH-AN10/HWBMH:10/HUAWEIBMH-AN10/11.0.0.168C00:user/release-keys'
A/DEBUG:Revision:'0'
A/DEBUG:ABI:'arm64'
A/DEBUG:SYSVMTYPE:Maple
APPVMTYPE:Art
A/DEBUG:Timestamp:2021-05-1017:32:02+0800
A/DEBUG:pid:25826,tid:25843,name:HeapTaskDaemon>>>com.xx.xxx<<<
A/DEBUG:uid:10587
A/DEBUG:signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddr0x10
A/DEBUG:Cause:nullpointerdereference
A/DEBUG:x000000079388b9200x1000000792cc8ea98x20000000000000008x3000000007145cdf0
A/DEBUG:x40000000000000474x5000000001339122cx612ec18c812ec2148x70000000071485dd0
A/DEBUG:x80000000000000000x989793691a5863ce4x100000000052c00000x110000000000000008
A/DEBUG:x12000000000000000bx13000009ec00000079x140005ffb86a66d4d9x1500000aff3f1ff8cb
A/DEBUG:x1600000079387f9e38x1700000079ba841b40x1800000078d47be000x19000000792cc8ea98
A/DEBUG:x20000000007145cdf0x210000000000000008x220000000071bdb820x230000000071bd9f98
A/DEBUG:x240000000000000028x250000000000002a30x26000000792cc90020x270000000000001888
A/DEBUG:x280000000071bd9fb0x29000000792cc8ea80
A/DEBUG:sp000000792cc8ea10lr0000007938432790pc000000793843276c
如果升级到Android Studio 4.2执行测试用例的时候,可能报告如下错误:
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.973 sec <<< FAILURE! - in com.Test
initializationError(com.Test) Time elapsed: 0.007 sec <<< ERROR!
org.objenesis.ObjenesisException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.IllegalAccessError: class jdk.internal.reflect.ConstructorAccessorImpl loaded by org/powermock/core/classloader/MockClassLoader cannot access jdk/internal/reflect superclass jdk.internal.reflect.MagicAccessorImpl
1
2
3
4
5
Testsrun:1,Failures:0,Errors:1,Skipped:0,Timeelapsed:0.973sec<<
initializationError(com.Test)Timeelapsed:0.007sec<<
org.objenesis.ObjenesisException:java.lang.reflect.InvocationTargetException
Causedby:java.lang.reflect.InvocationTargetException
Causedby:java.lang.IllegalAccessError:classjdk.internal.reflect.ConstructorAccessorImplloadedbyorg/powermock/core/classloader/MockClassLoadercannotaccessjdk/internal/reflectsuperclassjdk.internal.reflect.MagicAccessorImpl
这个问题是由于Android Studio 4.2自带的JDK版本已经升级到了Java 11.0.8版本,跟PowerMock不兼容。
解决此问题的方式是在测试用例的忽略列表中增加:
@PowerMockIgnore("jdk.internal.reflect.*")
1
@PowerMockIgnore("jdk.internal.reflect.*")
另外,在Android Studio 4.2使用Robolectric-4.5.1以下的版本(比如Robolectric-4.3.1)执行测试用例的时候,可能报告如下错误信息:
[Robolectric] : sdk=28; resources=BINARY
Downloading from maven
Downloading: org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pom from repository sonatype at https://oss.sonatype.org/content/groups/public/
Error transferring file: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
[WARNING] Unable to get resource 'org.robolectric:android-all:pom:10-robolectric-5803371' from repository sonatype (https://oss.sonatype.org/content/groups/public/): Error transferring file: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
Downloading: org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pom from repository central at http://repo1.maven.org/maven2
Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pom
[WARNING] Unable to get resource 'org.robolectric:android-all:pom:10-robolectric-5803371' from repository central (http://repo1.maven.org/maven2): Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pom
Downloading: org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jar from repository sonatype at https://oss.sonatype.org/content/groups/public/
Error transferring file: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
[WARNING] Unable to get resource 'org.robolectric:android-all:jar:10-robolectric-5803371' from repository sonatype (https://oss.sonatype.org/content/groups/public/): Error transferring file: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
Downloading: org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jar from repository central at http://repo1.maven.org/maven2
Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jar
[WARNING] Unable to get resource 'org.robolectric:android-all:jar:10-robolectric-5803371' from repository central (http://repo1.maven.org/maven2): Error transferring file: Server returned HTTP response code: 501 for URL: http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Robolectric]:sdk=28;resources=BINARY
Downloadingfrommaven
Downloading:org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pomfromrepositorysonatypeathttps://oss.sonatype.org/content/groups/public/
Errortransferringfile:java.security.NoSuchAlgorithmException:Errorconstructingimplementation(algorithm:Default,provider:SunJSSE,class:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
[WARNING]Unabletogetresource'org.robolectric:android-all:pom:10-robolectric-5803371'fromrepositorysonatype(https://oss.sonatype.org/content/groups/public/):Errortransferringfile:java.security.NoSuchAlgorithmException:Errorconstructingimplementation(algorithm:Default,provider:SunJSSE,class:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
Downloading:org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pomfromrepositorycentralathttp://repo1.maven.org/maven2
Errortransferringfile:ServerreturnedHTTPresponsecode:501forURL:http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pom
[WARNING]Unabletogetresource'org.robolectric:android-all:pom:10-robolectric-5803371'fromrepositorycentral(http://repo1.maven.org/maven2):Errortransferringfile:ServerreturnedHTTPresponsecode:501forURL:http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.pom
Downloading:org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jarfromrepositorysonatypeathttps://oss.sonatype.org/content/groups/public/
Errortransferringfile:java.security.NoSuchAlgorithmException:Errorconstructingimplementation(algorithm:Default,provider:SunJSSE,class:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
[WARNING]Unabletogetresource'org.robolectric:android-all:jar:10-robolectric-5803371'fromrepositorysonatype(https://oss.sonatype.org/content/groups/public/):Errortransferringfile:java.security.NoSuchAlgorithmException:Errorconstructingimplementation(algorithm:Default,provider:SunJSSE,class:sun.security.ssl.SSLContextImpl$DefaultSSLContext)
Downloading:org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jarfromrepositorycentralathttp://repo1.maven.org/maven2
Errortransferringfile:ServerreturnedHTTPresponsecode:501forURL:http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jar
[WARNING]Unabletogetresource'org.robolectric:android-all:jar:10-robolectric-5803371'fromrepositorycentral(http://repo1.maven.org/maven2):Errortransferringfile:ServerreturnedHTTPresponsecode:501forURL:http://repo1.maven.org/maven2/org/robolectric/android-all/10-robolectric-5803371/android-all-10-robolectric-5803371.jar
这个问题是由于Android Studio 4.2自带的JDK版本已经升级到了Java 11.0.8版本,当Robolectric去服务器下载依赖包的时候,默认使用HTTP地址。当服务器强制要求重定向到HTTPS地址,这部分代码处理存在问题。
解决这个问题的方法就是升级到 Robolectric-4.5.1以及以上的版本即可。
参考链接