我在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是我的项目名称。你的就不一样了。