有一个工程,引用了几个lib,用eclipse生成apk(姑且称为旧apk)现在,我取出旧apk,然后修改了lib,也就是说,我现在手上有的是旧的apk和已经修改的lib,没有旧的apk源码,如何将旧的apk和已经修改了的lib打包成新的apk?

解决方案 »

  1.   

    1.cmd执行:java -jar apktool.jar d test.apk apkfile
    最后的apkfile是目录解包后的目录。
    如果被解包的apk里有3方的lib,那解包后就会在apkfile目录下生成lib目录,你再把要替换的动态库放进去。2.cmd执行:java -jar apktool.jar b apkfile test2.apk
    这样会把apkfile目录再打包成apk,apk的文件名是test2
      

  2.   

    apktool在android sdk的目录里有,自己找下。
      

  3.   

    补充一下:
    如果你想修改别人的apk里的lib库,那我这样的方法是行不通的,因为一般apk都会做签名,
    按照我的方式你最后打包的apk是没有签名的,那依然是不行的。除非你有原始apk打包时的签名文件。
      

  4.   

    没事,apk是我自己写的,我这样做的目的是不让别人知道我的apk源代码,只让他们修改lib,但是我还有个问题,我的程序没有用动态库,我说的lib是android library,也不是jar包
      

  5.   

    还有,apktool这个工具是网上用来解包的那个apktool吗?如果是这个,我试过,里面就一堆smali文件,不知道怎么搞
      

  6.   

    apktool是个jar文件,用来解压apk用的。其实apk就是个压缩文件,你用winrar是可以打开apk文件的。
      

  7.   

    这些我都知道,就是你说的把修改了的动态库替换进去这一步不知道怎么走,我的lib其实就是一个工程,然后把它的属性设为Is Library,那替换,是用什么样的文件替换呢,这其实就是我不懂的地方
      

  8.   

    smali的话就可以修改了啊
    然后再用apktool里面的工具,好像是aapt还是啥的,可以在把这些smali重新做成class.dex
      

  9.   

    那就晕了,我把android工程设为Is Library之后,是没有class.dex文件的
      

  10.   

    建议你看一下android ant build的build.xml文件,里面是详细的build的步骤,不知道你的lib是jar还是.so,去看看build.xml吧,个人猜测是先aapt解包,然后你在用ant,修改一下build.xml。
    只是建议,没这样搞过,不知道行不行
      

  11.   

    就是把一个工程,右击属性,在android选项卡选中Is Library,是没有生成什么的,具体看下这个http://www.mielf.net/featherelf/simple-android-library-project
      

  12.   

    谢谢大家指导,问题已经解决,虽然办法有点老土,也跟大家分享一下:
    1,用apktool把apk解包,得到的文件夹里面有各种资源,我这里需要的主要是smali文件夹的东西;
    2,用baksmali把android Library工程的classes.dex文件转成.smali文件;
    3,把需要替换的.smali文件替换到第一步得到的smali文件夹里面的文件;
    4,用apktool重新打包;
    5,用apksign签名,最后得到的apk就是结果。