Apk根据不同渠道更换SDK

作者: 落魄的安卓开发 | 来源:发表于2018-04-27 17:52 被阅读62次

    需求是这样的

    开发者接入sdk,接入成功之后提供apk,拆包对里面的sdk内容进行更替,得以实现不同渠道接入不同的SDK

    实现步骤拆解如下:

    1. apk接入jar包
    2. 将其他渠道的jar包通过dx.jar 转化成 dex
    3. 将dex通过baksmali转化成smali
    4. 拆包将相关jar包的smali替换成目标渠道的samli
    5. 打包,签名即可

    1. apk接入jar包 + 修改jar包

    pass

    2. 将jar包转化成dex

    dx --dex --output=myjar_dex\classes.dex myjar
    

    options:

    --output=<这里是打出来的dex所在的目录\dex文件名>
    
    myjar : 是jar包所在目录
    

    执行成功之后就会在myjar_dex文件夹下打出一个classes.dex文件。

    3. 将jar包转成的dex转化成smali

    java -jar baksmali.jar -o baksmaliout classes.dex
    

    options:

    java -jar baksmali.jar : 执行baksmali.jar 这个jar文件
    
    -o baksmaliout : 输出的文件夹
    
    classes.dex : 是即将转化的dex文件
    

    执行成功之后会在当前文件夹下生成一个baksmaliout文件夹,在该文件夹下生成了smali

    4. 通过apktool对apk进行拆包,并删除对应的smali

    apktool d replacejar.apk
    

    对apk进行拆包,在replacejar文件夹下会解析出该apk所有的smali文件,进行替换即可

    5. 替换成功,使用apktool进行打包

    apktool b replacejar
    

    再进行签名,install即可

    附加内容:使用命令打jar包

    1. 将java文件编译成.class文件

      把某个目录下的java文件编译成.class文件命令如下:

       javac com\thc\pack\*.java -d bin
      

      options:

      com...*.java : 是java文件所在目录

      -d : 生成的class文件地址

      生成class之后就可以通过java命令执行java文件中的代码,这里需要注意如下:

      如下Utils类:

       package com.thc.myjar.utils;
      
       public class Utils {
           public static void main(String[] args) {
               System.out.print("jar success");
           }
           public static int cacu(int a, int b) {
               return CacuUtil.cacu_add(a, b);
           }
           public static String str(String msg) {
               return StrUtils.doString(msg);
           }
       }
      

      如果想通过java命令来运行改文件需要在与包名同级的目录下执行cmd命令,如下:

       E:\WorkSpace\TestPack\myjar\src\main\java\mybin>java com.thc.myjar.utils.Utils
      

      Utils的class文件在mybin\com\thc\myjar\utils目录下,我们在mybin目录下打开cmd命令,执行上述命令即可

      除了上面一种方式,还有另外一种方式如下,不要给java文件加包名:

        public class Utils {
            public static void main(String[] args) {
                System.out.print("jar success");
            }
            public static int cacu(int a, int b) {
                return CacuUtil.cacu_add(a, b);
            }
            public static String str(String msg) {
                return StrUtils.doString(msg);
            }
        }
    
    这样,我们就可以在和class文件同级目录下执行javac命令
    
    1. 将生成的class文件打到jar包中去

      在打jar包的时候需要注意和上面同样的问题,就是执行cmd命令所在的目录是和包名最外层目录同级的。在和com同级目录下执行如下命令:

       jar -cvf my.jar com
      

      options:

      -cvf : c表示要创建一个新的jar包,v表示创建的过程中在控制台输出创建过程的一些信息,f表示给生成的jar包命名

      my.jar : 打出来的包的命名

      com : 是打包的目录

    相关文章

      网友评论

      本文标题:Apk根据不同渠道更换SDK

      本文链接:https://www.haomeiwen.com/subject/fxjilftx.html