(Translated by https://www.hiragana.jp/)
GitHub - noodle1983/UnityAndroidIl2cppPatchDemo: 这是Unity Android APP il2cpp热更完美解决方案的Demo。更新build_demo_apk里的Unity路径,执行即可一键重build Patch和apk。因为文件libunity是没有热更的,如unity版本有变化则热更不适用。
Skip to content

这是Unity Android APP il2cpp热更かんかい决方あんてきDemo。更新こうしんbuild_demo_apkさとてきUnityみち,执行そくいち键重build Patchapk。よし为文けんlibunityぼつゆう热更てき,如unityばん本有ほんゆう变化则热さら适用。

Notifications You must be signed in to change notification settings

noodle1983/UnityAndroidIl2cppPatchDemo

Repository files navigation

1. 简介

这是Unity Android APP il2cpp热更かんかい决方あんてきDemo(Gitてき说明。

かず现有てき热更かい决方あん不同ふどうてきかい引入あまりてき语言(ただUnityScript,c#...),对Unityほどじょ设计编码ぼつゆうにんなんげんせい。你可以在预置场景さとてきGameObjectじょう添加てんかにんなんてきCompnents组件,需要じゅよう序列じょれつてき需要じゅよう序列じょれつてき们都以热さらてき,也不需要じゅよう做额外的がいてき标记处理。简而ごとざい此方こちら案下あんか,Unityてき所有しょゆう资源脚本きゃくほんみやこただし以热さらてき

本文ほんぶんせっらいはたかい如何いか制作せいさく热更ぶんけん如何いか应用这些热更ぶんけん。为了简化Demoてき设计,Demo包含ほうがんてき热更ぶんけんかいことさき以全りょう更新こうしんてき方式ほうしき制作せいさくこう,一起打到了Apkさとめん具体ぐたいいた项目ちゅう热更ぶんけんふく务器,正式せいしきじょう线得CDN,以增量ぞうりょう更新こうしんてき方式ほうしき捣鼓和文わぶんちゅう一样的目录结构就OKりょう

Demoだい码适ようUnity2018-?,2017需要じゅよう自己じこ版本はんぽん历史かい退すさZip库。

2. 方案ほうあん总览

Unityざい以il2cpp方式ほうしき导出Android工程こうていあるものApkぶんけんてき时候,だい码会编译なりlibil2cpp,而相关的资源、配置はいち序列じょれつすうすえかい以他们各自かくじてき格式かくしき导出いたandroidてきassets录(assets/bin/Data)。这两部分ぶぶん,libil2cppassets录,必须ひきはいそく需要じゅようざいどう一次打包中提取,可能かのうゆうてき变了,ゆうてきぼつ变,增量ぞうりょう方式ほうしきただひっさげ变化てき部分ぶぶん才能さいのう正常せいじょう工作こうさくしかUnityかいざい启动时崩溃。ほん方案ほうあん就是热更这两部分ぶぶん

热更てき正式せいしきりゅうほど如下图.

运行时流程图

りゅうほど说明:

  • 骤1,ざいUnityてき逻辑まえ,libbootstrapかい检查本地ほんじいやゆうPatch. Apkあんそうきさきぼつ应用过任なん热更,本地ほんじかいゆうPatchぶんけんてきはしnoりゅうほど。如果热更过,则会ゆうPatch录,はしyesりゅうほど。如果くつがえ盖安そうかい检查apkPatchぶんけんてきおさむあらため时间,はしnoりゅうほど。Patch录如なんじゅん备,きさき面会めんかいはたいた

  • 骤2,载Patch录对应架构(arm/x86)てきlibil2cpp库,并应ようassets录的更新こうしんぶんけん

  • 骤3,开始Unityてきりゅうほど,进入Unityだいいち个场けい,并执ぎょうしょう关的Unity Script,一般いっぱんC#,わが们都以C#举例。

  • 骤4,检查ふく务端いやゆうしんてきpatch,这步demoぼつゆうえんじしめせ需要じゅよう自己じこ实现。

  • 骤5,载新てきpatch,这步demo也没ゆうえんじしめせ需要じゅよう自己じこ实现

  • 骤6,すえ规则じゅん备patch录,详细规则かいざいきさきめん描述。ざいDemoちゅうただこれはた全量ぜんりょう更新こうしんつつみかい压,全量ぜんりょう更新こうしんつつみつつみてき时候录结构就对的,所以ゆえん需要じゅよう做其てき处理。

  • 骤7,调用libbootstrapてきせっこう设置patch录,いん为libil2cppやめ经加载进进程,所以ゆえん需要じゅようじゅう启APP,从新てきpatch录加载patch。这步Demo中有ちゅうう设置patch录的れい

  • 骤8,じゅう启APP,Demo提供ていきょうりょう纯C#だい码。

  • 骤9,ぼつゆうしんてきPatch,就正つね进入ゆう戏了。

りゅうほどさとさら详细てき描述如何いか生成せいせいPatchぶんけん,见第さんしょう

3. Demo详述

3.1. Demo录结构

工程こうてい所有しょゆうぶんけんひとしおけ于AndroidIl2cppPatchDemo录下。かくぶんけん录说あかり如下ひょう

名字みょうじ 说明
Editor/AndroidBuilder.cs 这个ぶんけん包含ほうがん所有しょゆう从导Android工程こうていいた输出Patch生成せいせいApkあんそうぶんけんてきだい码。
Editor/Exe/zip.exe zip压缩工具こうぐようらいはたasset/bin/Dataてきぶんけん压缩なり标准zip格式かくしき
Plugin/ 包含ほうがんlibbootstrap库.
PrebuiltPatches/ 包含ほうがん预先生成せいせいてき两个全量ぜんりょう热更しん版本はんぽん
Scene/*.unity えんじしめせ场景,ははつつみ版本はんぽん1仅有0.unity,版本はんぽん2增加ぞうかりょう1.unity,测试しんぞう场景脚本きゃくほんてきpatch
Script/Bootstrap.cs 这个ぶんけんてい义了libbootstrapてきc#せっ口和くちわしげる启APPてき纯c#实现
Script/VersionSettor.cs 这个脚本きゃくほんよう于运ぎょう时准备相应的热更版本はんぽん录。
Script/UI/MessageBoxUI.cs 这是一个简单的运行时MessageBoxひかえせい
ZipLibrary/ c#はんてき压缩かい压工,输出てきzipぶんけん为非标准ぶんけん,Patch制作せいさくちゅう不能ふのうよう于asset/bin/Dataぶんけんてき压缩,仅用于libil2cpp库的压缩,运行时用于全りょう热更つつみてきかい压.

所有しょゆうぶんけん就这么多,项目ようgit管理かんり,masterぶんささえ为母つつみぶんささえ,version1version2ふんささえ为热さら1热更2ふんささえふんささえ间会ゆう些细ほろまと别,version1主要しゅよう测试序列じょれつすうすえ,version2添加てんかりょうしん场景しん脚本きゃくほん具体ぐたい以diff查看。下面かめんかい详细描述つつみ过程如何いか应用热更ぶんけん

3.2. つつみ过程

所有しょゆうてきつつみ逻辑ざいぶんけんEditor\AndroidBuilder.csさとてん主菜しゅさいAndroidBuilder, 以看いたゆう5,为了热更启动りゅうほど区分くぶんわが们就さけべ过程。

  • 过程1:以il2cppてき方式ほうしき,导出Gradle Android工程こうてい。选择Gradle Android工程こうてい,而不ADT Android工程こうていただいん为Unity2018さい支持しじADT方式ほうしき。Demo并不赖AndroidStudio,ただ导出てきAndroid工程こうてい录结构是以Gradleてき方式ほうしきちゅう释,これきさきてき构建骤都调用原始げんしJDK/SDKてき方式ほうしき。Demo这部分ぶぶんてきだい码可以复ようただし需要じゅようすえ项目需求做一些修あらため
  • 过程2:需要じゅようおさむあらためいちAndroid工程こうていいん为libbootstrap需要じゅようざい进入Unityてき帧循环前,检查载本じゅん备好てきpatch。だい多数たすうじょう况,你可以复よう这个骤的だい码。ただし如果你的项目おさむあらためりょうUnity Javaてき继承体系たいけい,你需よう检查一下这块代码是否有调用到。如果ぼつゆう调用いたきさきめんUnity帧循环中てき逻辑资源,ようてきApk内的ないてきしょう应文けん

  • 过程3:生成せいせい热更ぶんけん。如在だいしょうしょじゅつ,patchぶん为两部分ぶぶん,il2cpp库和assets/bin/Data录。具体ぐたい做法だい码均ゆう提供ていきょう需要じゅよう注意ちゅういてき必须遵守じゅんしゅかく个文けんてき命名めいめい方式ほうしきしょう对路みちかく个文けんひとしゆう压缩,对于增量ぞうりょうつつめ,如果压缩まえてきぶんけん和之かずゆきぜんそうぼつゆう变化,则不需要じゅよう制作せいさく对应てき压缩ぶんけん。这部分ぶぶん制作せいさく压缩部分ぶぶんてきだい码可复用,增量ぞうりょう部分ぶぶん需要じゅよう自己じこ实现,热更ぶんけんさいこう也加进版ほん管理かんり(svn/git/...)ちゅう

  • 过程4: 生成せいせいつつみてきwindows脚本きゃくほん脚本きゃくほん仅依赖JDK/SDK命令めいれい复用。生成せいせい脚本きゃくほんきさき,Android工程こうてい就不赖Unityりょう随意ずいいがえ换文けんさいつぎ调用脚本きゃくほん生成せいせいしんてきApk。需要じゅよう注意ちゅういてきつつみようてきso动态库,pkg_raw录下てきsoぶんけんがえ换时请注意ちゅういくびかいざいUnity录下生成せいせいkeystore录和しょう应的签名文めいぶんけん以将此签めいがえ换,并修あらため导出脚本きゃくほんちゅうてき签名みつ码。

  • 过程5: 执行过程4ちゅうてき脚本きゃくほん生成せいせいApkあんそうぶんけん复用。

主菜しゅさい单AndroidBuilder提供ていきょうりょうさい单“Running Step 1, 2, 4, 5 for the base version”,这是一键构建母包版本用的,ははつつみ需要じゅよう制作せいさくpatchぶんけん所以ゆえんしょうりょう过程3;さい单“Runnnig Step 1-4 for patch versions”,这是いち键构けんPatchようてきいん为在demoさと需要じゅよう导出Apkぶんけん

关于つつみ这里とく说两。 如果ぼつゆうさいようAssetBundleてき方式ほうしきつつめ,Unityかい各自かくじ格式かくしきはた所有しょゆう场景赖输いたassets/bin/Data录,这样也是以热さらてきただし不要ふよう这么做,いん为这样做微小びしょうてきあらため动会かげ响到个文けん,导致热更ぶんけん过大。さいこう自己じこようAssetBundleてき方式ほうしきはた资源做一个清晰的划分,つつみこのみてきAssetBundleざいassetsてき其他录。需要じゅよう注意ちゅういlibil2cpp库和assets/bin/Dataてきぶんけんこうひきはい证是どう一个版本的输出)。运行时可以重うつしAssetBundleManager.overrideBaseDownloadingURL最新さいしんてきAssetBundle。

3.3. 运行时应よう热更ぶんけん

わが们回顾一下第二章的流程图,结合つつみ过程Demoてきだい码,做进いちてき说明.

运行时流程图

つつみ过程2需要じゅようざいUnityPlayerActivity.javaぶんけん头导いれいち个库,ざいUnityてきゆう戏逻辑之まえ插入そうにゅうりょういちぎょうJavaだい码。

        import android.view.WindowManager;
+       import io.github.noodle1983.Boostrap;
+       Boostrap.InitNativeLibBeforeUnityPlay(getApplication().getApplicationContext().getFilesDir().getPath());
        mUnityPlayer = new UnityPlayer(this);

这三行代码保证了上图中步骤1-2のうざい骤3ぜん执行,したいちぎょうmUnityPlayerてきだい码即开始りょう骤3てき执行。骤3これきさき所有しょゆうてき逻辑,みやこただしやめ热更过的il2cpp库里てきUnity Script(c#,...)りょう。热更部分ぶぶんてき逻辑如果ゆうおさむあらためかいざい热更きさきたい现,如果这部分ぶぶんてきbugかげ响下热更,则可以通过热さらおさむ复,いや则应ゆび引用いんよう户清じょ本地ほんじすうすえ,以母つつみ热更逻辑更新こうしんいた最新さいしん所以ゆえんざい方案ほうあんてき应用ちゅう,仍需つきりょう证热さら部分ぶぶんてきだい码稳じょう不能ふのう随意ずいい更改こうかい

如前しょじゅつ,Demoさとぼつゆう骤4かずあゆみ骤5てきしょう关逻辑,骤6ちゅうPatchてきじゅん备,Demoただ简单はた全量ぜんりょう压缩つつみかい压,そう关逻辑在Script/VersionSettor.csぶんけんちゅうじゅん更新こうしん录时,应保证libil2cpp部分ぶぶんかい压,命名めいめい方式ほうしきDemo保持ほじ一致いっち,而assets_bin_Dataてきぶんけん需要じゅようかい压,应保证目录结构和Demo保持ほじ一致いっち。如果增量ぞうりょう更新こうしん,Patch录下てきぶんけん应该しょう对于ははつつみてきおさむあらためぶんけんざい续热さらちゅう,应保证在骤7まえ本地ほんじとうぜんPatch录的かんせいせい证运ぎょうちゅうてきApp还能正常せいじょう执行),しんてきPatch应新けん录,つう过硬链接てき形式けいしき从当ぜんPatch录中ひっさげところ需要じゅようてきぼつ变化てきぶんけんじゅん备好きさき执行骤7,じゅう启后はたろうPatch录删じょ. 骤7かずあゆみ骤8てきだい码也ざいScript/VersionSettor.csぶんけんちゅう,样子如下

        //4. tell libboostrap.so to use the right patch after reboot
        string error = Bootstrap.use_data_dir(runtimePatchPath);
        if (!string.IsNullOrEmpty(error))
        {
            messageBox.Show("use failed. path:" + zipLibil2cppPath + ", error:" + error, "ok", () => { messageBox.Close(); });
            yield break;
        }

        //5. reboot app
        yield return StartCoroutine(Restart());

4. Verify Build

4.1. Verify

あんそう预编译的Apkぶんけんてん击按钮可以切换各个版本はんぽん

release版本はんぽん

4.2. Build

  • Unity (ようUnity2017/Unity2018/Unity2019)
  • Unity2019.4 带的JDK,SDK,NDK
  • Git

Buildゆび

    1. ざいUnityちゅうEdit->Preference->External tools)设置こう JDK/SDK/NDK みちつつみだい码里かい从Unityちゅう读取。
    1. 确保gradleのう正常せいじょう工作こうさく(Unityないのう正常せいじょう导出apk)
    1. ははつつめ,执行さいAndroidBuilder->Run Step 1, 2, 4, 5 for base version, 成功せいこうきさきかい弹出ぶんけん管理かんり显示apk所在しょざいてき录.
    1. 一般来说你不需要打Patchぶんけん,如果ようようgit checkout version1あるversion2,执行さいAndroidBuilder->Run Step 1-4 for Patch Version。PrebuildPatches录下てきしょう应文けんかい更新こうしん

5. あましたてき工作こうさくかずけん

つつみ部分ぶぶん

  • 设置部分ぶぶん需要じゅようすえ项目实际做修あらため
  • 热更ぶんけんてき增量ぞうりょう版本はんぽん管理かんり

运行时部分ぶぶん

  • 检查しん版本はんぽん载热さらぶんけん
  • もち增量ぞうりょう更新こうしんてきPatch录的じゅん备。
  • ようAsset Bundle管理かんり资源。

另外,つつみてき工作こうさくつきりょう动的いち键化,いちじょ你想ざいつつみとうばんしゅうからださらしがつあきら。另外,てい成本なりもとてきつつみりゅうほど大家たいかみやこすなおざい机上きじょう结果,于产ひんてき稳定。Demo其实提供ていきょうりょう一套自动化的框架和脚本,理解りかいとおる为己よう,也是こうごといちけん。如果ゆうさらこのみてき方式ほうしき,欢迎讨论。

6. 许可

MIT license.

7.主要しゅよう贡献

    1. noodle1983(Noodle)完成かんせいりょうだいいちはん, MIT开源
    1. DesperateZero(_DespAir.)贡献りょうくびじょう线机かい,协助かい决了いち问题
    • ぶんけん句柄くがら泄漏
    • 适配:oppoしゅつくえ,/data/data/appid/files 访问りょう
    • Google abbつつみてき适配问题(原因げんいんabbてき方式ほうしきかいゆう个apkつつめはららいpatchだいいち个,目前もくぜん方案ほうあんpatch含路みちasset/bin/Dataてき个)
    1. [qq:すみ(2900180710)abram_ped@126.com]发现并解决了げん读写锁不せいこうてき问题,测试ぶんけんtest_mutex.cpp
    1. sisong(eこう.net)实现りょうもと于hookApkDiffPatchてき另一种实现方しき,实现りょうmonoUnity版本はんぽんてき热更,并做りょう大量たいりょうてきつくえがたかく个API Levelてき测试。项目
    1. qq:木子きご(406351314)、西にし's my baby(871967866)quange0314@163.com团队Sin(446541451)yudimo@vip.qq.com团队,帮忙发现验证ずいつくえくずし溃问题:#12
    1. qq:Enough.(1098839800) 实践ぶん档:つう过IL2CPP热更だい
    1. qq:ちまき001(1144916875) 发现てきDemoちゅうかい退すさbase version,脚本きゃくほんつねりょう仍然patch版本はんぽんてき问题。(il2cpp cacheぼつきよし
    1. qq:みなの総長そうちょう(53957801) 发现てきしん版本はんぽんぼつゆう更新こうしんぶんけん,仍走りょうぼつ必要ひつようてき更新こうしん逻辑てき问题。
    1. github: marklalon及其项目组 性能せいのう优化严谨てき性能せいのう测试 repo link
    1. github: ganlvtech tests/fixs spin lock issue.

8.调试遗留问题

    1. 集成しゅうせいちゅう如果ゆう问题,さきDemoてきrelease版本はんぽんゆうぼつゆう问题。如果Demoゆう问题,直接ちょくせつ找我吧,QQある邮件ぎょう
    1. 如果かん兴趣,以在log.hさとこころざしぜん开,かいゆう一些很有意思的日志,对理解りかい原理げんり调试很有よう
    1. Android obbてき支持しじ,欢迎pull request,提供ていきょう支持しじ
    1. Qぐん:593413410
    1. 遗留问题见Github Issues

9.支持しじ

10.ずい

PayPal:https://www.paypal.me/noodle1983

Or Alipay:avatar Or Wechat:avatar

About

这是Unity Android APP il2cpp热更かんかい决方あんてきDemo。更新こうしんbuild_demo_apkさとてきUnityみち,执行そくいち键重build Patchapk。よし为文けんlibunityぼつゆう热更てき,如unityばん本有ほんゆう变化则热さら适用。

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published