热修复
热修复
android-key 发表于7个月前
热修复
  • 发表于 7个月前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

1.接入Tinker

接入tinker目前给了两种方式,一种是基于命令行的方式,类似于AndFix的接入方式;一种就是gradle的方式。

1.1)命令行接入

  1. 对于API: 一般来说,我们接入热修库,会在Application#onCreate中进行一下初始化操作。然后在某个地方去调用类似loadPatch这样的API去加载patch文件。
  2. 对于patch的生成:简单的方式就是通过两个apk做对比然后生成;需要注意的是:两个apk做对比,需要的前提条件,第二次打包混淆所使用的mapping文件应该和线上apk是一致的。

1.2)依赖引入

dependencies {
    // ...
    //可选,用于生成application类
     provided('com.tencent.tinker:tinker-android-anno:1.7.11')
    //tinker的核心库
   compile('com.tencent.tinker:tinker-android-lib:1.7.11') 
}

1.3)添加签名配置,这里我直接采用Tinker给的签名文件

signingConfigs {
        release {
            try {
                storeFile file("release.keystore")
                storePassword "testres"
                keyAlias "testres"
                keyPassword "testres"
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

1.4)Api的引入主要进行初始化和loadpacth

@DefaultLifeCycle(application = ".SimpleTinkerInApplicationLike",
                  flags = ShareConstants.TINKER_ENABLE_ALL,
                  loadVerifyFlag = false
                )
public class SimpleTinkerInApplicationLike extends ApplicationLike{
    public SimpleTinkerInApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
    }

    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

ApplicationLike通过名字你可能会猜,并非是Application的子类,而是一个类似Application的类。

tinker建议编写一个ApplicationLike的子类,你可以当成Application去使用,注意顶部的注解:@DefaultLifeCycle,其application属性,会在编译期生成一个SimpleTinkerInApplication类。

因此我们需要去AndroidManifest.xml配置

<application
        android:name=".SimpleTinkerInApplication"
        .../>

上述,就完成了tinker的初始化,那么调用loadPatch的时机,我们直接在Activity中添加一个Button设置:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void loadPacth(View v){
        TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
                Environment.getExternalStorageState()+"/patch_signed.apk");
    }
}

这样就把patch文件直接push到sdcard根目录(如果是6.0以上自己去动态的申请权限)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

除以以外,有个特殊的地方就是tinker需要在AndroidManifest.xml中指定TINKER_ID。

到此API相关的就结束了,剩下的就是考虑patch如何生成。

 

 

 

共有 人打赏支持
粉丝 5
博文 77
码字总数 149231
×
android-key
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: