之前一直没搞定的,编译android时总是卡在gradle.pom文件的下载上,直接用地址下是没有问题的 ,但是Android Studio里一直卡在这里。终于找到一种靠谱的解决方案,来自知乎,记录一下。
#systemProp.socks.proxyHost=127.0.0.1 #systemProp.socks.proxyPort=1086 #systemProp.https.proxyHost=127.0.0.1 #systemProp.https.proxyPort=1086 #systemProp.https.proxyHost=socks5://127.0.0.1 #systemProp.https.proxyPort=1086
正确设置方法应该是这样:
org.gradle.jvmargs=-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1086
修改 $HOME/.gradle/gradle.properties 文件,加入上面那句,这样就可以全局开启 gradle 代理。
顺带记录一下后续遇到的问题,升级AS到3.5.1,手机是API28的版本,原先的程序会遇到闪退问题,查到说需要迁移到Android X上。
-
采用最低4.6的gradle-all.zip
-
去掉AndroidMainfest中的最低版本“android:minSdkVersion=xxx”
-
Annotation processors must be explicitly declared now. butterknife-7.0.1.jar
annotationProcessor 'com.jakewharton:butterknife:7.0.1'
https://developer.android.com/studio/build/dependencies?utm_source=android-studio#annotation_processor
-
错误: 找不到符号 符号: 变量 MATRIX_SAVE_FLAG 位置: 类 Canvas
解决办法:直接调
canvas.save();
google在android P中删除了canvas.save(int);
方法 -
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/params/BasicHttpParams;
https://developers.google.com/maps/documentation/android-sdk/config#specify_requirement_for_apache_http_legacy_library
1
2
3<uses-library android:name="org.apache.http.legacy" android:required="false" />
-
Andorid API 28 (android 9.0)后不能加载http的url,报错net : err_cleartext_not_permitted
在manifest 中application节点添加
1
android:usesCleartextTraffic="true"
-
Fragment not attached to a context错误导致通过getResources().getString()获取字符串的错误
解决方案:我们的代码里,基类的fragment是在onCreate()方法中初始化对话框时候通过getActivity()获取到了context,所以子类中之要在super.onCreate()方法之后调用getResources()就没有问题了。之所以报错是由于,有几个变量的初始化写在了类中,这样这些变量的初始化会先于onCreate()方法被执行,此时如果想通过getResources()来获取context是会造成空指针异常的。
解决的思想就是,调用getResources()之前,保证context已经可以获取到就可以了,当然更好的习惯是加上try catch,这样即使空指针也不会引起app闪退。
以下是因为有个按钮变的贼丑,所以用旧版本的AS 3.0.1打开试试遇到的问题。
-
Error:No such property: GradleVersion for class: JetGradlePlugin
gradle版本不匹配的原因。由于3.5.1的AS编译出原app的按钮有变化,所以降级用3.0.1的AS试一下,结果报了这个错。把gradle-wrapper中的distributionUrl修改一下:
Error:No such property: GradleVersion for class: JetGradlePlugin
-
报错:gradle —> read time out
查到说修改jdk,使用系统jdk,别用AS自带的。查看jdk路径方法:
/usr/libexec/java_home -V
结果还是time out….
应该还是网络的问题,下载xxx.pom时候超时了。
后更:也可以说不是网络问题,因为我的网络可以下到,但是gradle3.2.0这个目录在jcenter里没有??但是AS 3.5.1可以顺利编译啊。。没办法,把gradle换成了2.3.2(和旧版本的一样)
终于找到原因了:gradle那个配置。。在项目的gradle.properties文件中,弹出代理设置对话框时候手贱选了https,所以应该是global的gradle.properties文件中的设置没有用了,所以无论是换成google还是aliyun的源都超时。另外,jcenter没有gradle3.2.0了。
-
又报错:Failed to solve 什么什么的.
1
targetSdkVersion 换成了26 原先是28
-
依然是AS 3.0.1,原先的app编译后闪退,于是按照先前用3.5.1闪退时候的步骤,API改成了28(因为手机是API 28的),然后之前的错都没了,app闪退。。。
报错Unable to instantiate appComponentFactory java.lang.ClassNotFoundException: Didn’t find class “android.support.v4.app.CoreComponentFactory”
-
不是API的原因,gradle换成了和旧版本一样的4.1, targetAPI什么的也都还原了,用3.5.1编译没问题了。
终于找到按钮出问题的原因了!!!
最开始用新的android studio 3.5.1编译的时候,按钮那个代码里报错了,我查了下就注释掉换了一种写法,这基本上是最先修改的错了,早就忘了,然后我改回原先到写法,发现不报错了。(当然可能是gradle版本的问题,已经全改的和旧的一样了,所以没报错)。build.gradle也是和旧的一样了。贴出那个代码,单打开文件依然是红的。
但是!用AS 3.0.1编译同样的代码,依然闪退!还是奇葩的!(当然,大概率原因还是在自己。。好歹新环境可以用了,所以先不管了)
经验
以后换新的IDE,编译报错,先找版本原因,从gradle版本,API版本等,实在不是版本原因再改代码。。。。
10.23更新
为了彻底杜绝像锤子手机那种奇葩,决定把countrypicker库的源文件拿来作为子项目添加进去,然后把string.xml中的汉语彻底替换掉(最土的做法。。)
这样为了把countrypicker工程加入到现有的工程中,把countrypicker的代码先拷贝到原工程中。然后countrypicker的build文件中有“api ‘io.michaelrocks:libphonenumber-android:8.10.16’”,估计是为了解决手机号格式的库。这玩意报错:
1 |
|
额。。gradle版本太低的过,以前是2.3.2,换成了3.2.0.