Android开发中的问题集锦
1:编译签名apk后如何输出日志
2:低版本手机上无法安装apk
Android打包生成DEX文件过程中, 单个DEX文件可被引用的方法总数被限制为65536,超出会导致应用无法安装。
- 需要在app.gradle中进行引用Multidex支持库,将一个dex拆分为多个:
1> defaultConfig {
...
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies { compile 'com.android.support:multidex:1.0.0' }
application中重写以下方法:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base); MultiDex.install(this);
}
- 直接在Application -- onCreate方法中添加
MultiDex.install(this);
3:Android 9.0设备访问页面报 net::ERR_CLEARTEXT_NOT_PERMITTED
9.0新加的限制,对未加密url直接放弃请求 (http的url均不可以),如想正常访问需在Application中添加红框中的内容
4:Android Studio/Idea AAPT2 错误
AAPT 全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。在 Android SDK 目录下可以找到它。
1 > com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT2 error
2 > 在高版本中禁用AAPT2配置作废,报错信息如下 :
The option 'android.enableAapt2' is deprecated and should not be used anymore.
Use 'android.enableAapt2=true' to remove this warning. It will be removed at the end of 2018..
出现以上2种问题的公共解决方式为以下第二和第三条
- 在 gradle.properties 文件中,增加 “android.enableAapt2=false”,禁用AAPT2 (仅在错误1中可用)
- 构建 App 的时候,打开 Build 窗口,点击 “Toggle View” 切换到文本输出,根据gradle 的执行输出查看排除问题进行解决
- 查看程序目录/gradle目录是否存在中文,如果有则根据本章5的步骤进行修改
5:更改gradle缓存目录
在这里说下我更改缓存目录的原因,因为我用户名称之前是中文的(实属脑残党)所以用新版Android Studio时AAPT2检测异常,又无法禁用,网上有好几种方式更改后不觉得有用,所以只能永久的更改目录啦。
把C:\Users\xx\.gradle目录删除掉,然后在其他盘新建目录(换盘符是因为.gradle文件夹的内容会不断增加,切记不要有中文,不然换盘符没意义)
设置系统变量:GRADLE_USER_HOME,变量值为自己新建的.gradle目录
为什么要配置变量呢,因为在gradle-wrapper.properties文件中有配置此路径,至于能不能直接在这里更改路径应该也可以,自己试下吧
系统变量配置成功后,根据下图内容进行选择后重新build下即可,如果出现异常:Unexpected lock protocol found in lock file. Expected 3, found 0.可能是有缓存之类的没清除,按照图2清除掉缓存即可。可以查看原目录下是否有生成.gradle,有Bug的话请留言赐教 ^ ^
6:安卓通知栏使用
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);Notification builder = new NotificationCompat.Builder(IntentActivity.this) .setContentTitle("通知信息") .setContentText("通知内容") .setWhen(System.currentTimeMillis()) .setSmallIcon(R.mipmap.ic_cool) .build();manager.notify(1,builder);
Notification必须包含标题,标题内容,小图标三个属性,否则会发生异常,通知栏中将不显示通知内容
7:java.lang.RuntimeException: Unable to instantiate service xx.MyServiceActivity$MyService: java.lang.InstantiationException: class xx.MyServiceActivity$MyService has no zero argument constructor
项目中的服务是内部类,然后创建时报错,根据错误提示在MyService中添加了无参的构造函数,依然报错.....
然后将内部MyService类声明成静态类后,完美解决。
8:service
如果startService()、 bindService()一起被调用的话,onCreate()方法只在startService()时调用一次;销毁服务时需要调用unBindService()和stopService(),否则服务还存在。
当使用startService()启动服务时,当前Activity被销毁,那服务依然存在;当使用bindService()启动服务时,Activity销毁则服务也被销毁。
9:scrollView + listView动态布局
当listView列表中的控件有Button的时候,会导致listView.setOnItemClickListener()事件无效
解决方式:
1> 将列表中的Button控件换成TextView
2> 将listView布局替换成LinearLayout
10:vivo x9安装apk报 -- 解析包错误
解决方式:
转载自:https://blog.csdn.net/xudailong_blog/article/details/85013539
11:在Android studio目录下更改gradle build tools 版本
按照标识的目录找到build.gradle.ftl文件,编辑修改并保存,build tools版本默认为Android Studio Ide的版本号
gradle-projects目录下是各种项目模板配置文件,默认新建的是NewAndroidProject项目
12:Android ANR文件生成类型
APP出现Anr的时候默认会在/data/anr/下生成anr的日志文件traces.txt,每次生成都会替换文件内容,但因Android手机的多样性,SDK版本的更新,有些手机的anr文件会丢失,有些生成的文件名称会改变,经过测试多款手机大致分为:
1> 正常生成 /data/anr/traces.txt 文件
每次发生anr,文件都会被替换,文件内容为最后一次出现anr时的日志
2> 生成/data/anr/traces_包名.txt文件
根据应用包名生成anr日志文件
3> 生成/data/anr/traces_包名_年月日.txt文件
根据应用包名和发生时间生成日志文件
4> 在/data/anr/下没有anr的日志文件
可以通过adb bugreport抓取日志,但是抓取的日志种类比较多,文件会很大,根据以下图片所说内容,并没有在当前项目路径下生成文件,应该会有默认的路径,但是没找到,后续找到会更新这里
13:命令获取文件md5值
certutil -hashfile libcomm.so MD5
14:不将第三方库打入jar包
15:获取so库路径
Context.getApplicationInfo().nativeLibraryDir + "so库名称"
16:AndroidStudio升级到3.5最新版本
编译报错:D:\A_work\.gradle\caches\modules-2\modules-2.lock ,打开多个as项目导致,关闭掉多余项目即可,是否还有其它原因还未证实
17:AndroidStudio LogCat窗口找不到的解决办法
按图的步骤操作即可找到,或者直接用快捷键Alt+6
18:部分真机设备连接正常不显示日志的解决办法
实测 MX6 :打开【设置】中的【开发者选项】,页面底部找到【性能优化】,打开【高级日志输出】,勾选【全部允许】即可
其他类型的设备可以自行测试,但我觉得应该不会差太多
19: Android studio编译报错“android:TextAppearance.Material.Widget.Button.Inverse not found”
更改v7版本与api一致,重新编译
20:子线程中解析Crash日志并发送导致Anr的解决方式
自定义CustomCrashHandler类实现Thread.UncaughtExceptionHandler,在uncaughtException类中开启子线程解析错误日志并发送,如果不将异常提交给默认的异常处理器 ,会导致ANR
public class CustomErrorHandler implements Thread.UncaughtExceptionHandler { private ErrorPriCallback mErrorPriCallback; public CustomErrorHandler() { } private Thread.UncaughtExceptionHandler otherHandler; /** * 初始化,注册Context对象, 获取系统默认的UncaughtException处理器, 设置该CrashHandler为程序的默认处理器 * * @param errorPriCallback 异常出现后处理方式回调 */ public void init(ErrorPriCallback errorPriCallback) { mErrorPriCallback = errorPriCallback; otherHandler = Thread.getDefaultUncaughtExceptionHandler();//之前这里没有加,导致anr Thread.setDefaultUncaughtExceptionHandler(this); } public void setHandler(Thread.UncaughtExceptionHandler handler) { otherHandler = handler; } /** * 异常发生时,系统回调的函数,我们在这里处理一些操作 */ @Override public void uncaughtException(final Thread thread, final Throwable ex) { // 提示用户程序即将退出 new Thread(new Runnable() { @Override public void run() { PApmLog.trace("crash-----> uncaughtException "); // 崩溃信息 mErrorPriCallback.priInfo(CRASH, thread, ex); // 如果有其他的handler在此处理 if (otherHandler != null) { PApmLog.trace("crash-----> uncaughtException "+otherHandler); otherHandler.uncaughtException(thread, ex); } } }).start(); }}
更多相关文章
- [PX3][Android7.1]学习笔记 --- init.rc文件格式介绍
- 编译TensorFlow Android(安卓)Camera Demo
- android文件存储的五种方式简介
- Android(安卓)Studio中svn的使用(全部在这里)
- Android调试.so库常用工具
- Android开发框架介绍
- Error:(22, 0) Could not find method android()
- Android(安卓)Studio 快捷键 (Mac OS X)
- Android(安卓)recovery 原理分析