• android开发导包升级到androidx踩坑记录【转载】


    最近一直在做安卓开发,奈何手中的资料比较老,资料上的一些Import经常没有,十分让人头疼。

    感谢简书上的【张晴天天天天天】做的整理。

    在这里也记录一下备用。

    升级Android Studio后,在 Refactor ---> Migrate to AndroidX 路径下可以将整个项目升级到AndroidX。

     
    Migrate to AndroidX.png

    所以接下来的修改也是在自动升级后的手动修改。

    文末参考文章是Google官方的说明,可以查看里面更详细的指引和说明Migrating to AndroidX

    本文目录:

    1.手动配置gradle.properties
    2.app/build.gradle修改
    3.java文件修改
    4.布局文件xml修改
    5.部分view不可用修改
    6.其他问题
    7.gradle命令帮助查找问题
    8.参考文章

    1.手动配置gradle.properties

    android.enableJetifier=true
    android.useAndroidX=true
    

    2.app/build.gradle修改

    修改前android.support修改后androidx
    compile implementation
    testCompile testImplementation
    debugCompile debugImplementation
    releaseCompile releaseImplementation

    当然,这部分主要是因为gradle升级后提示需要的更新。
    没写全,只写了主要的,Android Studio有提示,根据提示更新就行。

    android{
            //省略。。。。
            compileOptions {
                sourceCompatibility JavaVersion.VERSION_1_8
                targetCompatibility JavaVersion.VERSION_1_8
            }
    }
    

    3.java文件修改

    这里主要指import的修改,Android Studio自动帮助项目升级成androidx时,很多控件的路径在androidx中都变更了,所以需要全局搜索一键替换。

    全局替换: Edit ->Find -> Replace in path

    列举了一些常用的:

    修改前android.support修改后androidx
    import androidx.appcompat.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
    import androidx.core.view.ViewPager; import androidx.viewpager.widget.ViewPager;
    import androidx.core.view.PagerAdapter; import androidx.viewpager.widget.PagerAdapter;
    import androidx.core.app.Fragment; import androidx.fragment.app.Fragment;
    import androidx.core.app.FragmentManager; import androidx.fragment.app.FragmentManager;
    import androidx.core.app.FragmentTransaction; import androidx.fragment.app.FragmentTransaction;
    import androidx.core.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
    import androidx.appcompat.widget.DefaultItemAnimator; import androidx.recyclerview.widget.DefaultItemAnimator;
    import androidx.appcompat.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
    import androidx.appcompat.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
    import androidx.appcompat.widget.StaggeredGridLayoutManager; import androidx.recyclerview.widget.StaggeredGridLayoutManager;
    import android.support.design.widget.CoordinatorLayout; import androidx.coordinatorlayout.widget.CoordinatorLayout;
    import android.support.design.widget.CoordinatorLayout; import androidx.coordinatorlayout.widget.CoordinatorLayout;
    import android.support.design.widget.TabLayout; import com.google.android.material.tabs.TabLayout;
    import android.support.design.widget.AppBarLayout; import com.google.android.material.appbar.AppBarLayout

    当整个项目因为未生成R文件满江红的时候,全局搜索替换这些常用控件会比较方便。

    4.布局文件xml修改

    3.java文件修改中罗列了一些控件,同样也是全局搜索把这些对应的控件修改成androidx的就好。

    列举几个:

    修改前android.support修改后androidx
    <android.support.v4.widget.NestedScrollView/> <androidx.core.widget.NestedScrollView/>
    <android.support.v4.widget.Space/> <Space/>
    <android.support.v7.widget.AppCompatTextView/> <TextView/>
    <androidx.appcompat.widget.CardView/> <androidx.cardview.widget.CardView/>

    注意!!!

    不管是java还是xml也好,在Android Studio全局搜索的情况下还是有可能搜漏,所以可能还是需要挨个文件查看替换。

    5.部分view不可用修改

    之前手动拷贝了support包中的TabItem(TabLayout需要使用的一个类)出来使用,在升级到androidx后发现无法使用了。

    support中的代码:

        public TabItem(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs,
                   android.support.design.R.styleable.TabItem);
            mText = a.getText(android.support.design.R.styleable.TabItem_android_text);
            mIcon = a.getDrawable(android.support.design.R.styleable.TabItem_android_icon);
            mCustomLayout = a.getResourceId(android.support.design.R.styleable.TabItem_android_layout, 0);
            a.recycle();
        }
    

    a.getText()、a.getDrawable()、a.getResourceId()都报错,提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一个library group(groupId=androidx.appcompat)中被调用,

    从TintTypedArray的源码可知,是在源码中做了限制的原因:

    @RestrictTo(LIBRARY_GROUP)
    public class TintTypedArray {}
    

    6.其他问题

    app module所依赖的一些library我也升级到了androidx,在将library中的build.gradle里的compile修改成implementation的时候注意,如果这里依赖的对象需要全局使用的话,就要使用api关键字了。

    比如:

    修改前:
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
    }
    
    修改后:
    dependencies {
        api fileTree(dir: 'libs', include: ['*.jar'])
    }
    

    7.gradle命令帮助查找问题

    在我一次又一次编译项目时,始终找不到是java文件或者xml文件哪里出错了,logcat、message也不报错,这种时候是最愁的。

    直到我找到了大杀器:gradle命令

    在terminal本项目路径下使用下面这条命令来编译项目:

    ./gradlew compileDebugJavaWithJavac



    作者:张晴天天天天天
    链接:https://www.jianshu.com/p/b0800f590e6e
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Oracle Form Builder
    springboot post xml
    前台日期字符串 提交到后台 组装entity失败原因
    解析-dom编程
    解析-依赖注入DI
    vs 常用插件
    java 代码块 和 C#的代码块 对比
    ubuntu 常用命令
    ubuntu node
    使用 vs2015 搭建nodejs 开发环境
  • 原文地址:https://www.cnblogs.com/jiangzuomeng/p/11950007.html
Copyright © 2020-2023  润新知