目标 虽然用不上渠道的概念, 其实其实和渠道的概念类似, 其实就是多几个可以变更的字段配置
目前我需要一个boolean, 一个请求的url, config.url =http://10.1.64.42:9082/insure-pad/padServer.do, config.bool = false 我想加快apk打包速度啊, 一方面是还在用eclipse, 二来如果用普通的gradle的farvor方式还是不够快,美团都有v2方案了, 自己搞一搞比较有意思而已
META-INF目录下添加额外信息(不推荐)
然后从代码中读取需要的字段即可
探测敌情
我的思考
我写出了这种形式,http://10.1.104.28:8081/insure-pad/padServer.do,true
, 间隔符用的是逗号, 因为需要和META-INF
拼接后的区分, 这样就能用String#split
进行分割
可是在Windows环境下文件名不能包含/:*?"<>|
这九种字符
我查询Java的Unicode编码, 想用对应字符替代
- 用166
¦
替代:
- 用643
ʃ
替代/
但是从文件名在安卓上读取的字符想扑克牌的方片,识别不了, 此路不走罢
试试URL编码
URL编码 遵循下列规则: 每对name/value由&;符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上"%"。比如"",它的ascii码是92,92的十六进制是5c,所以""的url编码就是。那么汉字的url编码呢?很简单,看例子:"胡"的ascii码是-17670,十六进制是BAFA,url编码是"��"。
但是由于我写的地址,http://10.1.64.42:9082/insure-pad/padServer.do,false
由于我试的是android 5.1的机器, 暂时判定存在特殊字符串, 导致Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
URL编码也不好走
通过文件名转成对应的字符串
其实解决的就是冒号 和 斜杠的转义, 写法如下
将,http://10.1.64.42:9082/insure-pad/padServer.do,false
其中用[SLASH] 表示斜杠/
, 用[COLON] 表示冒号:
还是存在同样的问题, 存在特殊字符串, 会导致Failure[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
所以仍然解决不了问题, 心灰意冷了
APP文件的注释字段中添加渠道信息。(不推荐)
该种方式利用了APK本身是一种zip包的特点,在zip的注释字段中添加渠道信息,并提供了gradle插件。其中数据格式定义如下:
而添加的渠道信息如下所示:
该种方式较前两种方式实现相对麻烦些,特别是渠道信息的获取需要读取整个APK,解析注解,获取渠道信息,另外就是兼容性不是很好。
AndroidManifest.xml中添加渠道信息 (推荐)
渠道信息将被添加到application结点下的子结点meta-data中,如下:
代码语言:javascript复制 <application
android:icon="@7F03000A"
android:label="@7F060014"
android:theme="@7F090083">
<meta-data
android:name="Goapk_Market"
android:value="Goapk">
</meta-data>
该种方式是目前应用最广的一种,比如友盟统计sdk,腾讯统计sdk等。其中name和value可以自由定义,比较灵活。APP可以利用系统API,方便的获取渠道信息,示例代码如下:
代码语言:javascript复制ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String channel = appInfo.metaData.getString("Goapk_Market");
这里采用的是网易云捕精英大队开发了多渠道打包工具,该工具主要基于manifest和meta渠道包制作方式,实现快速批量多渠道包的生成。
命令行下,运行:java -jar makechannels.jar
查看版本号与使用方法:
配置的channels.txt(以|分割, 第一个是配置value, 第二个是配置key, 第三个是配置输出的文件名)
代码语言:javascript复制false,http://10.1.104.28:8081/xxx|CUSTOM_KEY|保全技术
true,http://10.1.104.28:8099/yyy|CUSTOM_KEY|技术微服务
插入成功, 很靠谱
推荐采用通用性较好的manifest方式
java -jar makechannels.jar -apk xxx.apk -config channels.txt -out outputApk
接下来得重新签名, 这里注意安卓从Android 7.0开始引入了v2签名,但是由于app需要兼容之前的机器,所以也必须进行v1签名才可以。如果只进行v2签名,将导致在android7.0之前的机器安装失败;我尝试Java自带的jarsigner可是报错META-INF/MANIFEST.MF has invalid digest for AndroidManifest.xml
, 后来查资料发现还是用网易提供的极速签名工具点击下载靠谱
java -jar apksigner.jar -appname 测试 -keystore debug.keystore -pswd android -alias androiddebugkey -aliaspswd android -v1 true -v2 false in.apk
- -appname 待签名的应用程序名,可选,但建议不同的 APP 填上对应的 app 名(可以为中文),有助于【加速】
- -keystore:后跟.keystore 签名文件
- -alias:后跟签名别名
- -pswd:后跟对应签名的密码,例如这里是 android 可选,如果不填,则签名的时候需要手动输入
最后跟待签名的 apk 路径或者目录路径,如果跟的是目录则是批量签名。
签名后如果包能正确安装到手机(无需运行)则没有问题,如果安装失败请用命令安装 :
adb install apkfile
查看出错信息
最后一步zipalign优化
zipalign -v -f [alignmentSize] in.apk out.apk
(可选)再进行v2签名。
java -jar ApkSigner.jar [-appname test] -keystore keystorePath -alias alias [-pswd password] [-aliaspswd aliasPassword] -v1 false -v2 true out.apk
参考
- 详解高速神器python脚步打包android apk,超级快!!(打包系列教程之六) - CSDN博客 https://blog.csdn.net/javazejian/article/details/50760590
- Android快速批量多渠道包的“蛋生” - 网易云捕博客 - CSDN博客 https://blog.csdn.net/crash163/article/details/51879585
- Android 应用加固工具下载通用工具_网易云易盾 http://support.dun.163.com/documents/15588074449563648?docId=101829642806284288
- 自动化打包apk总结并整合资料 - 简书 https://www.jianshu.com/p/4a07d902066f