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」目錄內。