V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Marsss
V2EX  ›  Android

普通 Java 程序中怎么引入 android 包?

  •  
  •   Marsss · 2017-09-17 14:04:11 +08:00 · 8801 次点击
    这是一个创建于 2406 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我知道这个问题对于 android 开发者来说有点幼稚,楼主只是个野生 python 爱好者,平时基本只用 python 实现需求,对于 java 还真的是陌生,咳咳。。。见谅,我尝试过搜索相关资料,但是由于需求有点特殊,找不到线索。希望能得到 V 友的一些指点。

    我的需求是这样的,我需要反编译一个 apk,然后把其中的一段用来加密的函数抠出来,做成一个 jar 独立程序,python 就可以直接去调用这个 jar,获取结果。

    但是我在抠出来的过程中,发现其中用到的一个 App 类,导入了很多 android 开头的包,这些包怎么导进去的呢,反编译的源码里也只看到了:android.net android.support ,没看到其他的包,是和开发环境有关系吗?
    App.class:


    另外这其中的:
    public static App a()
    {
    return b;
    }
    这个函数怎么是这样写的呢,有什么作用?
    13 条回复    2017-09-19 17:09:59 +08:00
    Le4fun
        1
    Le4fun  
       2017-09-17 14:08:06 +08:00
    没太明白 Java 是要 jar 下载放项目里才可以
    TakWolf
        2
    TakWolf  
       2017-09-17 14:14:02 +08:00
    android.* 包需要在 Android 环境下才能运行,JavaSE 环境不行。
    楼主反编译成功了,需要用 Java 标准库替换 android 的一些组件,保证代码可以运行在 javaSe 环境。
    然后才能用 JPype 去调用。
    Marsss
        3
    Marsss  
    OP
       2017-09-17 14:30:32 +08:00
    @TakWolf 意思是,这种 android.*需要另外用 java 标注库来重新写么,那么能不能大概指点一下图片里的那两个函数是起怎么作用,该怎么用 java 标准库来实现呢?
    zengmingyang96
        4
    zengmingyang96  
       2017-09-17 19:27:29 +08:00
    elapsedRealtime 函数返回的是手机自启动以来的毫秒数。
    这个时间可能和加密有关
    你导入 jar 包没用的,这个方法 JNI 调用的,除非你能搞到动态库

    ```
    /**
    * Returns milliseconds since boot, including time spent in sleep.
    *
    * @return elapsed milliseconds since boot.
    */
    native public static long elapsedRealtime();
    ```
    DouO
        6
    DouO  
       2017-09-17 19:39:28 +08:00
    `implementation 'com.google.android:android:4.1.1.4'`
    tairan2006
        8
    tairan2006  
       2017-09-17 19:41:03 +08:00
    把安卓系统库替换掉=,=
    jedihy
        9
    jedihy  
       2017-09-18 07:09:37 +08:00
    ```
    public static App a() {
    return b;
    }
    ```
    单例?
    Marsss
        10
    Marsss  
    OP
       2017-09-18 09:46:06 +08:00
    谢谢大家的讨论,看大家的回复,我的理解是,想直接复现源码并不是靠谱,网上看了一些资料后,我考虑去琢磨一下 xposed,去 hook 相关函数打印变量,可能会稍微坑少一点。
    yzmm
        11
    yzmm  
       2017-09-18 10:39:09 +08:00
    楼主你看到的代码是被混淆之后的,所以会出现这种无聊的方法,其实就是不下让你看到真实逻辑。你在 AS 里面配置 gradle 把你反编译的 jar 加进来就可以调用了。
    vjnjc
        12
    vjnjc  
       2017-09-18 11:12:44 +08:00
    我感觉一个可行的方式是:
    用这部分代码嵌在你的 android 的程序里面,然后 server 用推送的方式向 android app 询问加密 string。

    假如按照你现在的思路,你需要看懂他的 app,然后把相关 android 的 api 换成 javase 的 api,并且因为你是 server 程序,并没有手机启动时间。。。
    bashbot
        13
    bashbot  
       2017-09-19 17:09:59 +08:00
    Android 的 SDK 中有相关的 jar,你下载 android-sdk 把 jar 加载到项目中就能找到这些包了。

    APK 反编译的话,apktool 和 jd-gui 都挺好的。
    你需要把加密的代码抠出来,然后把 android 相关的调用替换掉,标准 JRE 中不能运行 android 包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5373 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:01 · PVG 17:01 · LAX 02:01 · JFK 05:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.