Skip to content
jack_1900 edited this page Dec 8, 2016 · 2 revisions

用法

下载依赖

在project 的build.gradle

buildscript { 
    repositories {
        mavenCentral()
    }
    
    dependencies {
        classpath 'me.ele:amigo:0.6.0-beta2'
    }
}

在module 的build.gradle

apply plugin: 'me.ele.amigo'

android {
 ...
}

//开发过程中你可以不想开启Amigo
//你可以把这个定义在mybuild.gradle,以区分debug & release打包
amigo {
    disable true //默认 false
}

就这样轻松的集成了Amigo。

兼容性

  • 支持所有设备,从 ECLAIR 2.1 to Nougat 7.1
  • 甚至可以支持下个Android release的版本, 不管改动是否很大。 很酷,有木有 ✌️
  • 不支持Android 3.0

自定义loading界面

在热修复的过程中会进行一些耗时(dex优化)的操作,这些操作会在一个新的进程中的Activity 中执行,所以你可以在Manifest文件中增加下面的两个配置来自定义这个Activity,美化loading界面。

<meta-data
   android:name="amigo_layout"
   android:value="{your-layout-name}" />

<meta-data
   android:name="amigo_theme"
   android:value="{your-theme-name}" />

运行patch apk

补丁包生效方式有两种可以选择:

  • 稍后生效

    如果不想立即生效而是用户第二次打开App 时才打入补丁包,可以通过这个方法:

```java
Amigo.workLater(context, apkFile, callback);
```
  • 立即生效

    如果想要补丁包立即生效,调用以下方法,App 会立即重启,并且打入补丁包:

```java
Amigo.work(context, apkFile);
```

清除patch

Amigo.clear(context);

提示: 将App下次启动时删除所有的patch文件.

示例

执行命令 ./gradlew runHost preparePatch 到Demo页面查看.

开发样例

Amigo gradle 插件

Gradle插件的代码在buildSrc目录下,这样每次编译项目时都会使用最新的插件代码。

Amigo lib

Gradle插件会自动选择正确的库版本,在开发过程中,我们会使用amigo-lib这个模块,从而无需每次推送到maven仓库。

测试

我们在app/build.gradle提供了两个gradle task: :app:runHost, :app:preparePatch, 可以有效的帮助加快开发.

  • ./gradlew runHost, 编译并启动宿主app
  • ./gradlew preparePatch, 编译patch apk并推到设备sdcard中
  • 在app中应用patch apk

局限

  • patch包中新增provider

    • 修改声明方式,authorities须以"${youPackageName}.provider"开头

      <provider
          android:name="me.ele.demo.provider.StudentProvider"
          android:authorities="${youPackageName}.provider.student" />
    • 修改调用方式

      // 1. app进程内使用时,无需做任何修改
      Cursor cursor = getContentResolver().query(Uri.parse("content://" + getPackageName() + ".provider.student?id=0"), null, null, null, null);
      // 2. 其他进程中的使用时,需要修改uri为以下形式, 其中targetPackageName为你的App的包名
      Cursor cursor = getContentResolver().query(Uri.parse("content://" + targetPackageName + ".provider/student?id=0"), null, null, null, null);
  • 不支持和Instant Run同时使用

  • Amigo 不支持 Honeycomb 3.0

    • Android 3.0 是一个满是bug的版本, & 并且Google已经关闭这个版本.
  • notification & widgetRemoteViews的自定义布局不支持修改,只支持内容修复

    任何使用在RemoteViews里面的资源id都需要进行这样的包装 java RCompat.getHostIdentifier(Context context, int id)

  • 唯一的限制就是你的想象力

下载hotfix文件

  • 简单来说, 你只需要下载一个全新的apk

  • 为用户的流量着想, 你可能只想下载一个差分文件 bspatch(可针对Apk差分,或者基于Apk内容更细力度的差分)可能是你的一个选择