接入流程图

*接入前需要关闭Android studio的即时编译,可以参考这里如何关闭即时编译,也可以自行网上找,否则打出包不能热更新

热更新SDK手动接入

首先您可以进入【快速接入】界面查看接入流程文档并在此处下载sdk

手动接入

热更新SDK可以从【快速接入】界面下载
手动接入热更新SDK需要注意以下几个方面
1. Manifest中参数是否配齐
2. 应用公钥是否设置正确
3. 混淆代码加入例外
  • 已经接入过apkplug的需要首先区分一下概念(没接入的直接忽略),apkplug是使应用插件化,一个应用使用多个插件的概念;热更新是整体概念,整个更新应用

  • 工程中引入jar包和so文件(联系我方商务后,【快速接入】界面会开放,即可以下载jar包和so文件)

*so的引入

如果宿主工程没有任何架构的so文件,则只引入一种架构的so文件即可,如果宿主文件已经有几种版本的so文件,则对应的引入相应的so文件

  • 应用配置:

    Application中像如下方式加入函数调用:

     public class MyApplication extends Application {
    
     @Override
     protected void attachBaseContext(final Context ctx) {
         super.attachBaseContext(ctx);
         //一定要在所有代码前面
         if(PackerManager.getInstance().applicationAttachBaseContext(ctx,this)){
        return;
           }      
           //MultiDex.install(this);   
      }
    
    @Override public void onCreate() {
         //一定要在所有代码前面
         if(PackerManager.getInstance().applicationOnCreate(this,“your publickey”)){
            return;
         }   
         super.onCreate();
    
       }
    }
    publickey 在应用详情里
    

    加入权限:

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.BIND_MIDI_DEVICE_SERVICE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    

6.0需要自己动态申请如下权限,不申请可能有不可预测的错误:

Manifest.permission.WRITE_EXTERNAL_STORAGE

Manifest.permission.READ_EXTERNAL_STORAGE

Manifest.permission.READ_PHONE_STATE

Manifest.permission.ACCESS_NETWORK_STATE

加入标识字段:

    <meta-data android:name="apkplug_appid" android:value="app_1UcuhZ7hTSo"/>
    <meta-data android:name="apkplug_channel" android:value="channel15"/>
    <meta-data android:name="apkplug_version" android:value="v110"/> : 这个配置可以独立的更新版本,而不用改变应用本身的versioncode,值为:versioncode前面加v,如当前versioncode:100,你想更新101,但是不想因为改变versioncode而影响其他渠道更新,则可以设置这个值为v101,当然也可以不配,或配置成v100,则不会引起更新



加入组件:

    <service android:name="com.apkplug.libmerge.common.MergeServeice"
        android:process=":merge" />
    <activity
        android:name="com.apkplug.packer.app.PProxyActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        >
    </activity>
    <service
        android:name="com.apkplug.packer.app.PProxyService"
        />
    <provider android:name="com.apkplug.packer.app.PProxyProvider" android:authorities="包名.packer.provider.proxy"/>
  • 接口使用

    查询版本信息:

        PackerManager.getInstance().checkVersionInfo(new OnCheckVersionInfoListener() {
        @Override
        public void onSuccess(DownloadInfo downloadInfo, String msg) {
            //获得DownloadInfo里的信息,根据这个信息设置自己的更新策略,比如:差分文件多大时才更新,否则不更新
        }
    
        @Override
        public void onFailure(int state, String msg) {
           // LogUtil.e("state:"+state+" msg"+ msg);
        }
    
        @Override
        public void onAlreadyLastVersion(String s) {
        //已经是最新版
            }
        });
    

    DownloadInfo结构:

    "package_name":"alipay",        #应用唯一识别码
    "version":100,                  #应用新版本
    "uri":"http://xxx.apk",         #文件下载地址
    "md5":"",                       #文件的MD5,可用于文件校验
    "info":"",                      #版本说明
    "execute":"update|force-update"     #更新的执行策略,update进行热更新不提示任何信息,force-update,强制热更新,会提示用户
    "diff":详见Diff结构
    

    Diff结构:差分文件有关信息

    identification:"合并后新文件的MD5"
    base_identification:"参与合并的旧版本文件MD5"
    uri:"差分文件下载地址"
    md5:"差分文件MD5"
    size:"long类型,差分文件大小"
    

更新应用:

        PackerManager.getInstance().updata(new OnUpdataListener() {
        @Override
        public void onSuccess(String filePath, DownloadInfo downloadinfo) {
            //更新成功
  }

        @Override
        public void onFailure(int state, String responseMsg) {
            //LogUtil.e(state+" : "+responseMsg);
        }

        @Override
        public void onProgress(String url, String filePath, long bytesWritten, long totalBytes) {
            //更新文件的下载过程
        }
    });
  • 混淆文件

      -keep class com.apkplug.**{*;}
    
      -keep class org.apkplug.**{*;}
    

    混淆引入jar包

      -libraryjars [hotpacker jar库文件路径]
    

打包完成后即可上传:

上传待更新APK文件

服务器会对待更新的APK文件进行校验:
1. Manifest配置的apkplug_appid是否正确
2. Manifest配置的apkplug_channel是否存在渠道列表中
3. APK版本是否高于当前渠道中已有版本

上传完成后就可以了,旧版应用就可以更新这个版本了

*