天天看點

android筆記之 tinker初步內建

1.開源位址:https://github.com/Tencent/tinker/wiki

下面是內建步驟:完全采用正式版的內建流程。

首先建立一個項目。

2.項目的gradle 檔案添加:

classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.6')這一行      
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        classpath ('com.tencent.tinker:tinker-patch-gradle-plugin:1.7.6')
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
           

3.gradle.properties檔案中添加:

TINKER_VERSION=1.7.6      

4.因為配置有點多,是以選擇把官方demo裡面的app下的gradle檔案内容全部複制下來 覆寫在自己的項目的appde gradle檔案中;再修改一些内容。把自己的gradle檔案中的

内容複制到相應的位置。

https://github.com/Tencent/tinker/tree/master/tinker-sample-android

上面是官方demo下載下傳位址。

下面是 需要修改的地方:

android筆記之 tinker初步內建

這裡這些版本号改成自己的版本号。

android筆記之 tinker初步內建

這裡選擇自己的簽名檔案。我打的是正式版的包。

android筆記之 tinker初步內建
android筆記之 tinker初步內建

這裡 gitrev,自己随便寫一個字元串,在原本的項目中,這裡是填的git的版本号。無影響的随便寫。

android筆記之 tinker初步內建
android筆記之 tinker初步內建

這裡這些路徑先保持原樣,此處是打出差異包時用到的

好了 gradle基本配置完畢。

4.把官方demo中的下面的代碼全部複制進自己的項目裡面,然後再修改檔案中import 引入的包名,讓它不報錯。我這裡android studio 設定的

自動導包,隻要删除有錯的原包名就行了。

android筆記之 tinker初步內建
android筆記之 tinker初步內建

5.tinker需要改造自己的application

android筆記之 tinker初步內建
android筆記之 tinker初步內建

這裡的注解,的意思是配置自己的appcliction,這裡隻需要寫入檔案名,然後make project 或者打包的時候會自動在相應目錄下生成對應的

application 檔案,且這個檔案時隐藏的 不可編輯的,如果要修改,可以自己寫繼承它。

6.在清單檔案中

android筆記之 tinker初步內建
android筆記之 tinker初步內建

把剛剛注解的那個要生成的application 應用起來,開始會報錯因為還沒有生成,這裡不管它

<service
android:name=".service.SampleResultService"
android:exported="false"/>      

然後再注冊剛剛複制進自己項目的那個SampleResultService服務。

再加點權限:

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

清單檔案就配置完畢了。

7.下面是打包步驟,

先打一個正式版的包,簽名檔案密碼自己輸入自己的

android筆記之 tinker初步內建

然後在下面目錄中就會出現一些檔案(實際上隻有3個檔案我這裡是因為打了好幾次包)

android筆記之 tinker初步內建
android筆記之 tinker初步內建

再把這些檔案的路徑複制進app下的gradle檔案中

//old apk file to build patch apk
    tinkerOldApkPath = "${bakPath}/app-release-0112-16-16-38.apk"
    //proguard mapping file to build patch apk
    tinkerApplyMappingPath = "${bakPath}/app-release-0112-16-16-38-mapping.txt"
    //resource R.txt to build patch apk, must input if there is resource changed
    tinkerApplyResourcePath = "${bakPath}/app-release-0112-16-16-38-R.txt"
           

然後需要随便修改一下代碼 好看修複效果。

修改代碼完畢後:

接下來就要生成差異包了。如圖:

android筆記之 tinker初步內建
android筆記之 tinker初步內建

正式版就運作正式版的。

運作完畢後:

android筆記之 tinker初步內建
android筆記之 tinker初步內建

那個7zip.apk就是差異包。

接下來 我的驗證步驟是這樣的。

先把最開始打的正式包通過QQ發到手機,然後安裝。

然後再把7zip.apk 放進sd卡根目錄、為什麼是根目錄呢,

因為我的代碼是這樣的:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String patchPath  = Environment.getExternalStorageDirectory().getAbsolutePath() + "/patch_signed_7zip.apk";
        File file = new File(patchPath);
        if (file.exists()) {
            Toast.makeText(this,"更新檔檔案存在",Toast.LENGTH_LONG).show();
            TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), patchPath);
        } else {
            Toast.makeText(this,"更新檔檔案不存在",Toast.LENGTH_LONG).show();
        }
    }
}
           

然後再重新打開app就會發現,修改的代碼生效了,并且。合并後我們生成的7zip。apk檔案已經被合并進我們apk了,此時sd卡根目錄下這個檔案已經消失了。

以上就是初步合成步驟,如果要更多還是要看官方文檔。

另:自己搭建伺服器,就可以控制什麼時候下在差異包,差異包放哪個目錄。這些就可以控制了。