AtlasDemo And 一些问题与经验

Atlas Demo过程记录。有这个是因为项目中的插件不是放在apk里面,也不是自动下载安装的。而是有个插件管理界面,里面和app应用市场一样的可以安装,更新和卸载插件(其中还涉及到一些用户/插件/插件中的功能 之间的权限问题,这里不需要关心)。Atlas自带的动态部署和dexPatch不满足需求,比如更新是要针对单个插件的更新而不是整个apk和所有插件。 为了找到解决方案和复习Atlas的动态部署,这才用新的demo重新走了遍流程。最后还好发现条路子可以解决我的问题~~!。
1。打包
assembleDebug
1.0.0

产物
image.png
2.上传发布
gradlew publish -DversionName=1.0.0(这里不加参数默认也是1.0.0,但是得有这个概念)
本地maven
image.png
其中.ap文件的内部结构
image.png

3.安装运行apk

4.上传并加载运程bundle
image.png
adb push E:\data\AS_Other\atlas\atlas-demo\AtlasDe
mo\app\build\outputs\remote-bundles-debug\libcom_taobao_remotebunle.so /sdcard/Android/data/com.taobao.demo/cache/libcom_taobao_remotebunle.so
直接打开运程bundle中的component加载bundle运行。

5.查看目前为止手机上生成的产物。Adb shell下

run-as com.taobao.demo ls -l /data/data/com.taobao.demo/files/storage
image.png
其中每个bundle下面的结构都是这样的
image.png

在往下本地bundle和remote的稍微不一样

本地:
image.png
Remote:
image.png

--------------------------------------------------------动态部署------------------------------------------------------
1.分别对publicBundle,firstbundle,secondbundle,remotebundle做简单修改。
2.gradlew clean assembleDebug -DapVersion=1.0.0 -DversionName=2.0.0
*这里第一次打patch时失败,原因是修改过的bundle没有改version.

产出:
image.png

3.maven上传新的ap
gradlew publish -DversionName=2.0.0
首先demo文档中没有指示这一步,其次,需要指定版本,不然把原先maven中的1.0.0覆盖掉,这样是不对的,而且又得重来。
4..tpatch差异包文件
image.png
image.png

根据修改的情况不同,每个bundle包中结果可能不同。
比如只改了代码,就只有classes.dex;改了界面但是没有加id操作,就会多res但是不会有resources.arsc. Maindex.so也差不多,只是多了manifest,因为最起码版本号变了,所以manifest肯定需要更新。

5.update-1.0.0.json动态部署配置文件(精简)
image.png
这里为了表现出bundle的version不是受打patch包时传入的版本决定,bundle的版本用了和app的版本不一样的。

6.上传手机
adb push build/outputs/tpatch-debug/update-1.0.0.json /sdcard/Android/data/com.taobao.demo/cache/update-1.0.0.json
adb push build/outputs/tpatch-debug/patch-2.0.0@1.0.0.tpatch/sdcard/Android/data/com.taobao.demo/cache/patch-2.0.0@1.0.0.tpatch

7.正式执行动态部署
image.png

8.so far so good. 疑惑的地方是,文档里面说动态部署后bundle和hostbundle在文件夹里面都为升级,如version1到version2,备份了为回滚做准备,但是并没有看到。手机里面目录结构和动态部署前差不多,只是bundle文件夹下面那一串unitTag的文件夹名变成新的了。

------------------------------------------第二次动态部署----------------------------------------
1.修改部分bundle。

2.gradlew clean assembleDebug -DapVersion=1.0.0 -DversionName=3.0.0。记得修改过的bundle要改version
image.png

3.上传测试,因为当前手机是2.0.0,所以上传的是2.0.0到3.0.0的patch
adb push build/outputs/tpatch-debug/update-2.0.0.json /sdcard/Android/data/com.taobao.demo/cache/update-2.0.0.json

adb push build/outputs/tpatch-debug/patch-3.0.0@2.0.0.tpatch /sdcard/Android/data/com.taobao.demo/cache/patch-3.0.0@2.0.0.tpatch
4.so for so gud. 查看手机文件夹还是和第一次动态部署情况一样。

----------------------------测试直接从安装状态更新到3.0.0,并且在安装时不上传加载remote------------------------------
1.把1.0.0的ap中的apk安装到手机
2.在把3.0.0对于1.0.0的patch上传到手机
3.动态部署后,内部bundle能正常更新,但是外部bundle因为没有安装过so不能启动,所以也谈不上更新。
4.把1.0.0的remote上传后可正常运行,但是这样就失去了3.0.0的更新。
5.但是把1.0.0的remote完全从手机中删除后,重新上传3.0.0remote的so,加载后就是3.0.0的状态。
6.震精!!!重新卸载安装1.0.0,上传3.0.0的remote,可行。那么就是说,我可以单独更新某个remote bundle,不需要动态部署的升级版本,也不仅限于dexPatch只能更新代码。只要安装前把原来已经安装的remote的文件夹删除就可以。但是需要考虑几个问题:1.已经运行状态,内存中关于remote bundle的信息已经加载是否会造成影响,比如说已经删除了文件夹,但是还是能查到这个bundle的信息。2.后面的更新不能依赖于host的更新。3.如果此次启动已经运行过remote,是否会有影响,是否需要直接关闭应用让用户重启。
7.最后一试,上一条否定。不用直接删除文件夹处理,用自带的Atlas里面的uninstall方法卸载可行。但是不会删除上传的so,所以要注意处理。这样的话单独更新一个remotebunlde是确实可行的。。。
8.So far so fucking gud.
9.新发现,现在通过AtlasBundleInfoManager查询到的插件版本都是null,不管是否是remote. Why? I need it.
10.Debug时发现通过uninstall把remote插件卸载之后,通过Atlas.getBundle是获取不到了,但是AtlasBundleInfoManager中还是有保存。
11.测试发现AtlasBundleInfoManager中的远程插件的信息和有没有安装或者安装的是那个版本的remote没什么关系,不会变化。
12.测试发现从Altas获取Bundle时如果插件还没有运行过得到的是null.

最后,过程中记录一下还是挺有好处的,有好几次需要各种命令,比如push文件到手机啊,run-as看手机目录啊这种,本来路径就长记不住,需要的时候回来文档里面找一下,美滋滋。

-----------------后续在实际项目中遇到的新问题---------------------

实际项目中自己设计的更新逻辑(试了下流程图太麻烦..):
image.png
这个是大体流程,但是实际中有几个表管理插件信息和插件与人员的关系和插件里的具体功能等。和流程中对应的操作比如:1.安装成功需要保存插件信息和插件人员关系信息。2.如果安装失败且安装备份插件包也失败的话需要把插件表和插件人员关系表中相关数据都清除,避免用户还是能在功能界面看到插件的功能但是实际上是没有插件安装的。3.插件更新成功需要更新插件信息和插件功能表的信息。



1.通过uninstall在install的方式更新远程插件时,如果这个要更新的插件在这次启动app还没有加载过,那么会导致uninstall失败。 解决办法有:设置成启动就加载,虽然有可能还没有安装过插件会导致异常,但是应该不至于崩溃。这样的话能保证更新的时候如果之前已经安装过,在启动的时候已经加载了,就不会异常。 还可以在uninstall前判断下有没有加载,没有的话就先执行一次加载在卸载。项目中我使用的是后者。
2.如果更新成功需要重启app.不是因为需要重启才能看到更新,且是不重启会崩溃。日志里面看不出什么异常,因为是框架里面的原因。

2017/11/14更新
最新发现,按照上面的逻辑管理插件时。当手机上安装了插件后,开发时如果apk修改后installDebug安装,这时storage下面编译后的插件还在,但是一旦启动apk后,storage下面的插件文件夹就消失了。 猜测是发现插件的那个类似唯一码的东西和apk里面的对应插件的不相同,所有系统把它删除了。
解决办法:这个时候就体现出我之前备份安装过的插件so的英明之处了,哈哈。
利用Atlas.getInstance().setClassNotFoundInterceptorCallback
回调,重新安装备份插件即可。如果找不到插件或者安装失败,则直接清除表里面的插件信息,跳转到插件管理界面提示用户重新安装插件即可。no毛病~!

Sample code
image.png

2018/05/23更新
使用中发现在插件间通过intent传递数据时会有问题。比如class找不到,或者类型转换异常等,具体细节忘了。只记得解决方法是把Searializable换成Parceable,还有就是在activity中设置调用intent的setExtrasClassLoader方法,把类加载器设置为插件的BundleClassLoader,不然这些系统类会用默认的加载器,如果数据类是在插件中而不是在host里面就会报找不到类。还有调用Bundle里面的setClassLoader也是一样的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容