android调试常见问题(持续更新)

本文整理了Android开发中常见的调试问题,包括JNI调用错误、NetworkOnMainThreadException、http相关API引用问题、dex错误、AppCompatActivity找不到、adb调试选择、gradle错误、Android 6.0 adb remount权限、64k引用限制、找不到类等问题,提供了详细的解决办法和代码示例。
摘要由CSDN通过智能技术生成

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_shared

5.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 version
Android Debug Bridge version 1.0.32
Revision 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/9572709

2.执行如下命令
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.cpp

void set_verity_enabled_state_service(int fd, void* cookie) 
{ 
    …… 
    /* Loop through entries looking for ones that vold manages */ 
    for (i = 0; i < fstab-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值