如何从Web代码(PHP)中运行APK工具

3
基本上,当用户上传一个 .apk 文件时,我需要解码它并从 apk 内部的 AndroidManifest.xml 文件中提取一些信息。当我在命令行中运行以下命令 apktool decode BluetoothChat.apk 一切都很顺利。输出结果如下:
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Loading resource table from file: /home/tashax/apktool/framework/1.apk
I: Loaded.
I: Decoding file-resources...
I: Decoding values*/* XMLs...
I: Done.
I: Copying assets and libs...

然而,如果我尝试使用php的exec()函数从webcode执行它,就会出现错误。它在I: Loading resource table from file: /home/tashax/apktool/framework/1.apk处失败,我认为它找不到framework/1.apk文件。这似乎是设置问题,有人做过类似的事情或知道我缺少什么吗?以下是从网页运行apktool时的错误:
I: Baksmaling... 
I: Loading resource table... 
I: Loaded. 
W: Could not decode attr value, using undecoded value instead: ns=android, name=versionCode, value=0x00000001 
W: Could not decode attr value, using undecoded value instead: ns=android, name=versionName, value=0x0000000d 
Exception in thread "main" java.lang.NullPointerException at   java.io.Writer.write(Writer.java:157) 
at brut.androlib.res.util.ExtMXSerializer.writeAttributeValue(ExtMXSerializer.java:38) 
at org.xmlpull.mxp1_serializer.MXSerializer.attribute(MXSerializer.java:673) 
at   org.xmlpull.v1.wrapper.classic.XmlSerializerDelegate.attribute(XmlSerializerDelegate.java:106) 
at org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper.writeStartTag(StaticXmlSerializerWrapper.java:267) 
at org.xmlpull.v1.wrapper.classic.StaticXmlSerializerWrapper.event(StaticXmlSerializerWrapper.java:211) 
at brut.androlib.res.decoder.XmlPullStreamDecoder.decode(XmlPullStreamDecoder.java:46) 
at  brut.androlib.res.decoder.ResStreamDecoderContainer.decode(ResStreamDecoderContainer.java:34) 
at brut.androlib.res.decoder.ResFileDecoder.decode(ResFileDecoder.java:100) 
at brut.androlib.res.AndrolibResources.decode(AndrolibResources.java:114) 
at brut.androlib.Androlib.decodeResourcesFull(Androlib.java:93) 
at brut.androlib.ApkDecoder.decode(ApkDecoder.java:98) 
at brut.apktool.Main.cmdDecode(Main.java:128) 
at brut.apktool.Main.main(Main.java:65)

谢谢!


我猜测这个来自Web的问题可能缺少一些环境变量设置。 - maxjackie
我仍然无法找到解决方案。 - t0x13
最终使用 AXMLPrinter2.jar 来读取 AndroidManifest.xml 文件,或者你可以使用 aapt dump badging 命令。apktool 要求您以普通用户身份运行它。 - t0x13
2个回答

2

终于找到了根本原因。

请注意此行输出(从命令行运行): I: 从文件加载资源表:/home/tashax/apktool/framework/1.apk

当在 PHP 中运行 apktool 时,当前用户没有主目录,那么 apktool 将无法成功创建 ~/apktool/framework/1.apk。

检查 apktool 的选项。有一个选项可以更改框架文件目录:        --frame-path             使用指定的目录作为框架文件

因此,请更改命令行并添加此选项: apktool decode --frame-path /tmp BluetoothChat.apk

现在它能正常工作了。


我想这可能与webuser没有主目录有关,但得出结论是没有办法绕过它。很惊奇你找到了解决方法。虽然最终我使用了不同的工具完成了工作,但这对下次会非常有帮助,感谢分享! - t0x13
默认情况下,apktool在构建模式下没有--frame-path选项。如果您想使用apktool在PHP中重新构建APK,请参考https://code.google.com/p/android-apktool/issues/detail?id=427。connor.tumbleson为此问题提供了完美的解决方案。 - Frank He

0

这个错误

W: 无法解码属性值,使用未解码的值代替:ns=android,name=versionName,value=0x0000000d

意味着找不到资源。您安装的框架不是来自该ROM /手机(无论APK源自何处),或者Apktool已过时。

Apktool v1.5.0支持Android 4.1.x,而Android 4.2尚未受支持。


好的,我遇到了同样的问题。apktool无法从PHP中工作,但是完全相同的代码行在终端下可以运行apktool。 - Frank He

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接