android调试常见问题(持续更新) 1.jni调用时出现以下错误failed: dlopen failed: cannot locate symbol “rand” referenced by xxx通常是ndk编译的平台太低导致,打开jni的Application.mk,修改里面的APP_PLATFORM值大一点,比如APP_PLATFORM := android-11就可以2.奔溃:android.os.NetworkOnMainThreadException解析:在主线程中的网络异常。也就是不能在主线程中做网络请求之类的耗时操作,建一个子线程来处理即可示例如下:public void createSocket(){ new Thread(runnableSocket).start(); } Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle data = msg.getData(); String val = data.getString("value"); Log.i(TAG,"请求结果:" + val); } } final static String LOCAL_ADDR="com.woozon.team"; Runnable runnableSocket = new Runnable(){ @Override public void run() { Message msg = new Message(); Bundle data = new Bundle(); try { int mSocketId = new Random().nextInt(); LocalServerSocket mLss = new LocalServerSocket(LOCAL_ADDR+mSocketId); LocalSocket mReceiver = new LocalSocket(); mReceiver.connect(new LocalSocketAddress(LOCAL_ADDR + mSocketId)); mReceiver.setReceiveBufferSize(500000); mReceiver.setSoTimeout(3000); LocalSocket mSender = mLss.accept(); mSender.setSendBufferSize(500000); data.putString("value","成功"); } catch (IOException e1) { data.putString("value","失败"); } data.putString("value","请求结果"); msg.setData(data); handler.sendMessage(msg); } }3.当你用android studio 移植老的项目时(用到apache 的http相关api),编译版本大于23时可能会遇到以下的引用找不到的问题import org.apache.http.client.methods.HttpRequestBase;其主要是23以上的版本将不再内核中使用apache的想过类,不过你要使用可以加一条useLibrary 'org.apache.http.legacy’来使用,但是如果是新项目最好淘汰掉该类,以免哪一天真用不了了,怎么加如下加在Module对应的gradle文件中,示例如下android { compileSdkVersion 25 useLibrary 'org.apache.http.legacy' defaultConfig { applicationId "im.delight.faceless" minSdkVersion 17 targetSdkVersion 25 }4.编译jni提示下面错误:undefined reference to ‘__atomic_fetch_add_4’A:STL链接换成动态库即可:在Application.mk中将APP_STL := c++_static修改成 APP_STL := c++_shared或者将APP_STL := gnustl_static修改成 APP_STL := gnustl_shared5.inet_ntoa函数使用注意事项返回点分十进制的字符串在静态内存中的指针。printf(“%s : %s\n”, inet_ntoa(addr1), inet_ntoa(addr2)); //注意这一句的运行结果运行结果192.168.0.74 : 192.168.0.74 //从这里可以看出,printf里的inet_ntoa看起来只运行了一次。返回值char *的空间是在inet_ntoa里面静态分配的,后一次的调用会覆盖了强一次的char静态空间,所有出现上面的奇异现象6.android studio中每次编译都弹出选择在那台机子上调试(多台机子一起调试时)1).app 运行配置选项(Run/Debug Configurations-app-General)中"use same device for future launches" 该句选项 勾选去掉2).file-settings-Build,Execution,Deployment-Instant Run-"Enable Instant Run to hot swap code/resource …"勾选去掉7.提示gradle错误:Unsupported method:BaseConfig.getApplicationIdSuffix往往是gradle版本太老了,将Project的gradle中引入最新的即可,例如:dependencies { classpath 'com.android.tools.build:gradle:2.3.1' }改成==dependencies { classpath 'com.android.tools.build:gradle:3.0.1' }8.Android 6.0 adb remount后没有写权限,提示Read-only file system问题描述:在Android6.0 的userdebug模式编译的版本上(eng版本不存在该问题),发现使用adb remount 系统之后,还是不能对system分区进行操作,提示没有写权限,为只读文件系统Read-only file system解决方法:解决方法如下方法一:使用新的adb工具包1.下载最新的adb工具包查看是否为adb最新版本:adb versionAndroid Debug Bridge version 1.0.32Revision 09a0d98bebce-android(有该信息表明是最新的1.0.32版本,旧的1.0.32版本没有该信息)最新版本的adb增加了一些adb命令,如 adb disable-verity等,可通过adb help查看安装的adb是否支持disable-verity命令最新的adb工具包下载地址如下:http://download.csdn.net/detail/linuxarm521/95727092.执行如下命令1). adb root 2). adb disable-verity (最新的adb 工具包才支持adb disable-verity命令,如果是Linux开发环境,则可使用工程编译结果目录out/host/linux-x86/bin下的adb执行文件) 3). adb reboot 重启设备 (只要不刷机,以上步骤执行一次就行) 4). adb root 5). adb remount 现在可以对system分区进行读写了注意点:1.新版本的adb工具 adb shell 进入命令行之后,Ctrl+c不能退出,可输入exit退出2.可点击adb\run_adb.bat文件直接启动adb方法二:修改系统源码修改源码中的fstab文件,把system分区的verify标志去掉如把/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system ext4 ro wait,verify修改为/dev/block/platform/mtk-msdc.0/11230000.msdc0/by-name/system /system ext4 ro wait其他:adb disable-verity命令在系统源码中的控制system\core\adb\set_verity_enable_state_service.cppvoid set_verity_enabled_state_service(int fd, void* cookie) { …… /* Loop through entries looking for ones that vold manages */ for (i = 0; i fstab-num_entries; i++) { if(fs_mgr_is_verified(fstab-recs[i])) { if (!set_verity_enabled_state(fd, fstab-recs[i].blk_device, fstab-recs[i].mount_point, enable)) { any_changed = true; } } } …… } static int set_verity_enabled_state(int fd, const char *block_device, const char* mount_point, bool enable) { …… if (adb_write(device, new_m