Androidの最も簡単なホットアップデート-Robust使用ピット

4171 ワード

TinkerとRobustを見て、普通の修復ならRobustが本当に一番簡単で、最高です.
しかし他の人の書いたことを見ていて、数回の失敗を経て、ついに成功しました.
java.lang.ClassNotFoundException: 
Didn't find class "xxx.xxx.xxx.PatchesInfoImpl" on path: 
DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]

この問題は私を何日か整えて、穴はここから埋め始めました.
1.パッケージ名
Robustというバグはありますが、パッケージ名がcomでないと先頭の新規クラスには入りません.
2.PatchManipulateImp 
public class PatchManipulateImp extends PatchManipulate {

    @Override
    protected List fetchPatchList(Context context) {
        Patch patch = new Patch();
        patch.setName("patch test");
        patch.setLocalPath(FileDirectoryUtil.getPatchFile());
        patch.setPatchesInfoImplClassFullName("com.xxx.xxx.PatchesInfoImpl");
        List patches = new ArrayList<>();
        patches.add(patch);
        return patches;
    }
    
    ......

}

①ここのsetLocalPathはファイル名を書くだけで、接尾辞の中はgetの時に自動的に後ろに付けられています(あなたが付けても実は影響はありませんが、名前が1つ増えました.jar、私のような強迫症の人には見ていて気分が悪いです).
②setPatchesInfoImplClassFullNameに書かれているパッケージ名com.xxx.xxxは自由に書くことができます(上の問題のため、やはりcomで始まるのが良いです)、プロジェクトのパッケージ名と一致する必要はありませんが、robust.xmlのpatchPacknameと一致しなければなりません.そして、後ろはきっとPatchesInfoImplの終わりです!!!
③実行中は、次のように、ensurePatchExistメソッドを先に実行します.
    @Override
    protected boolean ensurePatchExist(Patch patch) {
        boolean exist = new File(patch.getLocalPath()).exists();
        return exist;
    }

そしてverifyPatchを実行
@Override
protected boolean verifyPatch(Context context, Patch patch) {
    //  app     
    patch.setTempPath(FileDirectoryUtil.getPatchFile());
    //in the sample we just copy the file
    try {
        copy(patch.getLocalPath(), patch.getTempPath());
    }catch (Exception e){
        e.printStackTrace();
        throw new RuntimeException("copy source patch to local patch error, no patch         
            execute in path "+patch.getTempPath());
    }
    return true;
}

ここで何してるの?patchをコピーします.JArはpatch_temp.jar.最後にpatch_を使うのでtemp.jar実行!!!patchではありません.jar !!!
android熱修復のRobust使用(本格的な入門)
この文章は直接2つの方法をtrueとして書き、LocalPathとTempPathを設定した.そして最後に携帯にプッシュしたのはpatch_temp.jar(では、あなたが設定したLocalPathは何の意味がありますか?)
私が得たのはpatchです.jar、私は直接携帯電話にコピーしたので、理由はもちろんpatch.jarは直接コピーしました..... 
だから結果はもちろん、何度もやっても成功しない.
3.権限
私はこの穴を踏んでいませんが、誰かが出会ったことがあるので、必ず動的な申請権限を持ってから実行しなければなりません.
 
このエラーに基づいて基本的にはこれらです.
次に注意します.
1.必ず加算
multiDexEnabled true


implementation 'com.android.support:multidex:1.0.3'

  2. 必ず正式に包んでください.
    signingConfigs {
        release  {
            storeFile file(jks  )
            storePassword "xxx"
            keyAlias "xxx"
            keyPassword "xxx"
        }
    }

    dexOptions {
        //        
        jumboMode = true
    }

    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
            signingConfig signingConfigs.release
        }
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            //      resource  
            shrinkResources true
            // Zipalign  
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
3. APK              
//          ,       
apply plugin: 'auto-patch-plugin'
//   APK     
apply plugin: 'robust'

4.それぞれのパックが終わったらmapping.txtとmethodsMap.robustは必ず保存し、バージョン番号で命名されたフォルダに保存することをお勧めします.
5.実行時は必ずstart()
protected void runRobust(){
    new PatchExecutor(getApplicationContext(),new PatchManipulateImp(),new                 
        RobustCallbackSample()).start();
}

 
上記の問題は多くの人が経験したことがないかもしれませんが、特に最後の1つは、コピーしてどこに貼るかという問題があるからです.コードは自分でノックしたほうがいいです.ノックの過程で多くの穴に遭遇しますが、これらの穴を経験してこそ、その理由がわかります.
公式Demoがあるように公式のDemoでテストします.政府は実は多くの場所であいまいだと言っていますが、ちょうどそれらのあいまいな場所で、使用者は多くの穴を踏んでいます.
例えば、上のpatch_temp.jar.....