在Eclipse中为NDK应用程序生成签名APK时文件大小不一致



我在Eclipse中为正在开发的NDK应用程序生成有效的APK时遇到了困难。文件大小非常不一致。为了生成APK,我点击我的项目并转到:

Tools --> Export Signed Application Package...

我使用的是Eclipse Juno SR 2、Android NDK r9和ADT 22.3(不是Eclipse的ADT捆绑包版本)。

在多次生成APK并遵循签名过程后,我收到了以下文件大小:

 5268198 app1.apk
12388155 app2.apk
 6092599 app3.apk
12320133 app4.apk
12201439 app5.apk

请注意,在这些"运行"之间,我没有对项目中的任何文件(或项目所依赖的文件)进行任何更改。

还要注意的是,其中一些在部署到我的手机上时可以工作,而另一些则不然。这是非常偶然的!

在将这些文件重命名为.zip文件并检查其内容后,NDK运行生成的lib文件的大小似乎是罪魁祸首。在app1.apk中为1584kb(未压缩),在app2.apk中为14892kb。作为NDK构建的一部分,有一个符号剥离过程,所以我认为这是问题所在,因为这将解释库大小的变化。事实上,在仔细检查签名的APK生成过程时,我注意到较大的APK通常在NDK控制台中有以下输出:

C:/Android/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libnative.so
C:/Android/android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip: unable to rename './libs/armeabi-v7a/libnative.so'; reason: File exists
make: *** [libs/armeabi-v7a/libnative.so] Error 1
make: *** Deleting file 'libs/armeabi-v7a/libnative.so'
make: unlink: libs/armeabi-v7a/libnative.so: Permission denied

我的理论是,当NDK构建正在进行时,Makefile的另一部分可能正在访问lib文件,或者在创建(尚未剥离)后立即访问它。这种干扰导致APK大小的变化。

一时兴起,我尝试在Eclipse中关闭"自动构建",这就成功了,因为我现在可以生成APK,并且它们的大小一致。据推测,Eclipse/CDT对NDK构建脚本没有足够的"知识",无法在NDK构建已经在进行时自动调用NDK构建!

我不应该关闭这个选项,是吗?这是个虫子吗?其他人看到这种行为了吗?使用Eclipse的ADT捆绑包版本的同事没有这个问题。

有解决方案吗?

检查您的.cproject文件。你会期待类似的东西

<storageModule moduleId="refreshScope" versionNumber="1">
    <resource resourceType="PROJECT" workspacePath="/MainActivity"/>
</storageModule>

这里,MainActivity是我的项目名称。你的就不一样了。

最新更新