apk-channelization icon indicating copy to clipboard operation
apk-channelization copied to clipboard

Raw file lost after repackage

Open johnsonyuw opened this issue 8 years ago • 7 comments

原始的模板apk中是包含 raw目录下文件,重打包之后 raw目录下文件都丢失了。

johnsonyuw avatar Dec 10 '16 09:12 johnsonyuw

可参考#3

javalue avatar Dec 21 '16 06:12 javalue

@javalue 你可以将修改后的提一个pr

yrom avatar Dec 28 '16 15:12 yrom

好的,@yrom,我在后续开发中,又发现, 在gradle中的那个task,好像在2.2以后就失效了。大致搜了一下,好像是那个afterEvaluate的函数更新了,这是一个问题。然后是2.2打出来的apk好像精简掉了一些zip(apk)信息,会导致unzip失败,好像是报什么unzip 超过1980,请问有什么好的办法去解决吗。

javalue avatar Dec 28 '16 15:12 javalue

@javalue 1980这个问题我遇到过,unzip之后很多文件的时间都会变成低于1980,然后使用

shutil.make_archive(tempzip_name, 'zip', temp)

进行zip打包的时候会判断文件时间,在zipfile.py:

        self.filename = filename        # Normalized file name
        self.date_time = date_time      # year, month, day, hour, min, sec

        if date_time[0] < 1980:
            raise ValueError('ZIP does not support timestamps before 1980')

我的解决方法是在unzip后进行修改时间,把time<1980的都改成now:

  • repackage.py
    os.system('unzip -q '+apkfile+' -d '+temp)

    # update time
    updatetime.update_file_time(temp)
  • updatetime.py
#!/usr/bin/env python
import os, time

def update_file_time(dir_path):
    for root,dirs,files in os.walk(dir_path):
        for file in files:
            file_path = os.path.join(root, file)
            st = os.stat(file_path)
            mtime = time.localtime(st.st_mtime)
            file_time = mtime[0:6]
            #ZIP does not support timestamps before 1980
            if file_time[0] < 1980:
                now = int(time.time())
                os.utime(file_path, (now, now))

nukc avatar Dec 29 '16 01:12 nukc

@yrom 工头,我提了个PR https://github.com/Bilibili/apk-channelization/pull/4 ,你看看。。

nukc avatar Dec 29 '16 01:12 nukc

@javalue unzip失败是因为Android升级了签名方式导致。话句话说,这个多渠道打包的方式已经落伍了~ 如果你的项目已经开始使用v2签名,建议参考或使用美团的兼容v2签名的渠道打包方式Walle

yrom avatar Feb 17 '17 13:02 yrom

@yrom 这个之前就有看到过,把channel写在zip的block里,有点不算是“正规”的方法,而且对apk安装和app的启动有一定的影响。

javalue avatar Mar 15 '17 02:03 javalue