androidso调试
A. Android:无线调试就是这么简单
平时我们调试APP的时候,会将手机连接到USB数据线,然后再将数据线连接到电脑上。但是,由于长期插拔或者USB线材材质的问题,经常会出现无法连接的问题;而且,通常公司内会有手机多而线不够用的问题;还有就是,桌面上一堆手机一堆线是不是感觉很乱?就像下图一样
此时,我们就需要用到无线调试了。那么,什么是无线调试呢?这还用问,就是没有线呗——手机和电脑连接的时候不需要用数据线了,我们部署调试APP时再也不用到处找USB线了,再也不用担心线材磨损导致的无法连接了!!
1、 将手机和电脑用USB数据线连接
2、 打开 终端,输入 adb devices , 查看手机和电脑是否连接成功。如下图:
3、为手机设置一个Tcp/Ip 的侦听端口
4、将手机与电脑断开连接(不断也行),并查看手机的 ip 地址
5、执行 adb connect ip地址:侦听端口 命令,开启无线连接
6、查看连接设备
7、通过无线连接部署应用到APP
到此,无线调试已经搭建成功。
1、连接成功之后,不论是手机还是电脑,如果中间出现了断网现象(比如,重启手机,重启电脑,重启路由器等),需要重新走一遍流程
2、由于网络防火墙或者网络代理等因素,无线连接可能不会成功
3、连接不成功时,可以尝试通过 adb kill server 杀死 adb 服务,然后再次走一遍流程
Android 调试桥(官方文档,含有完整的adb 命令介绍):
https://developer.android.com/studio/command-line/adb.html?hl=zh-cn
本文到此结束,谢谢观看!
如有不足,敬请指正!
B. 用android studio引入第三方so库,怎么调不了方法
之前一直没有做过第三方的推送消息,这次公司要求采用国内极光第三方推送服务,由于项目还在原型图构思中,因而还可以花点时间看看这方面的东西。
看了下相关的DEMO,挺简单的,加点权限,把相关的广播以及服务注册一下就好了,然后在application中初始化一下,就解决了。可偏偏这么简单的几步,确花了我一点时间去调通。
过滤了相关的log如下
06-21 15:00:53.080 3006-3006/com.soo.jchatdemo E/JPush: [JPushInterface] System.loadLibrary::jpush215java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.soo.jchatdemo-2/base.apk"],nativeLibraryDirectories=[/system/lib, /vendor/lib, system/vendor/lib, system/vendor/lib/egl, system/lib/hw]]] couldn't find "libjpush215.so"
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo W/System.err: at cn.jpush.android.api.JPushInterface.init(Unknown Source)
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!]
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo W/System.err: at cn.jpush.android.api.JPushInterface.init(Unknown Source)
06-21 15:00:53.100 3006-3006/com.soo.jchatdemo E/JPush: [JPushGlobal] JPush .so file do not match JPush .jar file in the project, Failed to init JPush
很
明显告诉我们,目前缺少了libjpush215.so文件。奇怪的是这so库已经在我们项目的libs中,之前在eclipse中这样完全能跑起来的。
问题是Android
Studio目前在打包的时候并没有在libs中复制SO库到项目中。因此我们需要在build.gradle中告诉AS执行复制so库文件。
android {
...
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs']
}
}
}
然后重新Sync Now一下,整个世界都明亮了
C. 如何实现在android studio中附加模式调试app
我在学习的过程中,亲历的这件事:项目组要做一个复杂的工程,分为sdk工程和demo工程,里面有java和jni层
而so和aar是sdk工程中生成的,拷贝到demo工程中编译成最终apk。
java层的调试,是简单的。可以在运行的时候用sdk工程的android studio附加app,如果直接用demo附加,sdk中的源码有些并不好显现,只能通过工程目录jar文件来查看。
而so层的附加,默认情况下是不可行的,因为jni层调试是启动型调试,我们来看下android studio处理各种调试行为的过程:
java层调试:
adb push 1.apk /data/local/tmp/1.apk
am start -D -n com.example.test/.MainActivity
android studio等待app状态正常
设置断点
执行remote connect,使用java调试协议附加
jni层调试:
adb push 1.apk /data/local/tmp/1.apk
am start -D -n com.example.test/.MainActivity
android studio等待app状态正常
adb push lldb_server
./lldb_server ..............建立Lldb调试服务器
lldbfrontend.exe ...........连接lldb调试服务器
向lldb_server发送附加调试命令
设置java/c层断点
执行remote connect,使用java调试协议附加
附加调试:
设置断点
执行remote connect,使用java调试协议附加
1.在研究过程中发现jni层在编译时生成2个so,带符号的是obj/local目录下的so,apk中编译好的的so是可以不带符号的,此时用gdb调试,吧文件设置为带符号的so,即可调试。继续研究发现带符号的so和无符号的so,前面字节完全相同。
2.android studio建立jni工程,需要自动安装lldb,修改gradle脚本,build.gradle
debug {
jniDebuggable true
}
3.android studio附加按钮只是采用Run/Debug Configuration中的Remote Configuaration
从上述过程可见,附加并不能触发jni层调试步骤,而jni层调试步骤又是写死的,必须把前面加载apk部分去掉,于是对android-ndk.jar做修改
最终实现了效果。其中一些重要的类:
IDevice:描述移动设备
Client:描述app包进程
AndroidNativeDebugProcess 控制jni调试,和lldb_server通信
AndroidNativeDeubgRunner 控制调试器部分
AndroidNativeRunConfiguration 配置Run/Debug Configuration中的Natvie-Debug选项,我在里面添加了用户app进程列表方便调试
配置界面控件
AndroidLLDBDebuggerContext jni层建立lldb调试器
AndroidLLDBDriver 实现基本调试功能
D. 如何在Android studio下调试ndk
android studio ndk调用过程如下:
通过jniaes案例说明调用NDK层配置过程
而我们通过底层来判断签名是否正确,如果正确则继续执行核心代码,否则退出程序,这样就可以防止别人恶意反编译,并进行二次打包。
首先去官网下载一个最新的NDK,随便放到哪都行,像我放在D:DevAndroidandroid-ndk-r10d.
(1) 新建一个项目:名称JniAes
首先在java类中添加native接口,注意写好native接口和System.loadLibrary()即可。代码如下:
1 public synchronized static native String getFromNativeIv();2 public synchronized static native String getStringFromNative();3 public synchronized static native int jniCheckAPP(Context context);4
然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:
aesapp
(2)接下来跟class文件生成相应的.h头文件,执行如下命令即可
点击"View->Tool Windows->Terminal" 即在Studio中进行终端命令行工具.执行如下命令生成c语言头文件.javah -d jni -classpath c:-16android.jar;....uildintermediatesclassesdebug com.aes.jniaes.MainActivity
(3)然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫strk.c 。
strk.c文件,用于实现核心代码逻辑,判断包名.哈希值是否合法,如果返回1,为合法。反之,则不合法。入口方法为:jint Java_com_aes_jniaes_MainActivity_jniCheckAPP(JNIEnv* env, jobject context, jobject thiz)
接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:
sdk.dir=D:\Dev\Android\android-sdk-windowsndk.dir=D:\Dev\Android\android-ndk-r10d
(4)接下来在app mole目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:
defaultConfig { applicationId "com.aes.jniaes" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" ndk { moleName "checkapp-jni" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。 } }
(5)最后就是添加静态初始化loadLibrary代码,添加如下:
static { System.loadLibrary("checkapp-jni"); //so文件的名字 }
编译出来的so文件在aesappuildintermediates dkdebuglib目录下
那么如何将编译好的so文件进行使用,可以通过如下方式:
二 .引用so文件
(1).在“src/main”目录中新建名为“jniLibs”的目录;
(2).将so文件复制、粘贴到“jniLibs”目录内。