android 多渠道unity发布android 怎么办

2923人阅读
大吼一声:CSDN的编辑器越来越不好用了!!!再这么搞下去只能移窝了,连个段落起始缩进的效果都没有,还要自己在头部加style,不爽
设置渠道标志
一般方法设置渠道
Android程序比较麻烦的一个地方就是多渠道发布,出于这样那样的原因,需要加个渠道的标记进去,用于统计也好其他原因也好。一般来讲,这个渠道的标记都会放在AndroidManifest.xml的Application的一个MetaData中。然后在Java中就可以通过API去取对应的数据了。
其他方法设置渠道
有些会写到java文件中,比如先搞个java文件,里面定义好对应的渠道,final String的就行,然后打包的时候先用模板替换掉,然后再编译class即可。
如何生成不同渠道的程序
知道放哪里后,就可以考虑如果多渠道打包了,起始中心思想很简单,只要把这个渠道的位置数据给修改掉,重新编译也好,打包也好,能把这个对应的配置文件修改后出一个apk就成。这里其实也有两个办法:
从Eclipse的Ant脚本开始去做文章生成多个渠道的包拿生成好的apk文件,解包,替换,重新打包
第一种方法比较适用于把渠道写在java文件中,然后需要重新编译的类型,第二种方法就比较偷懒了,因为比如是把渠道标志放在配置文件中的话,我们就不需要重新编译了,要做的就是解包替换后重新打包即可。
从Ant开始做这个事情的话,原来还是挺好的(指ADT版本v21之前),现在(v22后)因为把apkbuilder.bat拿掉后,从命令行开始打包就变得扑朔迷离(呃,我还没找到办法,估计得从Eclipse带的ANT脚本那边入手)。现在貌似apkbuiler这个模块被移到了sdk/tools/ant/lib/sdklib.jar中了,反正我没搞明白如何弄,以后抽时间看下Ant和这个估计应该能搞清楚的。所以,我从各个角度都偏向用解包、替换渠道标志、重新打包的方法来整。网上关于多渠道打包的介绍其实也有很多,但是就基本是围绕着这个方法走的。如果有不同的话,最多也就是实现的方式不同、编程语言或者使用的脚本不同罢了,比如我,是使用lua来折腾这东西(os.execute即可方便调用操作系统的shell)。其实用操作系统自带的shell也能搞定,不过这个就是个人喜好了,反正有用bash
shell的(应该是最多的吧),有用Python的,有用Lua的等等等等。下面讲下如何搞。
重新打包程序
首先,要把用Eclipse出的包解开(这里无所谓是debug签名的还是release签名的,无所谓),这里需要用到apktool这个工具(自己去下载吧,网上多了去了,上有整个项目)。解开其实很简单,使用一条命令即可:
apktool d -f xxx.apk xxx
稍微解释下,d表示是decode,-f表示如果目标存在是覆盖。前面那个apk就是你要解包的文件,后面是解出来的文件夹名称。
替换的话,一般都是用正则表达式一类的来搞定,因为我是在windows下操作的,所以没有sed这种好用的命令能搞(装个gow或者估计cygwin里面也能用,不过我喜欢写好后双击点一下,比较方便),于是就选了个Lua的shell来折腾这事情,里面的正则虽然是阉割版的,但是对付对付这种是绰绰有余了。
最好是写个配置文件,方便用来循环打包。我的配置文件是这样写的(Lua的一个表):
-- 渠道配置表
channel_tbl =
{channelName = &应用汇&, channelValue = &yingyonghui&, channelID = &007&},
{channelName = &通用版&, channelValue = &common&, channelID = &012&},
{channelName = &机锋&, channelValue = &jifeng&, channelID = &006&},
{channelName = &360&, channelValue = &m360&, channelID = &013&},
channel_tbl_sdk_ydmm = {
{channelName = &SDK_YDMM&, channelValue = &yidong&, channelID = &009&},
channel_tbl_sdk_91 = {
{channelName = &SDK_ND91&, channelValue = &m91&, channelID = &002&},
然后起个循环,把配置文件替换下生成输出到临时文件中,再使用apktool打包。
还是用apktool,就是参数替换下:
apktool b xxx xxx_unsigned.apk
略微解释下,b表示build package,xxx就是刚才你释放出来的文件夹,xxx_unsigned.apk就是重新打包的文件,价格unsigned的后缀是为了区分这个是未签名的程序,这个时候生成的是一个没有签名的文件,是装不上的,所以下面要增加签名。
给apk签名的话我们用的是JDK中带的工具jarsigner,反正也是个命令行,不过这个参数有点复杂,当然,之前你得自己生成一个key。
命令行是:jarsigner -keystore %1 -storepass %2 -keypass %3 -sigfile CERT -signedjar %4 %5 %6 -verbose -certs
6个参数分别是:
key的路径库的密码key的密码签名后输出的文件名需要签名的原文件key的别名
这里需要注意的是-sigfile这个参数,之前用Eclipse签出来的这个验签的名字已经叫CERT了,后面手动去签名的话,如果不加这个参数会导致生成的验签文件名为key的别名,如果程序已经发布了,会导致平台包指纹不同而不能提交,用这个方法把这个强行指定为CERT,和之前提交的保持一致即可。
其他我就不赘述了,自己去网上搜下好了,文章一大堆。
对齐的话是使用ADT工具中的zipalign工具,这个最好对齐下,程序装载和执行会快很多,因为是和CPU读取数据有关系,对齐的方式能更好的预判和读取。又是个命令行,这个命令行比较简单,这里罗列下:
zipalign -v 4 signed.apk final.apk
-v是用来指明按多少字节对齐,貌似大家用4字节对齐比较多,如果没有什么特殊的应用需求的话,就4字节好了。后面的两个参数分别是签名后的apk和对齐后输出的apk路径。整到这里,一般来讲,一个替换过渠道的APK就出来了。
剩下要做的就是循环配置列表,看看是不是还有其他的渠道要替换打包,继续这个过程,反正都是机器搞的,你就在边上喝喝茶看看结果即可。
其实这种方法是很简单,的关键就是要知道了解apk如何生成(这里其实也没讲如何生成),然后在恰当的地方切入做点修改就好,有点类似于hook,呵呵。使用自己熟悉的语言去搞定吧。
呃,其实这样只是最简单的多渠道打包,还有很多的特殊情况没有处理。我在接入移动商城的支付模块的时候,这个方式打包就出现了问题,表现为,用debug版本的程序一切正常,也能支付,但是当多渠道打包后,进入支付就报初始化失败。这个,我还是留到后面文章再讲好了。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:215382次
积分:3297
积分:3297
排名:第4278名
原创:103篇
转载:26篇
评论:59条
(2)(2)(7)(4)(2)(1)(1)(1)(1)(1)(1)(2)(1)(2)(5)(4)(1)(7)(6)(10)(1)(2)(1)(7)(1)(2)(39)(11)(10)当前位置: >
> android批量多渠道封装
android批量多渠道封装
proficientman & at
android批量多渠道打包  安卓市场太多,一个一个手动打包太累而且容易出错。
  看过有很多Ant批量打包的,还是想试试不一样的方法。
  举个例子,如友盟(真心不是给他打广告)的多渠道统计
  我们只是需要动态的修改这个channel_value,然后打包就可以了。
  1.导出一个未签名的apk包,其中渠道号配置如上图。
  2.使用apkTool解压apk包
  3.根据渠道号修改channel_value
  4.使用apktool重新打包为未签名的apk包
  5.给未签名的apk包签名
  这里选择使用python来实现这些功能,感谢金兄让我认识python(吐槽一下,python为什么没有大括号)
  组织结构如下图:
  其中channel为渠道号列表:
  keystore文件夹内放置着测试工程的签名文件ApkTest.keystore
  ApkTest.apk是未签名的apk包
  下面就是最重要的MakeTool.py文件
  #!/usr/bin/python
# coding=utf-8
import shutil
def readChannelfile(filename):
f = file(filename)
while True:
line = f.readline().strip('\n')
if len(line) == 0:
channelList.append(line);
def backUpManifest():
if os.path.exists('./AndroidManifest.xml'):
os.remove('./AndroidManifest.xml')
manifestPath = './temp/AndroidManifest.xml'
shutil.copyfile(manifestPath, './AndroidManifest.xml')
def modifyChannel(value):
tempXML = ''
f = file('./AndroidManifest.xml')
for line in f:
if line.find('channel_value') & 0:
line = line.replace('channel_value', value)
tempXML += line
output = open('./temp/AndroidManifest.xml', 'w')
output.write(tempXML)
output.close()
unsignApk = r'./bin/%s_%s_unsigned.apk'% (easyName, value)
cmdPack = r'java -jar apktool.jar b temp %s'% (unsignApk)
os.system(cmdPack)
signedjar = r'./bin/%s_%s_signed.apk'% (easyName, value)
unsignedjar = r'./bin/%s_%s_unsigned.apk'% (easyName, value)
cmd_sign = r'jarsigner -verbose -keystore %s -storepass %s -signedjar %s %s %s'% (keystore, storepass, signedjar, unsignedjar, alianame)
os.system(cmd_sign)
os.remove(unsignedjar);
channelList = []
apkName = 'ApkTest.apk'
easyName = apkName.split('.apk')[0]
keystore='./keystore/ApkTest.keystore'
storepass='123456'
alianame='ApkTest.keystore'
output_apk_dir=&./bin&
if os.path.exists(output_apk_dir):
shutil.rmtree(output_apk_dir)
readChannelfile('./channel')
print '-------------------- your channel values --------------------'
print 'channel list: ', channelList
cmdExtract = r'java -jar apktool.jar
d -f -s %s temp'% (apkName)
os.system(cmdExtract)
backUpManifest()
for channel in channelList:
modifyChannel(channel)
if os.path.exists('./temp'):
shutil.rmtree('./temp')
if os.path.exists('./AndroidManifest.xml'):
os.remove('./AndroidManifest.xml')
print '-------------------- Done --------------------'
执行也很简单 &shell终端进入这个文件夹,执行python MakeTool.py就可以
  执行后会在文件夹下生成bin文件夹,根据各个市场的签名文件夹就在里面
  0资源分下载:
  关于python可以参考:
  有不完美的地方请联系我:
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-1993人阅读
废话不多说,上干货:
1.&下载兰贝壳儿Eclipse插件,下载后解压缩OrchidShell.rar
2.&安装兰贝壳儿插件,建立Android工程
安装Eclipse插件,将OrchidShell文件夹拷贝到Eclipse的dropins文件夹下后,启动(重启)Eclipse
在需要打包的Android工程上点击右键可看到菜单&“兰贝壳儿”,说明安装成功
3.&使用配置文件、默认配置文件
兰贝壳儿使用xml作为插件配置文件,当需要打包的工程根目录中不存在配置文件,插件会新建一个默认的配置文件,文件名为bom.xml。
&?xml version=&1.0& encoding=&UTF-8&?&
&!-- 北京兰贝科技有限公司版权所有 --&
&dependencies&
&dependency&
&groupId&com.mon&/groupId&
&artifactId&MarsorUtils&/artifactId&
&version&1.0.0-SNAPSHOT&/version&
&/dependency&
&/dependencies&
&repositories&
&repository&
&id&MarsorRepository&/id&
&name&Marsor Maven Mirror&/name&
&url&:8088/&/url&
&/repository&
&/repositories&
&channels keyname=&channelId&&
&channel value=&baidu& /&
&channel value=&wandoujia& /&
&channel value=&91zhushou& /&
&channel value=&googleplay& /&
&channel value=&360zhushou& /&&/channels&&keystore path=&E:\my\android.keystore& passwd=&123456&&&alias name=&android.keystore& passwd=&123456& /&&/keystore&&outpath value=&E:\Repos\output\& /&&/package&&/project&
4.&使用”打包发布”功能
点击兰贝壳儿菜单中的“打包发布”菜单,可以对工程按渠道分别打包,打包的过程中可以对apk文件进行自动签名。
注意打包发布前,需要修改配置文件中对应的项目:
&channels keyname=&channelId&&
&channel value=&baidu& /&
&channel value=&wandoujia& /&
&channel value=&91zhushou& /&
&channel value=&googleplay& /&
&channel value=&360zhushou& /&
&/channels&
&keystore path=&E:\my\android.keystore& passwd=&123456&&
&alias name=&android.keystore& passwd=&123456& /&
&/keystore&
&outpath value=&E:\Repos\output\& /&
&/package&
其中channels&的keyname=””是指在你的AndroidManifest.xml文件中配置的Application级的&Meta-data&的名称。例如:
&application
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@style/AppTheme& &
&meta-data android:name=&channelId& android:value=&10000& /&
是对应于你要打包的每个渠道名称,也就是统计SDK中渠道的标识符。对于写在这里的每个渠道,插件会自动为其修改meta-data中的value值,并且打包为一个apk文件。然后为这个apk文件进行签名。
这里的keystore就是你对apk文件进行签名时使用的个人密钥。需要你将path修改为你的密钥库路径,passwd为密钥库的密码。
下面的alias是指每个密钥对应的别名,以及对应的密码。如果你有多个alias,可以在这里指定,插件会选取第一个可用的alias以及密码对应的密钥Key对你的apk文件进行签名。
&outpath value=&F:\Repos\android\keystore\output\& /&
这个路径就是你的apk文件自动打包生成出来以后的存放路径。注意插件会在这个路径下创建以你的工程名为名称的文件夹。
代码中获取AndroidManifest.xml中生成的channelId的值:
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(),
PackageManager.GET_META_DATA);
String channelId=appInfo.metaData.getInt(&channelId&);
Log.e(TAG, & msg == & + channelId );
大功告成,这就是神鸟凤凰,嘿嘿,还差个光圈
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53462次
排名:千里之外
原创:10篇
转载:26篇
评论:20条
(2)(2)(3)(2)(1)(2)(22)(2)Android多渠道打包工具 - PeterHuang - 博客园
鉴于Android市场众多,基于各种利益考虑,以及未来app能够更有针对性的投放市场,肯定是要监测每个渠道的数据的。
如果通过eclipse每次修改下渠道名,然后再导出包,如果有十多个渠道要分发,那就得打十多个包,这无疑是很费力的,程序员的精力不应该过多的耗费在这些琐碎重复的事情上。这些琐碎重复的事情能用机器来做最好就让机器来做。
我是一个比较懒的人,不乐意做琐碎重复的事情。几个月前,在网上找了好久,也没发现有能够进行批量多渠道打包的工具,就想着琢磨自己写一个。以前在外包公司做测试的时候学过一些批处理命令和perl脚本,不过忘得差不多了,但是网上搜了下立马就能回忆起怎么用。经过了三四个晚上的奋战,总算是把多渠道打包的工具给写出来了。
该工具能够对Android工程进行编译,混淆,优化,打包,Ant据说也可以,但是不会用也懒得学。我厂用的是Umeng的渠道统计,在AndroidManifest.xml文件里添加如下此句
&meta-data android:value="{qudao_tag}" android:name="UMENG_CHANNEL"&&/meta-data&
即可,把{qudao_tag}填写在配置文件里,工具打包时会自动替换{qudao_tag}为相应的渠道名。
已经用了好几个月了,基本上是稳定了,现在决定把它开源出来,我想还是有很多人需要的。整个工具每个脚本的执行过程如下图所示(clickMeToStartCompile是需要用户点击的,当然点击clickMeToCompile效果也一样):
混淆主要用的是eclipse自动生成的混淆脚本proguard.cfg,但发现自己做的项目用到了webview以及js调用,混淆之后js根本找不到相应的方法,于是最后加了如下这句才好了
-keep public class * extends android.app.Activity{&&& public
protected *; }
,这句其实就是声明所有activity里面的public,protected方法都不要混淆。混淆之后,反馈的错误信息室无法准确定位的,但可以根据错误反馈的方法通过混淆时生成的map找到对应源码的方法。
用命令行编译的方式对认识整个编译的过程是很有帮助的,有兴趣的可以看看下,其中还有不完善的地方,有兴趣有能力的可以帮忙改善下。
有不能使用或是不明白的可以留言问我。
如有转载,请注明出处:&

我要回帖

更多关于 unity发布android 的文章

 

随机推荐