阿里巴巴的ANDfix比较简单但是属于bug的修复不能更新res文件夹中的文件
而使用微信tinker可以更新res的文件夹中的东西。
第一步:相关aar包的配置:
module gradle中
compile('com.tencent.tinker:tinker-android-anno:1.6.2')
compile('com.tencent.tinker:tinker-android-lib:1.6.2')
apply plugin: 'com.tencent.tinker.patch'
project gradle中classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.6.2')
配置好后
第二步配置相关的属性:
tinkerPatch {
oldApk = "C:\\Users\\Administrator\\Desktop\\Tinker\\app\\old.apk"
ignoreWarning = false
useSign = true
buildConfig{
tinkerId = "1.0"
}
packageConfig{
//写这个为了修复一个bug,详见github issue #22
configField("TINKER_ID", "1.0")
}
dex{
dexMode = "jar"
pattern = ["classes*.dex", "assets/secondary-dex-?.jar"]
loader = ["com.tencent.tinker.loader.*", "com.example.administrator.tinker.MApplication"]
}
lib{
pattern = ["lib/armeabi/*.so","lib/arm64-v8a/*.so","lib/armeabi-v7a/*.so","lib/mips/*.so","lib/mips64/*.so","lib/x86/*.so","lib/x86_64/*.so"]
}
res{
pattern = ["res/*", "assets/*", "resources.arsc", "AndroidManifest.xml"]
largeModSize = 100
}
sevenZip{
zipArtifact = "com.tencent.mm:SevenZip:1.1.10"
}
}
复制粘贴就可以:
1.需要更改old.apk的路径
2.修改loader的application路径
signingConfigs {
release {
keyAlias 'tinker'
keyPassword 'hfc123'
storeFile file('C:\\Users\\Administrator\\tinker.jks')//这里请自行准备签名文件并填好路径
storePassword 'hfc123'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
这个signingconfig需要写在buildtype前面
signingConfig signingConfigs.release
这句话不写会报taskname not found的错误(这里入坑许久)第三步配置代码:
建立application
/**
* Created by Administrator on 2017/6/10 0010.
*/
@DefaultLifeCycle(
application = ".MApplication",
flags = ShareConstants.TINKER_ENABLE_ALL
)
public class Tapplocation extends DefaultApplicationLike {
public Tapplocation(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent, Resources[] resources, ClassLoader[] classLoader, AssetManager[] assetManager) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent, resources, classLoader, assetManager);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
TinkerInstaller.install(this);
}
}
MApplication这个是我们需要写在mainfest文件中的
gradle中的loader也需要写成这个
然后是更新的方法:
TinkerInstaller.onReceiveUpgradePatch(getApplication(), "/sdcard"+"/patch.apk");
这里我把路径写死了有的机型获取的不是/sdcard
最好写成getabsolute.....这种方法获取
然后就完成了在更新代码之后将生成的补丁包放入指定文件夹,执行方法就会更新。
注:在更新完成后app会自动kill程序
第四部:生成补丁包。
如果你以上的配置配置成功只需要在
命令行terminal中输入>gradlew tinkerPatchRelease
就可以在as的控制台的成功后指定的路径找到以.apk结尾的补丁包了。
如果失败了说明你上面的配置出错了
第五步:
我按照大神hongyang的那种类似andfix 的方法生成补丁的方法一直出错
如果有人会的话请也教教我。(不知道是不是mapping.txt必须要配置的原因)