apktool:是GOOGLE提供的APK编译工具,能够反编译及回编译apk,同时安装反编译系统apk所需要的framework-res框架,清理上次反编译文件夹等功能。
aapt:将资源文件编译成二进制文件.尽管你可能没有直接使用过aapt工具, 但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。
下载(下最新的):
https://code.google.com/p/android-apktool/
至于环境呢,当然是要可以执行java了,并且安装了gcc等编译工具等等,zlib必不可少哦
环境信息:
OS:Centos 环境
zlib:1.2.5+ (官网是1.2.8,你直接编译安装这个就可以了) http://www.zlib.net/
注意:记得把java、apktool、apktool.jar、aapt都加到环境变量内~已经在重新安装zlib后要执行ldconfig相关工具我已经上传到百度网盘 下载 http://pan.baidu.com/share/link?shareid=1345746703&uk=1426502039
源码方式安装zlib:
下载:http://www.zlib.net/,或者到我百度网盘内下载
步骤:
#如果你系统是64位的,你还必须要单独编译一个32位的,因为aapt不支持64位,所以必须要先执行
[root@kinggoo.com zlib-1.2.8]# mkdir -p /usr/local/{zlib,zlib64} [root@kinggoo.com zlib-1.2.8]# export CFLAGS=-m32 [root@kinggoo.com zlib-1.2.8]# ./configure --prefix=/usr/local/zlib && make && make install
注意还要在把64位的也编译了,不然恐怕你机器就起不来了,只能跟我一样去机房里面编译配置了。
[root@kinggoo.com zlib-1.2.8]# export CFLAGS=-m64 [root@kinggoo.com zlib-1.2.8]# ./configure --prefix=/usr/local/zlib64 && make && make install
不报错则OK
接着执行(如果你没有把)
没有编译64位的zlib导致的,或者说是我没有拷贝到对应的lib目录下导致的下面的问题
而如果在重启系统时,出现类似下面这种错误,是由于libz.so的问题,系统找不到了
Checking configuration files for slapd: bdb_db_open: unclean shutdown detected; attempting recovery.
bdb_db_open: Recovery skipped in read-only mode. Run manual recovery if errors are encountered.
[root@kinggoo.com zlib-1.2.8]# cp /usr/local/lib/libz.so.1.2.8 /lib/libz.so.1.2.8 [root@kinggoo.com zlib-1.2.8]# ln -sf /lib/libz.so.1.2.8 /lib/libz.so.1 [root@kinggoo.com zlib-1.2.8]# ln -sf /lib/libz.so.1.2.8 /lib/libz.so [root@kinggoo.com zlib-1.2.8]# cp /usr/local/zlib64//lib/libz.so.1.2.8 /lib64/ [root@kinggoo.com zlib-1.2.8]# ln -sf /lib64/libz.so.1.2.8 libz.so [root@kinggoo.com zlib-1.2.8]# ln -sf /lib64/libz.so.1.2.8 libz.so.1 [root@kinggoo.com zlib-1.2.8]# cp /usr/local/zlib/lib/libz.so.1.2.8 /usr/local/lib/ [root@kinggoo.com zlib-1.2.8]# cp /usr/local/zlib64/lib/libz.so.1.2.8 /usr/local/lib64 [root@kinggoo.com zlib-1.2.8]# ln -sf /usr/local/lib/libz.so.1.2.8 /usr/local/lib/libz.so [root@kinggoo.com zlib-1.2.8]# ln -sf /usr/local/lib/libz.so.1.2.8 /usr/local/lib/libz.so.1 [root@kinggoo.com zlib-1.2.8]# ln -sf /usr/local/lib64/libz.so.1.2.8 /usr/local/lib64/libz.so [root@kinggoo.com zlib-1.2.8]# ln -sf /usr/local/lib64/libz.so.1.2.8 /usr/local/lib64/libz.so.1 [root@kinggoo.com zlib-1.2.8]# ldconfig [root@kinggoo.com zlib-1.2.8]# updatedb
ok这时候几乎就不会有错误了。
拆解格式:
apktool d kinggoo.apk kinggoo
apktool有一些参数,主要看你是需要修改哪部分东西,大概一般都是直接就可以了
最后重新打包
apktool b kinggoo kinggoo.com.apk I: Checking whether sources has changed... I: Checking whether resources has changed... I: Building resources... I: Copying libs... I: Building apk file...
最后运行没问题
啰嗦一下,如果你的包内使用了外部的一些类库等,可能在你重新编译后依然没办法正常运行软件内的一步分功能,这时你可以试试这个思路。当然这个程序必须是你自己的,可以得到原始的无签名的apk。
方法是,1)你将未签名包正常解压出来比如是A目录。
2)使用apktool反编译得到B目录
3)修改B目录内需要修改的数据
4)将B目录重新打包成apk,比如叫B.apk(是未签名的)
5)接着在解压重新打包后的B.apk成为BB文件夹文件
6)使用BB文件夹文件覆盖掉A目录文件夹
这时这个应该功能上来说是没什么问题了,除非在你代码里又引入一些其他的比较恶心的写法。
参考信息:
下面这个问题出现多半也是因为重新编译了zlib,而appt版本太老导致,请在google下载对应的aapt以及apktool等工具
/var/www/html/source/tmp/kinggoo/res/values/styles.xml:137: error: Error retrieving parent for item: No resource found that matches the given name '@*android:style/Theme.Dialog'. /var/www/html/source/tmp/kinggoo/res/values/styles.xml:145: error: Error retrieving parent for item: No resource found that matches the given name '@*android:style/Theme.Dialog'. /var/www/html/source/tmp/kinggoo/res/values/styles.xml:153: error: Error retrieving parent for item: No resource found that matches the given name '@*android:style/Theme.Dialog'. /var/www/html/source/tmp/kinggoo/res/values/styles.xml:161: error: Error retrieving parent for item: No resource found that matches the given name '@*android:style/Theme.Dialog'. Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 4, --target-sdk-version, 4, -F, /tmp/APKTOOL8730309660863791006.tmp, -I, /root/apktool/framework/1.apk, -S, /var/www/html/source/tmp/kinggoo/res, -M, /var/www/html/source/tmp/kinggoo/AndroidManifest.xml] at brut.androlib.Androlib.buildResourcesFull(Androlib.java:358) at brut.androlib.Androlib.buildResources(Androlib.java:283) at brut.androlib.Androlib.build(Androlib.java:206) at brut.androlib.Androlib.build(Androlib.java:176) at brut.apktool.Main.cmdBuild(Main.java:228) at brut.apktool.Main.main(Main.java:79) Caused by: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 4, --target-sdk-version, 4, -F, /tmp/APKTOOL8730309660863791006.tmp, -I, /root/apktool/framework/1.apk, -S, /var/www/html/source/tmp/kinggoo/res, -M, /var/www/html/source/tmp/kinggoo/AndroidManifest.xml] at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:357) at brut.androlib.Androlib.buildResourcesFull(Androlib.java:336) ... 5 more Caused by: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 4, --target-sdk-version, 4, -F, /tmp/APKTOOL8730309660863791006.tmp, -I, /root/apktool/framework/1.apk, -S, /var/www/html/source/tmp/kinggoo/res, -M, /var/www/html/source/tmp/kinggoo/AndroidManifest.xml] at brut.util.OS.exec(OS.java:89) at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:355) ... 6 more
在反编译后,重新打回原始包,出如下错误,需要在编译zlib环境配置时执行export CFLAGS=-m32,在上面有提到
[root@kinggoo.com tmp]# apktool b temp b.apk I: Checking whether sources has changed... I: Checking whether resources has changed... I: Building resources... Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 4, --target-sdk-version, 4, -F, /tmp/APKTOOL2297571230398991014.tmp, -I, /root/apktool/framework/1.apk, -S, /var/www/html/source/tmp/temp/res, -M, /var/www/html/source/tmp/temp/AndroidManifest.xml] at brut.androlib.Androlib.buildResourcesFull(Androlib.java:358) at brut.androlib.Androlib.buildResources(Androlib.java:283) at brut.androlib.Androlib.build(Androlib.java:206) at brut.androlib.Androlib.build(Androlib.java:176) at brut.apktool.Main.cmdBuild(Main.java:228) at brut.apktool.Main.main(Main.java:79) Caused by: brut.androlib.AndrolibException: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 4, --target-sdk-version, 4, -F, /tmp/APKTOOL2297571230398991014.tmp, -I, /root/apktool/framework/1.apk, -S, /var/www/html/source/tmp/temp/res, -M, /var/www/html/source/tmp/temp/AndroidManifest.xml] at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:357) at brut.androlib.Androlib.buildResourcesFull(Androlib.java:336) ... 5 more Caused by: brut.common.BrutException: could not exec command: [aapt, p, --min-sdk-version, 4, --target-sdk-version, 4, -F, /tmp/APKTOOL2297571230398991014.tmp, -I, /root/apktool/framework/1.apk, -S, /var/www/html/source/tmp/temp/res, -M, /var/www/html/source/tmp/temp/AndroidManifest.xml] at brut.util.OS.exec(OS.java:89) at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:355) ... 6 more aapt: error while loading shared libraries: libz.so.1: wrong ELF class: ELFCLASS64
出现这种错误,你懂的,要么没安装,要么安装后lib的so包没有在PATH内,或者没有ldconfig
error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
还有如果在往回打包的时候如果出现aapt: /lib/libz.so.1: no version information available (required by aapt),则需要升级你的zlib,首先肯定是卸载掉你自身系统内的zlib ,卸载方法如下:
rpm -e --nodeps --allmatches `rpm -qa|grep zlib`
然后重新安装
而下面这种问题是因为此图根本不是9.png图(九妹图),甭管它,估计在这个文件夹下会有mode_line.png图
W: Cant find 9patch chunk in file: "drawable-hdpi/mode_line.9.png".
可能看着比较乱,没办法写完之后好久了,都忘记当时为什么这么写了~
好资料,我用的是 RHL-6.0_64 aapt 弄不起来,升级了 zlib 工具之后可以了。但是 zlib 依赖标准 c 库,这里浪费了我一点时间。
搞定了吧 工作太忙好久没看博客里的留言了 真抱歉。 64位是会遇到很多问题 记得把lib里面的so都要替换 做好下一个为zlib在系统里这样出问题直接卸载还方便
android支持直接运行py么?
应该是支持的,你可以搜搜 估计应该有这些类库什么的 。不好意思啊,这段太忙一直没有登陆博客
额外的应用我知道。我想问的是是否原生支持直接运行
原生的话 我只是猜测啊,应该是可以的 你可以试试看 写个简单的py在root过的手机里运行一下
没root的,就是纠结。我在google上搜索,找到的结果都是怎么把py转换成app的方法
这个就不是很了解了,我也不知道做这方面开发的,只是需要去做这个事情,我才去了解了一些~ 还望原谅啊
我也不是搞这个的,只是想把自己写的一些小脚本放到手机上运行
那不行的 是执行不了的,我有试过
Android App应用包增量升级(one)
哦 对了直接运行是不行的 我想起来了,这个是需要弄成so包来实现javah -jni com.kinggoo.bspatch .build.BSpatch 大概java是这样生成so包的,不知道你那个了
好复杂啊。还要编译
不然android不让你去做这个事情,他会认为是恶意的