Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,21 @@ AndroidX项目
implementation 'com.teprinciple:updateapputilsX:2.3.0'
```

混淆配置
```
-dontwarn com.arialyy.aria.**
-keep class com.arialyy.aria.**{*;}
-keep class **$$DownloadListenerProxy{ *; }
-keep class **$$UploadListenerProxy{ *; }
-keep class **$$DownloadGroupListenerProxy{ *; }
-keep class **$$DGSubListenerProxy{ *; }
-keepclasseswithmembernames class * {
@Download.* <methods>;
@Upload.* <methods>;
@DownloadGroup.* <methods>;
}
```

### 使用
下面为kotlin使用示例,Java示例请参考[JavaDemo](https://github.com/teprinciple/UpdateAppUtils/blob/master/app/src/main/java/com/example/teprinciple/updateappdemo/JavaDemoActivity.java)
#### 1、快速使用
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
UpdateAppUtils.init(this)

// 基本使用
btn_basic_use.setOnClickListener {
Expand Down
2 changes: 1 addition & 1 deletion updateapputils/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.liulishuo.filedownloader:library:1.7.7'
implementation 'com.arialyy.aria:core:3.8.15'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1'
}
Expand Down
141 changes: 86 additions & 55 deletions updateapputils/src/main/java/update/DownloadAppUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Environment
import com.liulishuo.filedownloader.BaseDownloadTask
import com.liulishuo.filedownloader.FileDownloadLargeFileListener
import com.liulishuo.filedownloader.FileDownloader
import com.arialyy.aria.core.Aria
import com.arialyy.aria.core.common.HttpOption
import com.arialyy.aria.core.common.RequestEnum
import com.arialyy.aria.core.download.DownloadTaskListener
import com.arialyy.aria.core.task.DownloadTask
import extension.*
import util.FileDownloadUtil
import util.SPUtil
Expand All @@ -17,15 +19,19 @@ import java.io.File
/**
* Created by Teprinciple on 2016/12/13.
*/
internal object DownloadAppUtils {

internal object DownloadAppUtils : DownloadTaskListener {
const val KEY_OF_SP_APK_PATH = "KEY_OF_SP_APK_PATH"

/**
* apk 下载后本地文件路径
*/
var downloadUpdateApkFilePath: String = ""

/**
* task id
*/
var taskId: Long = 0

/**
* 更新信息
*/
Expand Down Expand Up @@ -78,6 +84,7 @@ internal object DownloadAppUtils {
* App下载APK包,下载完成后安装
*/
fun download() {
Aria.download(this).register()

(Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED).no {
log("没有SD卡")
Expand Down Expand Up @@ -105,62 +112,85 @@ internal object DownloadAppUtils {
context.appName
}

if (!File(filePath).exists()) {
File(filePath).mkdirs()
}

val apkLocalPath = "$filePath/$apkName.apk"

downloadUpdateApkFilePath = apkLocalPath

SPUtil.putBase(KEY_OF_SP_APK_PATH, downloadUpdateApkFilePath)

FileDownloader.setup(context)

val downloadTask = FileDownloader.getImpl().create(updateInfo.apkUrl)
.setPath(apkLocalPath)

downloadTask
.addHeader("Accept-Encoding","identity")
.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36")
.setListener(object : FileDownloadLargeFileListener() {

override fun pending(task: BaseDownloadTask, soFarBytes: Long, totalBytes: Long) {
log("----使用FileDownloader下载-------")
log("pending:soFarBytes($soFarBytes),totalBytes($totalBytes)")
downloadStart()
if(totalBytes < 0){
downloadTask.pause()
}
}

override fun progress(task: BaseDownloadTask, soFarBytes: Long, totalBytes: Long) {
downloading(soFarBytes, totalBytes)
if(totalBytes < 0){
downloadTask.pause()
}
}

override fun paused(task: BaseDownloadTask, soFarBytes: Long, totalBytes: Long) {
log("获取文件总长度失败出错,尝试HTTPURLConnection下载")
downloadUpdateApkFilePath.deleteFile()
"$downloadUpdateApkFilePath.temp".deleteFile()
downloadByHttpUrlConnection(filePath, apkName)
}

override fun completed(task: BaseDownloadTask) {
downloadComplete()
}

override fun error(task: BaseDownloadTask, e: Throwable) {
// FileDownloader 下载失败后,再调用 FileDownloadUtil 下载一次
// FileDownloader 对码云或者阿里云上的apk文件会下载失败
// downloadError(e)
log("下载出错,尝试HTTPURLConnection下载")
downloadUpdateApkFilePath.deleteFile()
"$downloadUpdateApkFilePath.temp".deleteFile()
downloadByHttpUrlConnection(filePath, apkName)
}

override fun warn(task: BaseDownloadTask) {
}
}).start()
taskId = Aria.download(this)
.load(updateInfo.apkUrl)
.option(HttpOption().apply {
addHeader("Accept-Encoding", "identity")
addHeader(
"User-Agent",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36"
)
setRequestType(RequestEnum.GET)
})
.setFilePath(apkLocalPath)
.ignoreFilePathOccupy()
.resetState()
.create()
}

override fun onWait(task: DownloadTask?) {
}

override fun onPre(task: DownloadTask?) {
if (task != null) {
log("onPre:soFarBytes(${task.currentProgress}),totalBytes(${task.fileSize})")
downloadStart()
if (task.fileSize < 0) {
task.stop()
}
}
}

override fun onTaskPre(task: DownloadTask?) {
}

override fun onTaskResume(task: DownloadTask?) {
}

override fun onTaskStart(task: DownloadTask?) {
}

override fun onTaskStop(task: DownloadTask?) {
log("获取文件总长度失败出错,尝试HTTPURLConnection下载")
downloadUpdateApkFilePath.deleteFile()
"$downloadUpdateApkFilePath.temp".deleteFile()
downloadByHttpUrlConnection(updateInfo.config.apkSavePath, updateInfo.config.apkSaveName)
}

override fun onTaskCancel(task: DownloadTask?) {
}

override fun onTaskFail(task: DownloadTask?, e: Exception?) {
log("下载出错,尝试HTTPURLConnection下载$e")
downloadUpdateApkFilePath.deleteFile()
"$downloadUpdateApkFilePath.temp".deleteFile()
downloadByHttpUrlConnection(updateInfo.config.apkSavePath, updateInfo.config.apkSaveName)
}

override fun onTaskComplete(task: DownloadTask?) {
downloadComplete()
}

override fun onTaskRunning(task: DownloadTask?) {
if (task != null) {
downloading(task.currentProgress, task.fileSize)
if (task.fileSize < 0) {
task.stop()
}
}
}

override fun onNoSupportBreakPoint(task: DownloadTask?) {
}

/**
Expand Down Expand Up @@ -209,6 +239,7 @@ internal object DownloadAppUtils {
log("completed")
[email protected](100)
UpdateAppUtils.downloadListener?.onFinish()
Aria.download(this).unRegister()
// 校验md5
(updateInfo.config.needCheckMd5).yes {
checkMd5(context)
Expand Down
2 changes: 2 additions & 0 deletions updateapputils/src/main/java/update/UpdateAppUtils.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package update

import android.content.Context
import com.arialyy.aria.core.Aria
import extension.globalContext
import extension.log
import extension.no
Expand Down Expand Up @@ -164,6 +165,7 @@ object UpdateAppUtils {
*/
@JvmStatic
fun init(context: Context){
Aria.init(context)
GlobalContextProvider.mContext = context.applicationContext
log("外部初始化context")
}
Expand Down