1.gc overhead limit exceeded
react-native run-andorid 总是提示device not found, 但是adb devices 能发现模拟器。而且同时有gc overhead limit exceeded错误,并提醒gradle内存分配不够。我更新了genymotion,错误一样。后来按照提示在~/.gradle/gradle.properties中增加了
1 | org.gradle.jvmargs=-Xmx2048M |
这样gradle就不报错了,执行react-native run-android成功安装到模拟器。
其实一开始按照提示来做,就不会有问题,只是我认为之前一直没有改gradle配置,也可以运行,并且./gradlew assembleRelease打包也没问题,只有debug有问题,所以认为是模拟器问题。最终还是gradle的问题,下次先按提示来改,这个提示还是正确的,并不是误报。
2.Gradle下载的依赖包位置
2.1 下载包的位置
Mac系统默认下载到:
/Users/(用户名)/.gradle/caches/modules-2/files-2.1
或
~/.gradle/caches/modules-2/files-2.1Windows系统默认下载到:
C:\Users(用户名).gradle\caches\modules-2\files-2.1或者在android studio中切换到project下,右键 -> Library Properties….
2.2 com.android.support:appcompat-v7
如果我在build.gradle中没有设置maven { url "https://maven.google.com"}
,那么搜索com.android.support:appcompat-v7时,是到Android SDK下:/Library/Android/sdk/extras/android/m2repository/com/android/support/
,没有到~/.gradle/caches/modules-2/files-2.1中,导致一直报错找不到这个依赖(jcenter没有这个包,所以没法下载,必须要google自己的maven库)。
如果设置了
maven { url "https://maven.google.com"}
,那么就不需要用Android SDK Manager下载suport包和buildTools,gralde会自动下载到自己的本地缓存中。
3. 实用命令
- 列出所有configurations: ./gradlew project –info 不过这个没什么用处,还是看5.2的命令
- 查找依赖: ./gradlew :app:dependencies –configuration compile
- clean: ./gradlew clean
- install debug: ./gradlew installDebug
- check: ./gradlew check
- dependencies: ./gradlew androidDependencies
- favor: ./gradlew -q dependencies app:dependencies –configuration fatDebugRuntimeClasspath
- 好用: ./gradlew :app:dependencies –configuration fatReleaseRuntimeClasspath > a.txt
4. Genymotion 2.12在mac 10.13.4上的安装错误
苹果系统更新了安全限制,virtual box安装不了。解决方案是安装时,选择自定义安装路径,这个时候去settings->security中允许安装来自Oracle,回到安装界面再选择自动安装。done.
做地图功能时,需要zoom in,zoom out,是按住鼠标右键,移动鼠标左键。
https://docs.genymotion.com/latest/Content/03_Virtual_Devices/Interacting_with_virtual_devices/Multi_touch_simulation.htm
Android Studio自带的模拟器,现在是速度快了,按时RN打印PixelRatio时,1920 * 1080打印了2.625,TODO:这个是什么原因,不是2,不是3,是2.625?
5. Android test
5.1 查看依赖冲突
./gradlew :app:dependencies --configuration debugAndroidTestApk
,很有可能test apk用的库和普通的apk用的库版本不一致,出现版本冲突。修改app/build.gradle中的test部分。
1 | androidTestCompile ('com.android.support.test:runner:1.0.2', { |
5.2 test的启动类
Android Stuido 3.2自带的测试apk启动类是android.support.test.AndroidJUnitRunner
,如果是com.android.support.test:runner:1.0.2
,那么就要指定新的启动类
1 | android { |
被@Test注解的方法不需要以’test’开头做前缀。
1 | # 查找Android编译时依赖 |
6 Androd Studio “no module”错误
导入工程后,File -> Sync Project With Gradle File。我发现了一个错误,testApplicationId不能与主ApplicationId一样。删掉这个就testApplicationId就可以了。
https://blog.csdn.net/cjm2484836553/article/details/69334941
7. 设置设备的host
前提设备必须root,不root不行。
1 | # adb 启用root模式 |
这样就可以修改hosts文件,实现DNS的解析修改。
8. Android存储
8.1 Internal Storage 内部存储
内部存储的directory对应 /data/data/packageName。
这里的文件夹只有本App可以访问。
1 |
|
8.2 External Storage 应用私有目录
外部存储应用的私有目录的directory对应 /sdcard/Android/data/packagename。
其实/sdcard
alias /storage/emulated/0
。早期的Android手机可以插sdcard,所以现在的手机还是使用这个名字/sdcard。
这里的文件夹其它App也可以访问, 但是不能直接访问,要使用ContentProvider。这个路径是加密的,并不能直接访问。
1 | // 目录是 /storage/emulated/0/Android/data/packagename/cache |
external storage和internal storage都会在App卸载时删除数据。
8.3 Exteranl Storage 外部存储公共存储空间
/sdcard 下层目录
- Alarms
- Android
- DCIM
- Download
- Movies
- Music
- Notifications
- Pictures
- Podcasts
- Ringtones
https://blog.csdn.net/baidu_17508977/article/details/51007904
这里文件要有授权才可以访问,但是这里的文件不会随App卸载而默认删除,当然可以手动删除。
1 | // 目录是 /storage/emulated/0 |
公共文件夹都是用Environment来调用获取,而External Storage和Interanl Storage都是用context来调用获取,这也说明公共文件夹和任何App无关,而External Storage和Interanl Storage和当前App相关。
8.4 权限
Android使用VFS(Virtual File System)虚拟文件系统。VFS提供了供存储设备挂载的节点。同一存储设备经过分区后,不同的分区可以挂在口上到不同的节点上,如手机的内置存储卡。
这个External Storage权限要看Android版本,本来External Storage是Android系统刚出的时候,那时指的是SD卡,但如今很多手机不需要SD卡了,现在的ExternalStorage其实大部分时候是虚拟的。无论外部存储、内部存储都是分file和cache文件夹。
8.4.1 Internal Storage
对于内部存储任何Android版本都不需要申请读写权限。
8.4.2 External Storage
外部存储分两种:①外部存储应用私有目录 ②外部存储共用目录
外部存储私有目录
权限按照版本:Android 4.4之前需要申请权限,Android 4.4以后不需要。这个时候引入了一个参数maxSdkVersion,android:maxSdkVersion=”18”,意思是说只有18之前的版本需要申请权限,之后的版本不需要。这里要注意:加上maxSdkVersion这个参数代表你只需要用到内部存储(TODO),而且你在应用权限管理里面看不到存储读写权限的选项,这个有时候就很不方便,所以这个参数不要乱加。
读写权限现在也并不是一次申请就可以一直有效,因为用户可以随时把权限关掉,所以应用程序必须要动态申请权限。对于内部存储不可以给其它APP使用,对于外部存储应用私有目录,可以用ContentProvider提供数据其它APP使用,这个外部存储应用的私有目录路径是加密的,你正常使用这个路径是读不到的。外部存储共用目录
外部存储共用目录任何Android版本都是需要申请权限的, 而且也是要加上动态权限申请。
9. v4兼容包找不到类
出现这个v4兼容包找不到类,清除缓存,删除build文件夹都没用,这个是Android Studio的原因,关掉项目,从打开列表中删除它,再重新打开就可以了。所以说这个错误是很奇怪的,解决方法也奇怪。
https://baijiahao.baidu.com/s?id=1627073662429922934&wfr=spider&for=pc
10. TCP流量控制
发送给打印机的数据要有流量控制,使用mSocket.setSendBufferSize(2048),这个是设置滑动窗口的size。
其实最好使用协议控制,一收一答,加上ACK机制。
线程sleep的方案不好,这是因为线程sleep的粒度大,精确度差。
11. ExcutorService OOM
如果设置的线程数量太多,可能导致了OOM。我在搜索打印机时,一个IP一个线程,导致某些子网的线程数太多,进而OOM。解决方案就是给线程数设个上限。
12. Android Studio Run的时候显示Waitfing for debugger
选择run模式,也会显示waiting for debugger,重启也没用。
解决方案:选择菜单栏Run->Attach Debugger to Android process, 选择进程。
13. gradle构建时的输出标志
gradle是用task组织起来的,一个task包含Inputs和Outputs。
- UP-TO-DATA 代表outputs没有变化
- FROME-CACHE 代表task outputs可以从之前执行中找到cache
- SKIPPED task这次没有执行
- NO-SOURC task 这次不需要执行,因为source是空。比如只有一些资源文件。
https://docs.gradle.org/current/userguide/more_about_tasks.html
14. Kotlin could not find the required JDK tools in the Java installation
这个是因为Mac升级到Big Sur之后,系统自带了Java,但是只是JRE,不是JDK。解决方案是把系统自带的Jar失效后就可以解决。
https://stackoverflow.com/questions/55286542/kotlin-could-not-find-the-required-jdk-tools-in-the-java-installation
15. gradlew test
默认gradlew test没有显示test case的执行结果。可以通过脚本打印出来。
https://stackoverflow.com/questions/3963708/gradle-how-to-display-test-results-in-the-console-in-real-time/36130467#36130467
https://medium.com/@wasyl/pretty-tests-summary-in-gradle-744804dd676c