android开发导包升级到androidx踩坑记录【转载】
<p>最近一直在做安卓开发,奈何手中的资料比较老,资料上的一些Import经常没有,十分让人头疼。</p><p>感谢简书上的【<span class="FxYr8x">张晴天天天天天】做的整理。</span></p>
<p><span class="FxYr8x">在这里也记录一下备用。</span></p>
<div>
<div>
<p>升级Android Studio后,在 Refactor ---> Migrate to AndroidX 路径下可以将整个项目升级到AndroidX。</p>
<div class="image-package">
<div class="image-container">
<div class="image-container-fill"> </div>
<div class="image-view" data-width="283" data-height="324"><img src="//upload-images.jianshu.io/upload_images/2423227-a9c83d27ef838162.png?imageMogr2/auto-orient/strip|imageView2/2/w/283/format/webp"></div>
</div>
<div class="image-caption">Migrate to AndroidX.png</div>
</div>
<p>所以接下来的修改也是在自动升级后的手动修改。</p>
<p>文末参考文章是Google官方的说明,可以查看里面更详细的指引和说明Migrating to AndroidX。</p>
<h4>本文目录:</h4>
<p>1.手动配置gradle.properties<br>
2.app/build.gradle修改<br>
3.java文件修改<br>
4.布局文件xml修改<br>
5.部分view不可用修改<br>
6.其他问题<br>
7.gradle命令帮助查找问题<br>
8.参考文章</p>
<h1>1.手动配置gradle.properties</h1>
<pre class="line-numberslanguage-bash"><code class="language-bash">android.enableJetifier=true
android.useAndroidX=true
</code><button class="VJbwyy" type="button"></button></pre>
<h1>2.app/build.gradle修改</h1>
<table>
<thead>
<tr><th>修改前android.support</th><th>修改后androidx</th></tr>
</thead>
<tbody>
<tr>
<td>compile</td>
<td>implementation</td>
</tr>
<tr>
<td>testCompile</td>
<td>testImplementation</td>
</tr>
<tr>
<td>debugCompile</td>
<td>debugImplementation</td>
</tr>
<tr>
<td>releaseCompile</td>
<td>releaseImplementation</td>
</tr>
</tbody>
</table>
<p>当然,这部分主要是因为gradle升级后提示需要的更新。<br>
没写全,只写了主要的,Android Studio有提示,根据提示更新就行。</p>
<pre class="line-numberslanguage-cpp"><code class="language-cpp">android<span class="token punctuation">{
<span class="token comment">//省略。。。。
compileOptions <span class="token punctuation">{
sourceCompatibility JavaVersion<span class="token punctuation">.VERSION_1_8
targetCompatibility JavaVersion<span class="token punctuation">.VERSION_1_8
<span class="token punctuation">}
<span class="token punctuation">}
</span></span></span></span></span></span></span></code><button class="VJbwyy" type="button"></button></pre>
<h1>3.java文件修改</h1>
<p>这里主要指import的修改,Android Studio自动帮助项目升级成androidx时,很多控件的路径在androidx中都变更了,所以需要全局搜索一键替换。</p>
<p>全局替换: Edit ->Find -> Replace in path</p>
<p>列举了一些常用的:</p>
<table>
<thead>
<tr><th>修改前android.support</th><th>修改后androidx</th></tr>
</thead>
<tbody>
<tr>
<td>import androidx.appcompat.widget.RecyclerView;</td>
<td>import androidx.recyclerview.widget.RecyclerView;</td>
</tr>
<tr>
<td>import androidx.core.view.ViewPager;</td>
<td>import androidx.viewpager.widget.ViewPager;</td>
</tr>
<tr>
<td>import androidx.core.view.PagerAdapter;</td>
<td>import androidx.viewpager.widget.PagerAdapter;</td>
</tr>
<tr>
<td>import androidx.core.app.Fragment;</td>
<td>import androidx.fragment.app.Fragment;</td>
</tr>
<tr>
<td>import androidx.core.app.FragmentManager;</td>
<td>import androidx.fragment.app.FragmentManager;</td>
</tr>
<tr>
<td>import androidx.core.app.FragmentTransaction;</td>
<td>import androidx.fragment.app.FragmentTransaction;</td>
</tr>
<tr>
<td>import androidx.core.content.LocalBroadcastManager;</td>
<td>import androidx.localbroadcastmanager.content.LocalBroadcastManager;</td>
</tr>
<tr>
<td>import androidx.appcompat.widget.DefaultItemAnimator;</td>
<td>import androidx.recyclerview.widget.DefaultItemAnimator;</td>
</tr>
<tr>
<td>import androidx.appcompat.widget.LinearLayoutManager;</td>
<td>import androidx.recyclerview.widget.LinearLayoutManager;</td>
</tr>
<tr>
<td>import androidx.appcompat.widget.GridLayoutManager;</td>
<td>import androidx.recyclerview.widget.GridLayoutManager;</td>
</tr>
<tr>
<td>import androidx.appcompat.widget.StaggeredGridLayoutManager;</td>
<td>import androidx.recyclerview.widget.StaggeredGridLayoutManager;</td>
</tr>
<tr>
<td>import android.support.design.widget.CoordinatorLayout;</td>
<td>import androidx.coordinatorlayout.widget.CoordinatorLayout;</td>
</tr>
<tr>
<td>import android.support.design.widget.CoordinatorLayout;</td>
<td>import androidx.coordinatorlayout.widget.CoordinatorLayout;</td>
</tr>
<tr>
<td>import android.support.design.widget.TabLayout;</td>
<td>import com.google.android.material.tabs.TabLayout;</td>
</tr>
<tr>
<td>import android.support.design.widget.AppBarLayout;</td>
<td>import com.google.android.material.appbar.AppBarLayout</td>
</tr>
</tbody>
</table>
<p>当整个项目因为未生成R文件满江红的时候,全局搜索替换这些常用控件会比较方便。</p>
<h1>4.布局文件xml修改</h1>
<p>在<strong>3.java文件修改</strong>中罗列了一些控件,同样也是全局搜索把这些对应的控件修改成androidx的就好。</p>
<p>列举几个:</p>
<table>
<thead>
<tr><th>修改前android.support</th><th>修改后androidx</th></tr>
</thead>
<tbody>
<tr>
<td><android.support.v4.widget.NestedScrollView/></td>
<td><androidx.core.widget.NestedScrollView/></td>
</tr>
<tr>
<td><android.support.v4.widget.Space/></td>
<td><Space/></td>
</tr>
<tr>
<td><android.support.v7.widget.AppCompatTextView/></td>
<td><TextView/></td>
</tr>
<tr>
<td><androidx.appcompat.widget.CardView/></td>
<td><androidx.cardview.widget.CardView/></td>
</tr>
</tbody>
</table>
<p><strong>注意!!!</strong></p>
<p>不管是java还是xml也好,在Android Studio全局搜索的情况下还是有可能搜漏,所以可能还是需要挨个文件查看替换。</p>
<h1>5.部分view不可用修改</h1>
<p>之前手动拷贝了support包中的TabItem(TabLayout需要使用的一个类)出来使用,在升级到androidx后发现无法使用了。</p>
<p>support中的代码:</p>
<pre class="line-numberslanguage-java"><code class="language-java"> <span class="token keyword">public <span class="token class-name">TabItem<span class="token punctuation">(<span class="token class-name">Context context<span class="token punctuation">, <span class="token class-name">AttributeSet attrs<span class="token punctuation">) <span class="token punctuation">{
<span class="token keyword">super<span class="token punctuation">(context<span class="token punctuation">, attrs<span class="token punctuation">)<span class="token punctuation">;
<span class="token keyword">final <span class="token class-name">TintTypedArray a <span class="token operator">= <span class="token class-name">TintTypedArray<span class="token punctuation">.<span class="token function">obtainStyledAttributes<span class="token punctuation">(context<span class="token punctuation">, attrs<span class="token punctuation">,
android<span class="token punctuation">.support<span class="token punctuation">.design<span class="token punctuation">.<span class="token class-name">R<span class="token punctuation">.styleable<span class="token punctuation">.<span class="token class-name">TabItem<span class="token punctuation">)<span class="token punctuation">;
mText <span class="token operator">= a<span class="token punctuation">.<span class="token function">getText<span class="token punctuation">(android<span class="token punctuation">.support<span class="token punctuation">.design<span class="token punctuation">.<span class="token class-name">R<span class="token punctuation">.styleable<span class="token punctuation">.<span class="token class-name">TabItem_android_text<span class="token punctuation">)<span class="token punctuation">;
mIcon <span class="token operator">= a<span class="token punctuation">.<span class="token function">getDrawable<span class="token punctuation">(android<span class="token punctuation">.support<span class="token punctuation">.design<span class="token punctuation">.<span class="token class-name">R<span class="token punctuation">.styleable<span class="token punctuation">.<span class="token class-name">TabItem_android_icon<span class="token punctuation">)<span class="token punctuation">;
mCustomLayout <span class="token operator">= a<span class="token punctuation">.<span class="token function">getResourceId<span class="token punctuation">(android<span class="token punctuation">.support<span class="token punctuation">.design<span class="token punctuation">.<span class="token class-name">R<span class="token punctuation">.styleable<span class="token punctuation">.<span class="token class-name">TabItem_android_layout<span class="token punctuation">, <span class="token number">0<span class="token punctuation">)<span class="token punctuation">;
a<span class="token punctuation">.<span class="token function">recycle<span class="token punctuation">(<span class="token punctuation">)<span class="token punctuation">;
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code><button class="VJbwyy" type="button"></button></pre>
<p>a.getText()、a.getDrawable()、a.getResourceId()都报错,提示TintTypedArray.getText()或TintTypedArray.getDrawable()或TintTypedArray.getResourceId()只能在同一个library group(groupId=androidx.appcompat)中被调用,</p>
<p>从TintTypedArray的源码可知,是在源码中做了限制的原因:</p>
<pre class="line-numberslanguage-kotlin"><code class="language-kotlin"><span class="token annotation builtin">@RestrictTo<span class="token punctuation">(LIBRARY_GROUP<span class="token punctuation">)
<span class="token keyword">public <span class="token keyword">class TintTypedArray <span class="token punctuation">{<span class="token punctuation">}
</span></span></span></span></span></span></span></code><button class="VJbwyy" type="button"></button></pre>
<h1>6.其他问题</h1>
<p>app module所依赖的一些library我也升级到了androidx,在将library中的build.gradle里的compile修改成implementation的时候注意,如果这里依赖的对象需要全局使用的话,就要使用<strong>api</strong>关键字了。</p>
<p>比如:</p>
<pre class="line-numberslanguage-php"><code class="language-php">修改前:
dependencies <span class="token punctuation">{
compile <span class="token function">fileTree<span class="token punctuation">(dir<span class="token punctuation">: <span class="token single-quoted-string string">'libs'<span class="token punctuation">, <span class="token keyword">include<span class="token punctuation">: <span class="token punctuation">[<span class="token single-quoted-string string">'*.jar'<span class="token punctuation">]<span class="token punctuation">)
<span class="token punctuation">}
修改后:
dependencies <span class="token punctuation">{
api <span class="token function">fileTree<span class="token punctuation">(dir<span class="token punctuation">: <span class="token single-quoted-string string">'libs'<span class="token punctuation">, <span class="token keyword">include<span class="token punctuation">: <span class="token punctuation">[<span class="token single-quoted-string string">'*.jar'<span class="token punctuation">]<span class="token punctuation">)
<span class="token punctuation">}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code><button class="VJbwyy" type="button"></button></pre>
<h1>7.gradle命令帮助查找问题</h1>
<p>在我一次又一次编译项目时,始终找不到是java文件或者xml文件哪里出错了,logcat、message也不报错,这种时候是最愁的。</p>
<p>直到我找到了大杀器:gradle命令</p>
<p>在terminal本项目路径下使用下面这条命令来编译项目:</p>
<blockquote>
<p>./gradlew compileDebugJavaWithJavac</p>
</blockquote>
</div>
<br><br>作者:张晴天天天天天<br>链接:https://www.jianshu.com/p/b0800f590e6e<br>来源:简书<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</div><br><br>
来源:https://www.cnblogs.com/jiangzuomeng/p/11950007.html
頁:
[1]