采用谷歌Samrt App Updates更新机制
更智能的版本更新,降低2/3流量
集成的这个库:https://github.com/jiyouliang2/SmartUpdateDemo
怎么实现的不知道。
import android.app.ProgressDialog
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.support.v7.app.AppCompatActivity
import com.itheima.updatelib.PatchUtil
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.sdk25.coroutines.onClick
import java.io.File
class MainActivity : AppCompatActivity() {
//懒加载初始化
private val mDialog: ProgressDialog by lazy {
ProgressDialog(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//findViewById之后,设置点击监听
btn_update.onClick {
//集成增量更新
update()
}
}
//增量更新:旧版本+patch= 合并生成新版本apk
fun update() {
var pm: PackageManager = packageManager
//通过命令行获取当前项目的包名adb shell dumpsys window w |findstr \/ |findstr name=
//应用程序的信息
val applicationInfo = pm.getApplicationInfo("com.jingbanyun.smartappupdate", 0)
//1.获取旧版本apk路径
val oldPath = applicationInfo.sourceDir
//2.指定patch文件保存路径
val patchFile = File(Environment.getExternalStorageDirectory(), "app-test.patch")
//3.设置新版本apk保存路径
val newApkFile = File(Environment.getExternalStorageDirectory(), "haha_new.apk")
//4.合并生成新版本
mDialog.show()
//子线程
doAsync {
//合并完成 (参数:旧版本, 新版本, 差分包)
val result = PatchUtil.patch(oldPath,newApkFile.absolutePath,patchFile.absolutePath)
if (result == 0) {
//合并成功
runOnUiThread {
mDialog.dismiss()
//安装新版本apk,系统包安装器
val intent = Intent()
//设置action,数据:
intent.action = "android.intent.action.VIEW"
intent.addCategory("android.intent.category.DEFAULT")
intent.setDataAndType(Uri.parse("file://"+newApkFile.absoluteFile),"application/vnd.android.package-archive")
startActivity(intent)
}
}
}
}
}
差分包:使用bsdiff.exe来生成
这个库里面有工具:https://github.com/jiyouliang2/SmartUpdateDemo