`
wx1569578408
  • 浏览: 71459 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java的反射在Android中的应用

 
阅读更多

    可能,与你所期待的内容有点不一样。今天回来的时候,叫了滴滴。上车后,由于我的距离比较近,滴滴就指挥司机先送我到站。没错,后面坐了一名女子。

    她突然大声说道:“你要去哪里?!”司机回应道:“先送他回去呀。”

    “你这都离我那边越来越远啦!”女子略显着急。

    “什么?!从这里过桥呀!”

    “哦。。。”

    我差不多到的时候,女子显得更加着急的样子,“呵,我都不知道你开到哪里了!”

    司机无奈道:“就到了,马上就送你回去了!”仿佛吃了什么反胃的东西,刚要吐出来又吞了回去的样子。唯独我一个人在前排偷笑,不禁感叹一下,社会治安真是越来越好了。

 

    回到正题,今天在看百度语音sdk的时候,发现并没有开放完全离线的功能。那么完全离线到底有多重要?如果你的客户处于网络极差的环境,一次语音合成要耗掉6秒的时间,他不把你家产品砸了都算客气了。幸亏以往遇到的客户都是比较客气的,使用的时候都是把网络断开的。今天就想处理一下百度语音没开放完全离线功能的这个问题。

    文档中说明了在线离线语音判别的基本逻辑 

    

    看到这个,我想如果能让第一步直接跳到离线就好了。百度语音类库中肯定存在网络连接判断,我需要找出在哪个地方进行了判断,然后通过java的方式重写或通过反射的方式植入自己的代码改变其判断结果。思路就这是样的。

    遗憾的是,在我调试程序的时候,调用speak就直接调用了libbdtts.so里面的方法完成了逻辑判断。于是知道核心代码不是放在java上,而是放在封装好的二进制类库中。

    但是,天无绝人之路。我找了一下通过ndk判断网络连接状态的相关资料,但没找到。想会不会是通过ndk调用java进行判断的呢?我先从sdk中找到了与网络状态相关的一个类,NetworkInfo: https://developer.android.google.cn/reference/android/net/NetworkInfo

    

    这两个方法返回的就是android的网络连接状态。换言之,我可以让这两个方法返回false试试。

    猜想有了,接下来是如何实现的问题。android代码的运行过程是先通过classloader加载编译后的dex文件,然后通过dalvik虚拟机运行。android5.0后就是art了。这里我没有使用java的反射直接实现,那需要自己写代理类和代理方法。找了一个android的aop框架,直接拿来用。

    找了一个阿里巴巴开源的aop框架,https://github.com/alibaba/dexposed, 没错,关键字是dex。遗憾的是还没支持android5.1,只好把源码拉取下来看看他们的进度如何。果然,android5.0以上有在测试中,遂编译了一下,试试。

    在语音初始化后,调用如下代码进行设置:

private static final XC_MethodHook hookOfflineCallback = new XC_MethodHook() {
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
        if (hook)param.setResult(false);
        else {
            ConnectivityManager manager = (ConnectivityManager) mSpeechSynthesizer.context.getApplicationContext().getSystemService(Application.CONNECTIVITY_SERVICE);
            param.setResult(manager.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED);
        }
    }
};
DexposedBridge.findAndHookMethod(NetworkInfo.class, "isConnected", hookOfflineCallback);

    找到isConnected的方法,返回false就OK了。(其实我一开始试的是isConnectedOrConnecting,没有效果,以为兼容性的问题。后来才试验的isConnected这个方法,有反应)上面是最终修改的代码,只执行了beforeHookedMethod,然后返回结果。如果beforeHookedMethod不做返回,会出现程序奔溃的问题,aop框架没有处理好,所以这里通过另类的方式解决:

    通过一个成员变量"hook"判断是否开启完全离线模式,如果使用原来的模式,就通过getState()来判断网络状态是否连接,避开经过代理的isConnected()方法。(否则会出事)

    联网的状态下试验结果:

    默认是连网调用返回结果的,声音也会比较好听

    

    hook离线后:

        

    可以看到hook后执行了代理方法,返回网络连接状态为false, 然后百度语音库验证本地离线证书再合成语音。 看来确实是通过so调用java进行判断呢。测试了一下,稳定性还可以。就是dexposed这个框架跟不上,后续隐患待观测。

    结论,java是世界上最好的语言。世界晚安,惠州晚安。。。

 

 

转载于:https://my.oschina.net/eyesos/blog/2247706

分享到:
评论

相关推荐

    java反射机制的原理及在Android下的简单应用

    ### Java反射机制的原理及在Android下的简单应用 #### 一、Java反射机制的基本概念 反射(Reflection)是指程序在运行时能够访问、检测和修改它自身的能力。这种能力使得程序能够动态地获取自身的结构信息并操作...

    android系统java反射机制详解

    在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...

    利用java反射调用Android隐藏Api

    利用java的反射原理来调用 Android隐藏api 应用开发必备哦 详细描述: http://blog.csdn.net/y_haiyang/article/details/9924925 ====================关注小鱼=================== 新浪微博:...

    android java反射,通过图片名获取图片

    在Android开发中,Java反射是一种强大的工具,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在不直接调用的情况下执行类的方法。在给定的场景中,“android java反射,通过图片名获取图片”这个主题...

    Android-注解与反射注解知识点反射知识点注解java反射

    在Android开发中,注解(Annotation)和反射(Reflection)是两个重要的概念,它们极大地提升了代码的可维护性、灵活性和动态性。本篇将详细阐述这两个知识点,并结合实际示例进行讲解。 **注解(Annotation)** 1...

    Java反射机制的学习

    在Android应用开发中,反射机制尤其重要,因为某些系统类或方法被Google用`@hide`注解隐藏,无法直接在SDK中使用,反射提供了访问这些隐藏功能的途径。 要使用Java反射,首先需要获取到`Class`对象,这是反射操作的...

    java 反射 报错 no such method exception

    ### Java反射机制与NoSuchMethodException详解 在Java编程中,反射是一种强大的机制,允许程序在运行时检查和修改自身结构和行为。然而,当开发者尝试使用反射调用一个不存在的方法时,便会遇到`java.lang....

    Android平台与Web服务数据交互时运用Java反射机制解析数据的研究.pdf

    在数据交互过程中,使用Java反射机制可以实现域对象信息的动态解析,并封装成JavaBean类供应用程序使用。这种机制可以减少代码的重复和增加代码的复用,并提高数据交互的效率。 Java反射机制的实现主要是依赖java....

    Java反射以及在Android中的特殊应用

    关于反射,一般书上的定义是这样的:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的...

    Android JNI多线程编程回调JAVA函数

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在处理性能敏感的任务,如图形渲染...理解并熟练运用这些技术,将有助于提升Android应用的性能和质量。

    Java基础+Android面试题

    11. Android权限处理:如何在Android应用中使用和管理权限。 12. Android热修复原理:介绍了Android应用热修复的原理和实现方法。 13. Android插件化入门指南:解析了Android插件化的概念和VirtualApk框架。 14. ...

    JAVA简单的反射案例

    在本篇文章中,我们将探讨Java反射的基本概念、如何使用以及其在实际开发中的应用,结合“JAVA简单的反射案例”这一主题。 1. **什么是Java反射**: Java反射机制允许我们在运行时动态地获取类的信息(如类名、...

    Java反射机制的原理及在Android下的简单应用[归纳].pdf

    在Android开发中,反射机制有着广泛的应用,尤其是在处理框架内部逻辑、插件化开发、API兼容性等问题时。 一、反射的基本概念 反射的核心在于`java.lang.Class`类,它是所有Java类的元数据类,提供了获取类信息...

    java面试宝典android版 源码

    总的来说,这份"Java面试宝典Android版源码"提供了丰富的学习资源,可以帮助开发者深入理解Java语言在Android环境中的应用,以及如何将Web技术有效地融入到Android应用中。通过对源码的阅读和实践,开发者可以提高...

    《JAVA和ANDROID开发学习指南 第2版》PDF

    《JAVA和ANDROID开发学习指南 第2版》是一本专为初学者和有一定基础的开发者设计的综合教程,旨在深入浅出...通过阅读和实践书中的内容,你将能够熟练掌握Java编程和Android应用开发,为自己的职业生涯打下坚实的基础。

    反射机制在Android开发中的应用.pdf

    随着Android系统在智能手机领域的普及,越来越多的开发者投身于Android应用开发。至2013年,Android市场应用数量已达到80万,但在开发过程中,有时会遇到API限制导致优秀的软件设计无法实现。为突破API的限制,调用...

    Java反射机制测试Demo

    下面我们将深入探讨Java反射机制及其在实际开发中的应用。 首先,`Class`对象是反射的基础,每个类在内存中都有一个对应的`Class`对象,通过这个对象我们可以获取到类的所有信息,包括类名、访问修饰符、父类、接口...

    android 反射注解框架

    在Android开发中,注解(Annotation)和反射(Reflection)是两种非常强大的工具,它们能够帮助开发者实现更灵活、高效且可维护的代码。本文将深入探讨如何利用这两种技术构建一个简单的Android框架,并阐述其主要...

    android使用webView实现java程序与js脚本的相互调用

    通过上述步骤,我们可以在Android应用中使用WebView实现Java与JavaScript的交互。这种技术广泛应用于混合应用开发,使开发者能够充分利用两者的优势,为用户提供更好的体验。在实际开发中,需要根据具体需求灵活运用...

    java反射android的r文件的示例

    Java反射在Android开发中是一个强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法,即使在编译时我们并不知道它们的具体信息。在这个示例中,我们将探讨如何利用反射动态地获取Android资源文件`R.java`...

Global site tag (gtag.js) - Google Analytics