title: Android知识 author: 书虫 tags:
- 技术原理 categories:
- 工作 top: false date: 2021-01-13 21:01:00
https://github.com/JsonChao/Awesome-Android-Notebook
Window指得是什么?
各厂商手机Debug时的问题
我用的是VIVO X21A,Android 8.1.0系统,遇到的奇怪问题如下:
开发者模式打开之后,无法连接adb命令,导致无法连接Android Studio。反复开关debug开关无效,切换debug充电,传输文件等无效。最后发现重启之后就可以了。
安装完测试包之后,所有功能无法正常联网,全部显示网络错误。而且部分功能一旦触发直接崩溃,就好像是安装包不完整一样。这在其他手机上是没有遇到过的。我原本以为是系统时间被修改了,检查了一下,发现使用的是网络时间。最后找出了问题原因。引用别人的文章内容如下:
Android Studio 3.0会在debug apk的manifest文件application标签里自动添加 android:testOnly="true"属性,导致IDE中run跑出的apk在大部分手机上只能用adb install -t <apk>来安装,在oppo手机上甚至安装不了。
解决办法:
在gradle.properties(项目根目录或者gradle全局配置目录 ~/.gradle/)文件中添加
android.injected.testOnly=false测试有效。
值得研究的技术专题
1. Activity 启动流程 和 AMS 那些事
2. Context 与 Android四大组件
3. Activity Manager Service 与 Window Manager Service
4. 自定义View系列(onMeasure、onLayout、onDraw)、事件传递
5. Android ClassLoader机制(插件化准备)
6. Android 资源打包流程(插件化)
7. Java反射 注解
8. Android 插件化与热修复技术
9. Fragment框架解析
手势返回框架
Android中的进程和线程
Binder机制
Flutter上手
Android Push原理
dex 与 Android 虚拟机
gradle task系列
OpenGL技术视频特效处理
知识点记录
经常遇到的代码错误总结
历史原因,项目中既有com.alibaba.fastjson.JSONObject又有org.json.JSONObject。把com.alibaba.fastjson.JSONObject强制转换成org.json.JSONObject导致错误。
代码混淆:有多少次花大把的时间调试bug最后发现是实体类被混淆了导致的。实体类混淆创造了在同一个地方跌倒的最大次数的记录。
4.x系统机型上兼容问题
ListView中类转换异常,错误日志。
java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to
android.widget.AbsListView$LayoutParams
at android.widget.ListView.setupChild(ListView.java:1901)导致错误的代码是按下面第一行写法写的,第三行写法是正确的。
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
view.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,AbsListView.LayoutParams.MATCH_PARENT));这是因为在4.x系统上setupChild原代码是这样写的
AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
if (p == null) {
p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
}所以 导致类转换异常。
ImageView
缺省的scaleType是FIT_CENTER
Android文件路径
什么是APP专属文件?
所谓专属文件就是它是属于某个具体的应用的,他的文件路径都带有相应的包名,当APP卸载时,它们会随应用一起删除,当我们在设置里面手动清除某个应用数据时(不是清除缓存),它们也会一起被清掉。Android使用这种专属文件的目的就是为了方便文件管理,避免文件随意保存,显得很乱,另一个目的就是为了当应用被卸载时不会留下很多垃圾文件。
清除数据和清除缓存到底清除了什么数据
清除缓存:我们知道应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据。
清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。
内部保存,外部保存,机身保存
机身保存;机身保存是指手机自身携带的保存空间,出厂时就已经有了,4.4以前机身保存就是内部保存,4.4及以后机身保存包含了内部保存和外部保存
Android手机路径
在Google Pixel 3A, Android Q手机上测试结果如下:
Context().getExternalCacheDir()
Context().getExternalCacheDirs()对应的路径是/storage/emulated/0/Android/data/com.xxx.xxx/cache
Context().getFilesDir()对应的路径是/data/user/0/com.xxx.xxx/files
Context().getCacheDir()对应的路径是 /data/user/0/com.xxx.xxx/cache
Environment.getExternalStorageDirectory()
Environment.getExternalStorageDirectory()对应的路径是 /storage/emulated/0
小结:
- 安卓4.x的系统getFilesDir()返回的路径是/data/data/packname/files
- 安卓6.x+系统getFilesDir()返回的路径是/data/user/0/packname/files
- 其他API也有类似变化 关于安卓系统路径的更多讨论,参考彻底搞懂Android文件保存---内部保存,外部保存以及各种保存路径解惑
Android中.9图片的含义
绘制之前先来说一下.9图片的四条黑边的意义,每条黑边的意义都不一样。
- 顶部:在水平拉伸的时候,保持其他位置不动,只在这个点的区域做无限的延伸(拷贝)
- 左边:在竖直拉伸的时候,保持其他位置不动,只在这个点的区域做无限的延伸(拷贝)
- 底部:在水平拉伸的时候,指定图片里的内容显示的区域
- 右边:在竖直拉伸的时候,指定图片里的内容显示的区域
