Skip to content

Commit aa2f8e6

Browse files
author
muxiannian
committed
解决https不能下载的问题
1 parent 5185cf9 commit aa2f8e6

10 files changed

Lines changed: 134 additions & 23 deletions

File tree

0 Bytes
Binary file not shown.

.idea/caches/gradle_models.ser

52 Bytes
Binary file not shown.

README.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
+ **新增静默下载更新的方式,实现进入App直接后台下载,下载完成后弹出安装页面(静默安装需要Root权限,而且体验很不好,不做支持)(2019-10-25 18:09:05添加)。**
2525

2626
### 新版本说明
27+
+ 2019-11-04 12:38:12更新版本,版本号为:v2.0.3
28+
+ 新增配置DownloadConnection的入口,可切换文件下载器的内核
29+
+ 提供了配置Okhttp3作为下载器的demo,在demo中提供了OkHttp3Connection的实现,并提供信任所有证书的工具类SSLUtils,可解决https根证书不被信任导致无法下载的问题
30+
2731
+ 2019-10-25 18:09:05更新新版,版本号为:v2.0.2
2832
+ 新增静默下载更新的方式
2933
+ 新增获取是否有新版本更新的事件回调
@@ -68,12 +72,24 @@ allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
6872

6973
**Step 2.** Add the dependency
7074
```gradle
71-
dependencies { implementation 'com.github.MZCretin:AutoUpdateProject:latest_version' }
75+
dependencies { implementation 'com.github.MZCretin:AutoUpdateProject:latest_version' }
7276
```
7377

7478
**Step 3.** Init it in BaseApplication or MainActivity before using it.And then register BaseApplication in AndroidManifest(Don't forget it).
7579

7680
```java
81+
//如果你想使用okhttp作为下载的载体,那么你需要自己依赖okhttp,更新库不强制依赖okhttp!可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator start
82+
OkHttpClient.Builder builder = new OkHttpClient.Builder();
83+
builder.connectTimeout(30_000, TimeUnit.SECONDS)
84+
.readTimeout(30_000, TimeUnit.SECONDS)
85+
.writeTimeout(30_000, TimeUnit.SECONDS)
86+
//如果你需要信任所有的证书,可解决根证书不被信任导致无法下载的问题 start
87+
.sslSocketFactory(SSLUtils.createSSLSocketFactory())
88+
.hostnameVerifier(new SSLUtils.TrustAllHostnameVerifier())
89+
//如果你需要信任所有的证书,可解决根证书不被信任导致无法下载的问题 end
90+
.retryOnConnectionFailure(true);
91+
//如果你想使用okhttp作为下载的载体,那么你需要自己依赖okhttp,更新库不强制依赖okhttp!可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator end
92+
7793
//更新库配置
7894
UpdateConfig updateConfig = new UpdateConfig()
7995
.setDebug(true)//是否是Debug模式
@@ -88,7 +104,9 @@ dependencies { implementation 'com.github.MZCretin:AutoUpdateProject:latest_vers
88104
.setAutoDownloadBackground(false)//是否需要后台静默下载,如果设置为true,则调用checkUpdate方法之后会直接下载安装,不会弹出更新页面。当你选择UI样式为TypeConfig.UI_THEME_CUSTOM,静默安装失效,您需要在自定义的Activity中自主实现静默下载,使用这种方式的时候建议setShowNotification(false),这样基本上用户就会对下载无感知了
89105
.setCustomActivityClass(CustomActivity.class)//如果你选择的UI样式为TypeConfig.UI_THEME_CUSTOM,那么你需要自定义一个Activity继承自RootActivity,并参照demo实现功能,在此处填写自定义Activity的class
90106
.setNeedFileMD5Check(false)//是否需要进行文件的MD5检验,如果开启需要提供文件本身正确的MD5校验码,DEMO中提供了获取文件MD5检验码的工具页面,也提供了加密工具类Md5Utils
107+
.setCustomDownloadConnectionCreator(new OkHttp3Connection.Creator(builder))//如果你想使用okhttp作为下载的载体,可以使用如下代码创建一个OkHttpClient,并使用demo中提供的OkHttp3Connection构建一个ConnectionCreator传入,在这里可以配置信任所有的证书,可解决根证书不被信任导致无法下载apk的问题
91108
.setModelClass(new UpdateModel());
109+
//初始化
92110
AppUpdateUtils.init(this, updateConfig);
93111
```
94112

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,7 @@ dependencies {
3232
// implementation 'com.github.MZCretin:AutoUpdateProject:v2.0.0'
3333
//使用本地库依赖
3434
implementation project(':cretinautoupdatelibrary')
35+
36+
//如果你需要使用okhttp作为你的下载器 你需要自主引入okhttp的依赖
37+
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
3538
}

app/src/main/java/com/cretin/www/autoupdateproject/app/BaseApp.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@
88
import com.cretin.www.autoupdateproject.model.UpdateModel;
99
import com.cretin.www.cretinautoupdatelibrary.model.TypeConfig;
1010
import com.cretin.www.cretinautoupdatelibrary.model.UpdateConfig;
11+
import com.cretin.www.autoupdateproject.utils.OkHttp3Connection;
1112
import com.cretin.www.cretinautoupdatelibrary.utils.AppUpdateUtils;
13+
import com.cretin.www.cretinautoupdatelibrary.utils.SSLUtils;
14+
15+
import java.util.concurrent.TimeUnit;
16+
17+
import okhttp3.OkHttpClient;
1218

1319
public class BaseApp extends Application {
1420
@Override
@@ -18,6 +24,18 @@ public void onCreate() {
1824
//BlankJ的初始化 跟更新库没有关系哦
1925
Utils.init(this);
2026

27+
//如果你想使用okhttp作为下载的载体,那么你需要自己依赖okhttp,更新库不强制依赖okhttp!可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator start
28+
OkHttpClient.Builder builder = new OkHttpClient.Builder();
29+
builder.connectTimeout(30_000, TimeUnit.SECONDS)
30+
.readTimeout(30_000, TimeUnit.SECONDS)
31+
.writeTimeout(30_000, TimeUnit.SECONDS)
32+
//如果你需要信任所有的证书,可解决根证书不被信任导致无法下载的问题 start
33+
.sslSocketFactory(SSLUtils.createSSLSocketFactory())
34+
.hostnameVerifier(new SSLUtils.TrustAllHostnameVerifier())
35+
//如果你需要信任所有的证书,可解决根证书不被信任导致无法下载的问题 end
36+
.retryOnConnectionFailure(true);
37+
//如果你想使用okhttp作为下载的载体,那么你需要自己依赖okhttp,更新库不强制依赖okhttp!可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator end
38+
2139
//更新库配置
2240
UpdateConfig updateConfig = new UpdateConfig()
2341
.setDebug(true)//是否是Debug模式
@@ -32,7 +50,9 @@ public void onCreate() {
3250
.setAutoDownloadBackground(false)//是否需要后台静默下载,如果设置为true,则调用checkUpdate方法之后会直接下载安装,不会弹出更新页面。当你选择UI样式为TypeConfig.UI_THEME_CUSTOM,静默安装失效,您需要在自定义的Activity中自主实现静默下载,使用这种方式的时候建议setShowNotification(false),这样基本上用户就会对下载无感知了
3351
.setCustomActivityClass(CustomActivity.class)//如果你选择的UI样式为TypeConfig.UI_THEME_CUSTOM,那么你需要自定义一个Activity继承自RootActivity,并参照demo实现功能,在此处填写自定义Activity的class
3452
.setNeedFileMD5Check(false)//是否需要进行文件的MD5检验,如果开启需要提供文件本身正确的MD5校验码,DEMO中提供了获取文件MD5检验码的工具页面,也提供了加密工具类Md5Utils
53+
.setCustomDownloadConnectionCreator(new OkHttp3Connection.Creator(builder))//如果你想使用okhttp作为下载的载体,可以使用如下代码创建一个OkHttpClient,并使用demo中提供的OkHttp3Connection构建一个ConnectionCreator传入,在这里可以配置信任所有的证书,可解决根证书不被信任导致无法下载apk的问题
3554
.setModelClass(new UpdateModel());
55+
//初始化
3656
AppUpdateUtils.init(this, updateConfig);
3757
}
3858
}

cretinautoupdatelibrary/src/main/java/com/cretin/www/cretinautoupdatelibrary/net/OkHttp3Connection.java renamed to app/src/main/java/com/cretin/www/autoupdateproject/utils/OkHttp3Connection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.cretin.www.cretinautoupdatelibrary.net;
1+
package com.cretin.www.autoupdateproject.utils;
22

33
import com.liulishuo.filedownloader.connection.FileDownloadConnection;
44
import com.liulishuo.filedownloader.util.FileDownloadHelper;

cretinautoupdatelibrary/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ dependencies {
3131
implementation 'com.android.support:appcompat-v7:28.0.0'
3232
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
3333
api 'com.liulishuo.filedownloader:library:1.7.6'
34-
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
3534
}
3635

3736
repositories {

cretinautoupdatelibrary/src/main/java/com/cretin/www/cretinautoupdatelibrary/model/UpdateConfig.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.cretin.www.cretinautoupdatelibrary.model;
22

3+
import com.liulishuo.filedownloader.util.FileDownloadHelper;
4+
35
import java.util.Map;
46

57
/**
@@ -49,6 +51,18 @@ public class UpdateConfig {
4951
//是否静默下载
5052
private boolean isAutoDownloadBackground;
5153

54+
//自定义下载
55+
private FileDownloadHelper.ConnectionCreator customDownloadConnectionCreator;
56+
57+
public FileDownloadHelper.ConnectionCreator getCustomDownloadConnectionCreator() {
58+
return customDownloadConnectionCreator;
59+
}
60+
61+
public UpdateConfig setCustomDownloadConnectionCreator(FileDownloadHelper.ConnectionCreator customDownloadConnectionCreator) {
62+
this.customDownloadConnectionCreator = customDownloadConnectionCreator;
63+
return this;
64+
}
65+
5266
public boolean isAutoDownloadBackground() {
5367
return isAutoDownloadBackground;
5468
}

cretinautoupdatelibrary/src/main/java/com/cretin/www/cretinautoupdatelibrary/utils/AppUpdateUtils.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,19 @@
2828
import com.cretin.www.cretinautoupdatelibrary.model.UpdateConfig;
2929
import com.cretin.www.cretinautoupdatelibrary.net.HttpCallbackModelListener;
3030
import com.cretin.www.cretinautoupdatelibrary.net.HttpUtils;
31-
import com.cretin.www.cretinautoupdatelibrary.net.OkHttp3Connection;
3231
import com.cretin.www.cretinautoupdatelibrary.service.UpdateReceiver;
3332
import com.liulishuo.filedownloader.BaseDownloadTask;
3433
import com.liulishuo.filedownloader.FileDownloadLargeFileListener;
3534
import com.liulishuo.filedownloader.FileDownloadListener;
3635
import com.liulishuo.filedownloader.FileDownloader;
36+
import com.liulishuo.filedownloader.connection.FileDownloadUrlConnection;
37+
import com.liulishuo.filedownloader.util.FileDownloadHelper;
3738
import com.liulishuo.filedownloader.util.FileDownloadUtils;
3839

3940
import java.io.File;
4041
import java.util.ArrayList;
4142
import java.util.Arrays;
4243
import java.util.List;
43-
import java.util.concurrent.TimeUnit;
44-
import okhttp3.OkHttpClient;
4544

4645
import static com.cretin.www.cretinautoupdatelibrary.utils.AppUtils.getAppLocalPath;
4746

@@ -98,26 +97,22 @@ public static void init(Application context, UpdateConfig config) {
9897
mContext = context;
9998
updateConfig = config;
10099
ResUtils.init(context);
100+
101+
FileDownloadHelper.ConnectionCreator fileDownloadConnection = null;
101102
//初始化文件下载库
102-
/* start 使用自定义的下载器 解决根证书不被信任的情况下无法下载https的文件的问题*/
103-
final OkHttpClient.Builder builder = new OkHttpClient.Builder();
104-
builder.connectTimeout(30_000, TimeUnit.SECONDS);
105-
builder.readTimeout(30_000, TimeUnit.SECONDS);
103+
if (updateConfig != null && updateConfig.getCustomDownloadConnectionCreator() != null) {
104+
fileDownloadConnection = updateConfig.getCustomDownloadConnectionCreator();
105+
} else {
106+
fileDownloadConnection = new FileDownloadUrlConnection
107+
.Creator(new FileDownloadUrlConnection.Configuration()
108+
.connectTimeout(30_000) // set connection timeout.
109+
.readTimeout(30_000) // set read timeout.
110+
);
111+
}
106112

107-
FileDownloader.setupOnApplicationOnCreate(context)
108-
.connectionCreator(new OkHttp3Connection.Creator(builder))
113+
FileDownloader.setupOnApplicationOnCreate(mContext)
114+
.connectionCreator(fileDownloadConnection)
109115
.commit();
110-
/* end 使用自定义的下载器 解决根证书不被信任的情况下无法下载https的文件的问题*/
111-
112-
/* start 使用默认的URLConnection 减少依赖*/
113-
// FileDownloader.setupOnApplicationOnCreate(mContext)
114-
// .connectionCreator(new FileDownloadUrlConnection
115-
// .Creator(new FileDownloadUrlConnection.Configuration()
116-
// .connectTimeout(30_000) // set connection timeout.
117-
// .readTimeout(30_000) // set read timeout.
118-
// ))
119-
// .commit();
120-
/* end 使用默认的URLConnection 减少依赖*/
121116
}
122117

123118
public static AppUpdateUtils getInstance() {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.cretin.www.cretinautoupdatelibrary.utils;
2+
3+
import android.annotation.SuppressLint;
4+
5+
import java.security.SecureRandom;
6+
import java.security.cert.CertificateException;
7+
import java.security.cert.X509Certificate;
8+
9+
import javax.net.ssl.HostnameVerifier;
10+
import javax.net.ssl.SSLContext;
11+
import javax.net.ssl.SSLSession;
12+
import javax.net.ssl.SSLSocketFactory;
13+
import javax.net.ssl.TrustManager;
14+
import javax.net.ssl.X509TrustManager;
15+
16+
/**
17+
* @date: on 2019-11-04
18+
* @author: a112233
19+
* @email: mxnzp_life@163.com
20+
* @desc: 添加描述
21+
*/
22+
public class SSLUtils {
23+
@SuppressLint("TrulyRandom")
24+
public static SSLSocketFactory createSSLSocketFactory() {
25+
SSLSocketFactory sSLSocketFactory = null;
26+
try {
27+
SSLContext sc = SSLContext.getInstance("TLS");
28+
sc.init(null, new TrustManager[]{new TrustAllManager()},
29+
new SecureRandom());
30+
sSLSocketFactory = sc.getSocketFactory();
31+
} catch (Exception ignored) {
32+
}
33+
return sSLSocketFactory;
34+
}
35+
36+
public static class TrustAllManager implements X509TrustManager {
37+
@SuppressLint("TrustAllX509TrustManager")
38+
@Override
39+
public void checkClientTrusted(X509Certificate[] chain, String authType)
40+
throws CertificateException {
41+
}
42+
43+
@SuppressLint("TrustAllX509TrustManager")
44+
@Override
45+
public void checkServerTrusted(X509Certificate[] chain, String authType)
46+
throws CertificateException {
47+
}
48+
49+
@Override
50+
public X509Certificate[] getAcceptedIssuers() {
51+
return new X509Certificate[0];
52+
}
53+
}
54+
55+
public static class TrustAllHostnameVerifier implements HostnameVerifier {
56+
@SuppressLint("BadHostnameVerifier")
57+
@Override
58+
public boolean verify(String hostname, SSLSession session) {
59+
return true;
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)