|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在python中的函数__xxxNSString字符串NSArray数组NSDictionary字典这些都需要弄很清楚其他的类都是一个套路NSMutableArray这样带Mutable的类代表可变的拂晓前的暗中
利用Ant大概Gradle来给程序举行多渠道批量打包,一般都是在manifest文件中写进一个meta标签:- <meta-dataandroid:name="CHANNEL"android:value="xxx"/>
复制代码 meta的key值流动,经由过程轮回改动meta中的value值来完成市场渠道的写进。
Ant批量打包完成绝对贫苦,之前写的时分多亏了谦善的世界-《App主动化之利用Ant编译项目多渠道打包》。假如没有这篇帖子,真不晓得事先Ant要折腾几回才干写好。
Gradle作为新的安卓官方构建工具,有Google老迈撑腰,它的批量打包完成会绝对复杂些。能够参考《迁徙到AndroidStudio》。固然这内里有些指令过期了,比方:runProguard已被minifyEnabled替换了。
以上两种都是传统的批量打包体例,他们最年夜的弱点就是打包工夫长。
在后期渠道很少时这类办法还能够承受,但只需渠道略微增加该办法就不再合用了,缘故原由是每打一个包都要实行一遍构建历程,效力太低。(电脑对照烂,之前一样平常打包都要消费个30-40分钟。)
打包界的曙光
头几天看到美团的手艺分享文档:《美团Android主动化之旅—天生渠道包》,个中第三种体例提到:假如能间接修正apk的渠道号,而不必要再从头署名能节俭很多打包的工夫。侥幸的是我们找到了这类办法。间接解压apk,解压后的根目次会有一个META-INF目次,以下图所示:
<br>
假如在META-INF目次内增加空文件,能够不必从头署名使用。因而,经由过程为分歧渠道的使用增加分歧的空文件,能够独一标识一个渠道。
接纳这类体例,每打一个渠道包只需复制一个apk,在META-INF中增加一个利用渠道号定名的空文件便可。
这类打包体例速率十分快,900多个渠道不到一分钟就可以打完。 OK,到这里,思绪就有了。
- 在META-INF中安排一个相似channel_xxx的空文件来标识市场。
- 在Java代码中剖析这个文件名猎取市场xxx便可。
因为文档中的代码完成较少,这里我来说述一下我的完成。
我的完成
基于以上总结的美团思绪,完成了一套本人的代码,便利引进到工程后完成这类打包体例。
代码在Github:GavinCT/AndroidMultiChannelBuildTool
Python工具完成(基于Python3)
- 起首创立一个空文件,守候写进META-INF目次作为channel_xxx文件
- #空文件便于写进此空文件到apk包中作为channel文件src_empty_file=info/czt.txt#创立一个空文件(不存在则创立)f=open(src_empty_file,w)f.close()
复制代码 - 猎取渠道列表。
思索到渠道的更新不该该是程序员来做,因而在info文件夹下安排一个channel文件,便于不懂程序的人更新渠道。(每一个渠道以换行停止)- #猎取渠道列表channel_file=info/channel.txtf=open(channel_file)lines=f.readlines()f.close()
复制代码 - 找到初始apk
思索到实际中为了避免安装包过年夜,我们一般分为arm和x86两个版本,以是python中撑持以后目次下放多个apk来举行打包。
固然有人会说共用了一个channel文件,多个apk会天生不异市场的对应包。
你也能够修正一下python,使分歧的apk往找分歧的channel文件举行打包。
这里因为我的营业场景如许更便利,我就不修正了。- #猎取以后目次中一切的apk源包src_apks=[]forfileinos.listdir():ifos.path.isfile(file):extension=os.path.splitext(file)[1][1:]ifextensioninapk:src_apks.append(file)
复制代码 - 遍历渠道号并写进apk。
多个apk只是for轮回成绩,我们来看单个apk天生多市场包的代码- #filename(withextension)src_apk_file_name=os.path.basename(src_apk)#支解文件名与后缀temp_list=os.path.splitext(file)#namewithoutextensionsrc_apk_name=temp_list[0]#后缀名,包括.比方:".apk"src_apk_extension=temp_list[1]#创立天生目次,与文件名相干output_dir=output_+src_apk_name+/#目次不存在则创立ifnotos.path.exists(output_dir):os.mkdir(output_dir)#遍历渠道号并创立对应渠道号的apk文件forlineinlines:#猎取以后渠道号,由于从渠道文件中取得带有n,一切strip一下target_channel=line.strip()#拼接对应渠道号的apktarget_apk=output_dir+src_apk_name+"-"+target_channel+src_apk_extension#拷贝创建新apkshutil.copy(src_apk,target_apk)#zip猎取新创建的apk文件zipped=zipfile.ZipFile(target_apk,a,zipfile.ZIP_DEFLATED)#初始化渠道信息empty_channel_file="META-INF/cztchannel_{channel}".format(channel=target_channel)#写进渠道信息zipped.write(src_empty_file,empty_channel_file)#封闭zip流zipped.close()
复制代码 以上Python是属于现学现写,有甚么能够优化的中央还请告诉。
Java工具完成
Python帮我们向apk包中写进了channel信息,Java端固然也必要对应变动才干利用。
因为剖析channel必要往apk也就是zip中往找文件,以是绝对耗时一些。
因而在ChannelUtil.java中,会将找到的channel和对应versionCode存储在静态变量和SharedPreference中,包管本次乃至本版本中channel只从zip中猎取一次。
在Java代码中读取空渠道文件名
从apk中猎取channel,美团留下的代码if(entryName.startsWith("mtchannel"))是有成绩的,应当接纳if(entryName.startsWith("META-INF/mtchannel"))。
我的代码以下:
CoreAnimation---制作动画很强大很喜欢的框架可以用少量的代码写出漂亮的动画CQuartz2D---强大的2D绘图库COpenGL---不用介绍了超级强大的3D库CCoreImage--- |
|