记录Android 迁移到AndroidX时的步骤和注意事项
写在前面:
备份!备份!备份! 重要的事情说三遍
项目场景:
Android项目迁移到AndroidX问题描述:
项目在 Android 10获取相册图片和拍照时无法获取到文件路径,进而使app崩溃。 我使用的拍照裁剪的库是:api 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'
原因分析:
由于当前依赖库没有使用最新的2.5.3,所以导致项目没有适配到Android10,进而使得读取相册文件路径时出现FileNotFoundException e java.io.FileNotFoundException: /storage/emulated/0/Pictures/xxxxx.jpg: open failed: EACCES (Permission denied)的问题。【首先声明这个问题不是由于没有动态获取权限导致的,也就是说//清单文件中已添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
//activity中权限动态申请
String[] permissionArr = new String[]{
//相机权限
Manifest.permission.CAMERA,
//SD卡读写操作
Manifest.permission.READ_EXTERNAL_STORAGE,
};
//动态权限已申请
PermissionsUtils.getInstance().checkPermissions(this, permissionArr, new PermissionsUtils.IPermissionsResult() {
@Override
public void passPermissions() {
}
@Override
public void forbidPermissions() {
}
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
PermissionsUtils.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
】
排查后是由于拍照裁剪库未更新到最新导致的。解决方案:
升级拍照裁剪库到2.5.3 api 'com.github.LuckSiege.PictureSelector:picture_library:v2.5.3'
此时由于这个库已经使用了AndroidX而我的项目还是Android的,所以就出现了如下问题:
这一看,这项目是不得不升级到AndroidX了呀,所以就开始查找文章开始操作,没想到一顿操作猛如虎,简直就是二百五。不过好在操作之前做了备份【一定要先备份!备份!备份!】
Android迁移AndroidX:
1、 gradle.properties文件中添加
# 表示使用 androidx
android.useAndroidX=true
# 表示将第三方库迁移到 androidx
android.enableJetifier=true
点击右上角Sync Now
2、 Android Studio 一键迁移
然后就一路操作就可以了。
你以为这样就结束了吗?NO NO NO
3、 将项目中support未导入或导入出错的包手动查找导入
有文章说全文搜索,将support.v搜索一遍,将项目中所有support包替换成对应的androidX库就可以了,但是我采用这种方法没有替换干净,所以只能哪里报错去哪里手动导入。
recyclerview、drawlayout、viewpager、tablayout、ConstraintLayout自动导入的那个包文件不对,需要替换,目前我用到的是这几个。
到此就可以了。
遇到的坑:
1、清单文件中权限重复,导致一直提示Manifest merger failed with multiple errors, see logs
解决方法:tetminal中输入
gradlew processDebugManifest -stacktrace
查看详细信息,挨个解决就可以了。
2、各module中sdkVersion不一致导致的
解决方法:修改统一即可
3、Unable to start the daemon process. This problem might be caused by …
解决方法:
1、将安装C盘的.gradle目录删除掉
2、设置gradle.properties,若无就新增。
在文件中添加如下配置信息:
org.gradle.jvmargs=-Xmx512m
3、新建系统变量
变量名 _JAVA_OPTIONS
变量值 -Djava.net.preferIPv4Stack=true
【网上的方法 修改或者配置gradle文件没有成功解决的 可以试试这个方法!】
写在最后:
利用好Android Studio中的 Clean Project 和 Invalidate Caches/Restart…
原创不易,欢迎指正,不喜勿碰,谢谢!
上一篇: 深入apache host的配置详解
下一篇: 迁移网络的实现原理