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下載下傳位址。
下面是 需要修改的地方:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPRFGe1cVW1ZFShZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOzgzMzUTN2EjMxEDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這裡這些版本号改成自己的版本号。
這裡選擇自己的簽名檔案。我打的是正式版的包。
這裡 gitrev,自己随便寫一個字元串,在原本的項目中,這裡是填的git的版本号。無影響的随便寫。
這裡這些路徑先保持原樣,此處是打出差異包時用到的
好了 gradle基本配置完畢。
4.把官方demo中的下面的代碼全部複制進自己的項目裡面,然後再修改檔案中import 引入的包名,讓它不報錯。我這裡android studio 設定的
自動導包,隻要删除有錯的原包名就行了。
5.tinker需要改造自己的application
這裡的注解,的意思是配置自己的appcliction,這裡隻需要寫入檔案名,然後make project 或者打包的時候會自動在相應目錄下生成對應的
application 檔案,且這個檔案時隐藏的 不可編輯的,如果要修改,可以自己寫繼承它。
6.在清單檔案中
把剛剛注解的那個要生成的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.下面是打包步驟,
先打一個正式版的包,簽名檔案密碼自己輸入自己的
然後在下面目錄中就會出現一些檔案(實際上隻有3個檔案我這裡是因為打了好幾次包)
再把這些檔案的路徑複制進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"
然後需要随便修改一下代碼 好看修複效果。
修改代碼完畢後:
接下來就要生成差異包了。如圖:
正式版就運作正式版的。
運作完畢後:
那個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卡根目錄下這個檔案已經消失了。
以上就是初步合成步驟,如果要更多還是要看官方文檔。
另:自己搭建伺服器,就可以控制什麼時候下在差異包,差異包放哪個目錄。這些就可以控制了。