diff --git a/README.md b/README.md index b727c5e..bfc9c28 100644 --- a/README.md +++ b/README.md @@ -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.* ; + @Upload.* ; + @DownloadGroup.* ; +} +``` + ### 使用 下面为kotlin使用示例,Java示例请参考[JavaDemo](https://github.com/teprinciple/UpdateAppUtils/blob/master/app/src/main/java/com/example/teprinciple/updateappdemo/JavaDemoActivity.java) #### 1、快速使用 diff --git a/app/src/main/java/com/example/teprinciple/updateappdemo/MainActivity.kt b/app/src/main/java/com/example/teprinciple/updateappdemo/MainActivity.kt index dbb321d..88f9d29 100644 --- a/app/src/main/java/com/example/teprinciple/updateappdemo/MainActivity.kt +++ b/app/src/main/java/com/example/teprinciple/updateappdemo/MainActivity.kt @@ -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 { diff --git a/updateapputils/build.gradle b/updateapputils/build.gradle index 10fd897..75dc041 100644 --- a/updateapputils/build.gradle +++ b/updateapputils/build.gradle @@ -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' } diff --git a/updateapputils/src/main/java/update/DownloadAppUtils.kt b/updateapputils/src/main/java/update/DownloadAppUtils.kt index 5bb566f..6ef52af 100644 --- a/updateapputils/src/main/java/update/DownloadAppUtils.kt +++ b/updateapputils/src/main/java/update/DownloadAppUtils.kt @@ -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 @@ -17,8 +19,7 @@ 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" /** @@ -26,6 +27,11 @@ internal object DownloadAppUtils { */ var downloadUpdateApkFilePath: String = "" + /** + * task id + */ + var taskId: Long = 0 + /** * 更新信息 */ @@ -78,6 +84,7 @@ internal object DownloadAppUtils { * App下载APK包,下载完成后安装 */ fun download() { + Aria.download(this).register() (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED).no { log("没有SD卡") @@ -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?) { } /** @@ -209,6 +239,7 @@ internal object DownloadAppUtils { log("completed") this@DownloadAppUtils.onProgress.invoke(100) UpdateAppUtils.downloadListener?.onFinish() + Aria.download(this).unRegister() // 校验md5 (updateInfo.config.needCheckMd5).yes { checkMd5(context) diff --git a/updateapputils/src/main/java/update/UpdateAppUtils.kt b/updateapputils/src/main/java/update/UpdateAppUtils.kt index c3dea63..ff3670a 100644 --- a/updateapputils/src/main/java/update/UpdateAppUtils.kt +++ b/updateapputils/src/main/java/update/UpdateAppUtils.kt @@ -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 @@ -164,6 +165,7 @@ object UpdateAppUtils { */ @JvmStatic fun init(context: Context){ + Aria.init(context) GlobalContextProvider.mContext = context.applicationContext log("外部初始化context") }