python 多渠道打包以及在Android7.0系统上的问题

由于安卓应用市场非常多,加上安卓推广渠道众多,我们需要统计一下我们的用户是通过哪一个渠道安装我们的app,这时候我们就需要多渠道来做一个区分。这里我就简单介绍一下python多渠道打包,一些相关的python以及环境就不在赘述了,相信大家都已经非常熟悉了,以下就是多渠道打包流程。

1.创建一个文件夹在文件夹里面创建一个android_channels.txt文本,里面放置所有需要的渠道

xiaomi
huawei
yingyongbao
360mobile
wandoujia
anzhuo_market
baidu
91market
anzhi_market
googleplay

2.创建打包脚本文本channel.py 这个就是我们需要执行的脚本文件

#coding=utf-8

import zipfile
import shutil
import os
import sys

if __name__ == '__main__':
    apkFile = sys.argv[1]
    apk = apkFile.split('.apk')[0]
    # print apkFile
    emptyFile = 'xxx.txt'
    f = open(emptyFile, 'w')
    f.close()
    with open('./android_channels.txt', 'r') as f:
        contens = f.read()
    lines = contens.split('\n')
    os.mkdir('./release')
    #print lines[0]
    for line in lines:
        channelss = line
        channel = 'channel_' + line
#输出apk重命名
        destfile = './release/%s_%s.apk' % (apk, channelss)
        shutil.copy(apkFile, destfile)
        zipped = zipfile.ZipFile(destfile, 'a')
        channelFile = "META-INF/{channelname}".format(channelname=channel)
        zipped.write(emptyFile, channelFile)
        zipped.close()
    os.remove('./xxx.txt')

    #mac
    os.system('chmod u+x zipalign_batch.sh')
    os.system('./zipalign_batch.sh')

    #windows
    #os.system('zipalign_batch.bat')

zip align 优化的 zipalign_batch.sh

if [ -d "release" ]
then
    if [ -d "release/zipaligned" ]
    then
        rm -rf "release/zipaligned"
    fi
    mkdir "release/zipaligned"
    for file in ./release/*
    do
        if test -f $file
        then
            echo "${file##*/}"
            zipalign -v 4 $file release/zipaligned/${file##*/}
        fi
    done
else
    echo "No release folder, can not go on zipalign"
fi

windows系统需要的bat

@echo off
echo begin running
if exist release\zipaligned (
    rd /s /q release\zipaligned
)
md release\zipaligned
for /f "delims=" %%i in ('dir release\*.apk /b') do (
    zipalign -v 4  release\%%i release\zipaligned\%%i
)
echo end running

3.将签名打包好的apk放到当前文件夹下面,通过命令行进入到当前文件夹,然后执行命令

channel.py signed.apk

查看当前文件夹,就会多了个release文件夹,打开release文件夹里面是根据channel_list渠道列表生成的10个APK。里面发现还有一个zipaligned文件夹,zipaligned是什么东西呢。

4.zipalign官方介绍
zipalign is an archive alignment tool that provides important optimization to Android application (.apk) files.
Zipalign是1.6之后引入的,是一个对Apk文件进行存档对齐的优化工具,它的目的是确保所有的未压缩数据都从文件的开始位置以指定的对齐方式排列。尤其是.apk压缩包中的图片资源和未加工处理的相关文件,对齐的方式是以4字节对齐。其好处是能够减少应用程序的RAM内存资源消耗。Google的Android开发文档中特别之处在发布应用到最终客户之前务必使用Zipalign工具对你的.apk文件进行优化。

简单提炼一下就是有以下4个特点:
(1)它是一个优化工具
(2)它是4字节边界对齐
(3)减少内存使用
(4)提高效率

我们先解压一下原始签名但未写入渠道名的signed.apk,我们再解压一个写入渠道名的apk,然后对比APK/META-INF目录,会发现后者多了一个空文件,文件名一般以channel_yingyongbao这种格式来命名,由此可以看来channel后面就是我们用来标记渠道的渠道名。那Python打包的原理就可以简单的理解为通过在APK/META-INF目录写入空文件来标记渠道。

5.Android 7.0系统提示安装找不到安装证书
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
虽然我们建议您对您的应用采用 APK Signature Scheme v2,但这项新方案并非强制性的。如果您的应用在使用 APK Signature Scheme v2 时不能正确开发,您可以停用这项新方案。禁用过程会导致 Android Studio 2.2 和 Android Plugin for Gradle 2.2 仅使用传统签名方案来签署您的应用。要仅用传统方案签署,打开模块级 build.gradle 文件,然后将行 v2SigningEnabled false 添加到您的版本签名配置中:

signingConfigs {
        release {
            try {
                storeFile file(props['KEYSTORE_FILE'])
                storePassword props['KEYSTORE_PASSWORD']
                keyAlias props['KEY_ALIAS']
                keyPassword props['KEY_PASSWORD']
                //android studio2.2之后版本会默认启用V2签名机制,由于我们签名是之前版本的会导致7.0系统以上手机签名                   识别不了导致
                //没办法安装 所以目前这里我们需要先禁用掉
                v2SigningEnabled false
            } catch (ex) {
                throw new InvalidUserDataException("请在app文件夹下添加'signing.properties'文件并配置相应的变量值")
            }
        }
    }

6.android 7.0提示安装失败,安装包不完整
这是因为Android7.0作用域目录访问 在 Android 7.0 中,应用可以使用新的 API 请求访问特定的外部存储目录,包括可移动媒体上的目录,如 SD 卡。新 API 大大简化了应用访问标准外部存储目录的方式,如 Pictures 目录。应用(如照片应用)可以使用这些 API(而不是使用 READ_EXTERNAL_STORAGE),其授予所有存储目录的访问权限或存储访问框架,从而让用户可以导航到目录。
此外,新的 API 简化了用户向应用授予外部存储访问权限的步骤。当您使用新的 API 时,系统使用一个简单的权限 UI,其清楚地详细介绍应用正在请求访问的目录。app内升级会失败,因为下载完apk包之后,发intent安装时,没有读取包所在目录的权限,而导致读取失败,安装失败。
官方文档:developer.android.google.cn
解决方案:

/**
     * 通过隐式意图调用系统安装程序安装APK
     */
    public static void install(Context context) {
        File file = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                , "signed.apk");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        // 由于没有在Activity环境下启动Activity,设置下面的标签
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if(Build.VERSION.SDK_INT>=24) { //判读版本是否在7.0以上
            //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
            Uri apkUri =
                    FileProvider.getUriForFile(context, "com.a520wcf.chapter11.fileprovider", file);
            //添加这一句表示对目标应用临时授权该Uri所代表的文件
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
        }else{
            intent.setDataAndType(Uri.fromFile(file),
                    "application/vnd.android.package-archive");
        }
        context.startActivity(intent);
    }

具体可以参照文章:http://blog.csdn.net/yulianlin/article/details/52775160

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

推荐阅读更多精彩内容