差分包制作步骤,以高通sdm660_64平台userdebug为例:
步骤一:
. build/envsetup.sh && lunch sdm660_64-userdebug
mkdir dist_output
make dist DIST_DIR=dist_output
步骤二:
全编译完成后,会在dist_output生产一系列文件,解压sdm660-64-img-eng-compile.zip,里面的img文件即可作为基础刷机包文件。保存sdm660_64-target_files-eng.compile.zip到源码根目录,重命名为A_target_files-eng.compile.zip。
步骤三:再次对源码进行修改,然后执行步骤一,保存sdm660_64-target_files-eng.compile.zip到源码根目录,重命名为B_target_files-eng.compile.zip。
步骤四:在源码根目录下执行 ./build/tools/releasetools/ota_from_target_files A-target_files-eng.compile.zip B-target_files-eng.compile.zip ota.zip 等待命令行终端提示done,差分包即制作完成。
步骤五:利用UpdateEngine操作查分包,大概源码贴一下:
private static final String OTA_PACKAGE = “/data/ota_package”;
private static final String FROM = “/sdcard/ota.zip”;
private static final String TO = OTA_PACKAGE + File.separator + “ota.zip”;
private static final String DIR = OTA_PACKAGE + File.separator + “ota”;
private static final int REBOOT = 1;
private static final int UPDATE = 2;
private UpdateEngine mUpdateEngine;
private int mUpdateEngineStatus;
private ProgressDialog mProgressDialog;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REBOOT:
Toast.makeText(FactoryRecovery.this, R.string.recovery_reboot, Toast.LENGTH_SHORT).show();
break;
case UPDATE:
mProgressDialog = new ProgressDialog(FactoryRecovery.this);
mProgressDialog.setCancelable(false);
mProgressDialog.setMessage(getString(R.string.recovery_update));
mProgressDialog.setMax(100);
mProgressDialog.setProgress(0);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
break;
default:
break;
}
}
};
private UpdateEngineCallback mUpdateEngineCallback = new UpdateEngineCallback() {
@Override
public void onStatusUpdate(int status, float percent) {
mUpdateEngineStatus = status;
if (mUpdateEngineStatus == UpdateEngine.UpdateStatusConstants.DOWNLOADING) {
mProgressDialog.setProgress((int) (percent * 100));
} else if (mUpdateEngineStatus == UpdateEngine.UpdateStatusConstants.FINALIZING) {
mProgressDialog.dismiss();
} else if (mUpdateEngineStatus == UpdateEngine.UpdateStatusConstants.UPDATED_NEED_REBOOT) {
delete(new File(DIR));
mHandler.sendEmptyMessage(REBOOT);
} else {
Log.d(TAG, "onStatusUpdate: status is " + status);
}
}
@Override
public void onPayloadApplicationComplete(int errorCode) {
Log.d(TAG, "onPayloadApplicationComplete: error is " + errorCode);
}
};
核心类资源下载:https://download.csdn.net/download/hj900328/31873061