资源描述:
《android热修复学习之旅——tinker接入全攻略》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android热修复学习之旅——Tinker接入全攻略微信团队对现有的方案优缺点进行了深入的分析和总结,由于AndFix的局限性和兼容性差原因放弃了这种方案,而对QZone方案通过研究InstantRun的冷插拔与buck的exopackage带来的灵感进行了升级。QZone方案只是插入了Elements(补丁dex),而Tinker则是替换了整个Element数组(所有dex)。替换是通过patch和apk原始的dex进行合并,重启后加载合并后的新dex,这样基本上可以认为没有对dexopt和Classloader加载dex文件的过程进行干预,所以QZone方案的两个问
2、题也就不复存在。可以看到微信团队的新方案Tinker通过替换整个dex,完美了规避了现有方案的一些问题。除了合并新dex稍长时间与内存消耗,以及第一次重启加载整个新dex时dexopt的时间,似乎没有其它的大问题,还是比较完美的。接下来,我将详细介绍如何在项目中接入Tinker.添加gradle依赖在项目的build.gradle中,添加tinker-patch-gradle-plugin的依赖buildscript{dependencies{classpath('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.7')}
3、}然后在app的gradle文件app/build.gradle,我们需要添加tinker的库依赖以及applytinker的gradle插件.dependencies{compilefileTree(dir:'libs',include:['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2',{excludegroup:'com.android.support',module:'support-annotations'})compile'com.androi
4、d.support:appcompat-v7:24.2.1'testCompile'junit:junit:4.12'//tinker的核心库compile("com.tencent.tinker:tinker-android-lib:1.7.7")//可选,用于生成application类provided("com.tencent.tinker:tinker-android-anno:1.7.7")compile"com.android.support:multidex:1.0.1"}//applytinker插件applyplugin:'com.tencent.tin
5、ker.patch'添加(或修改)项目的Application,使之继承DefaultApplicationLike;这个DefaultApplicationLike不是继承自Application,需要用注解来设置项目中真正的Application,Tinker插件会自动生成真正的Application,建议最好用注解的方式生成自己的application,不用我们自己写,是自动生成的,然后修改manifest.xml将application指向com.xxx.xxx.MyApplication就行,开始会报错,build一下项目就好了。@SuppressWarning
6、s("unused")@DefaultLifeCycle(application="com.example.testtinker.SampleApplication",flags=ShareConstants.TINKER_ENABLE_ALL,loadVerifyFlag=false)publicclassSampleApplicationLikeextendsDefaultApplicationLike{publicSampleApplicationLike(Applicationapplication,inttinkerFlags,booleantinkerLoad
7、VerifyFlag,longapplicationStartElapsedTime,longapplicationStartMillisTime,IntenttinkerResultIntent){super(application,tinkerFlags,tinkerLoadVerifyFlag,applicationStartElapsedTime,applicationStartMillisTime,tinkerResultIntent);}@OverridepublicvoidonBaseContextAttache