1

我有文件res/raw,我想像这样打开:

AssetFileDescriptor afd = getResources().openRawResourcesFd();

例如,这允许通过 获得确定的文件大小afd.getLength(),这InputStream.available()并不保证,即使它似乎通常工作。

但是,当我尝试这样做时,它失败了:

java.io.FileNotFoundException:这个文件不能作为文件描述符打开;它可能被压缩了

这些只是小文本文件。有什么问题?

4

1 回答 1

4

aapt在构建过程中压缩大部分资源。根据引用 aapt 来源的这篇文章,例外情况是:

/* these formats are already compressed, or don't compress well */
static const char* kNoCompressExt[] = {
    ".jpg", ".jpeg", ".png", ".gif",
    ".wav", ".mp2", ".mp3", ".ogg", ".aac",
    ".mpg", ".mpeg", ".mid", ".midi", ".smf", ".jet",
    ".rtttl", ".imy", ".xmf", ".mp4", ".m4a",
    ".m4v", ".3gp", ".3gpp", ".3g2", ".3gpp2",
    ".amr", ".awb", ".wma", ".wmv"
};

因此,解决此问题的一种方法是通过使用其中一个扩展名重命名文件来欺骗 aapt。

这似乎不太令人满意。相反,如果您想在例外列表中添加扩展名,您可以编辑[sdk]/tools/ant/build.xml. 在文件中搜索nocompress

        <aapt executable="${aapt}"
                command="package"
                versioncode="${version.code}"
                versionname="${version.name}"
                debug="${build.is.packaging.debug}"
                manifest="${out.manifest.abs.file}"
                assets="${asset.absolute.dir}"
                androidjar="${project.target.android.jar}"
                apkfolder="${out.absolute.dir}"
                nocrunch="${build.packaging.nocrunch}"
                resourcefilename="${resource.package.file.name}"
                resourcefilter="${aapt.resource.filter}"
                libraryResFolderPathRefid="project.library.res.folder.path"
                libraryPackagesRefid="project.library.packages"
                libraryRFileRefid="project.library.bin.r.file.path"
                previousBuildType="${build.last.target}"
                buildType="${build.target}"
                ignoreAssets="${aapt.ignore.assets}">
            <res path="${out.res.absolute.dir}" />
            <res path="${resource.absolute.dir}" />
            <nocompress extension="txt"/>
            <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
            <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
        </aapt>   

底部的评论是不言自明的。我插入了例外txt。请注意,您也可以一起关闭压缩。

或者,创建一个特殊的扩展:

<nocompress extension="nocomp"> 

并重命名您的文件,例如whatever.txt.nocomp. 这样,您可以对除特定文件之外的所有内容进行压缩。

于 2013-11-02T14:54:18.857 回答