終極大法:android:exported needs to be explicitly specified for <xxxxx>. Apps targeting Android 12 and...

問題原因:項目的編譯版本compileSdkVersion和targetSdkVersion升級到了31及以上(Android12),然后就是清單文件manifest里面包含了intent-filter的四大組件(就是上面<xxxxx>)沒有明確的設置android:exported,就會出現這個錯

  • 解決方法1:

compileSdkVersion和targetSdkVersion設置小于31即可

  • 解決方法2:

使用AS提供的工具Merged Manifest預合并查看,查看右邊底部的Marging Errors區域塊也許可看到問題所在,但我情況是最開始沒看到具體是哪個組件導致的,只看到warning,沒有圖中底部框住的紅色Error塊,后來寫文章時又出來了,估計多Clean哈項目,多重啟哈AS或電腦也許就出來了,如果想來得快和準速看下面方法3


image.png
  • 解決方法3:

  1. 先處理我們能改動的App項目及依賴的Library里面的所有AndroidManifest.xml,在AndroidManifest.xml中搜索“<intent-filter”關鍵字,尋找設置了intent-filter的對應組件,確認是否包含android:exported,沒有添加上,設置true或false具體看自己需求,可能某些設置了合并時會報覆蓋override相關錯,此時可加上tools:replace="android:exported"興許能解決,解決完了此時運行一波,如果三方庫的android:exported沒得問題也就解決了


    image.png
  2. 如果還是報錯,那就是三方庫沒有解決這個問題導致的,需要來定位是哪個三方庫導致的,此時需要手動合并清單文件操作來配合,手動合并清單文件操作可按下圖來操作
    第一步

    第二步

    合并成功結果

    合并報錯結果

    其實上面繁瑣的UI執行task操作在底部的Terminall里面一句命令./gradlew processDebugMainManifest --stacktrack即可搞定
  3. 結合上一步手動合并清單失敗原因里面<xxxxx>的內容可知道失敗是四大組件的哪個并且可知道有幾個失敗的問題,但是坑爹的是報錯里面沒有指名是哪個庫導致的,此時我們來定位導致問題的三方庫,如果是自己剛加的三方庫,可刪除再執行哈合并清單操作,看還報錯不,如果還報錯那就在build.gradle里面的dependencies里面采用二分大法先塊注釋一部分依賴引用(不用去管代碼里面沒得引用相關報紅,只是暫時注釋而已),再執行合并清單操作,看還報錯不,如果還報錯再具體二分大法塊注釋細分直到能夠行注釋確定某一個三方庫,找到之后我們可以在下圖舉例處去詳細確認哈對應三方庫的清單文件是否存在android:exported沒加的問題


    oaid庫只是舉例的庫,本身不存在android:exported問題
  4. 這樣就能夠確認是哪個三方庫導致的了,具體解決方法:
  • 可以在我們自己的AndroidManifest里面覆寫這個有問題的三方組件,主動加上android:exported
  • 聯系對方修復下這個問題再依賴新版
  • 直接更換掉它
  1. 附上我這邊最終最終確認下來是:com.luffykou:android-common-utils:1.1.3com.umeng.umsdk:oppo-umengaccs:1.0.8-fixcom.umeng.umsdk:vivo-umengaccs:1.1.6,我采取的解決方法是刪除com.luffykou:android-common-utils庫并暫時覆蓋有問題的友盟組件然后反饋給友盟的技術待他們修復
<!--api level 31的時候,com.umeng.umsdk:oppo-umengaccs:1.0.8-fix庫缺失android:exported,覆蓋補上Start-->
        <service
            android:name="com.heytap.msp.push.service.CompatibleDataMessageCallbackService"
            android:permission="com.coloros.mcs.permission.SEND_MCS_MESSAGE" android:exported="true">
            <intent-filter>
                <action android:name="com.coloros.mcs.action.RECEIVE_MCS_MESSAGE" />
            </intent-filter>
        </service> <!-- 兼容Q以下版本 -->

        <service
            android:name="com.heytap.msp.push.service.DataMessageCallbackService"
            android:permission="com.heytap.mcs.permission.SEND_PUSH_MESSAGE" android:exported="true">
            <intent-filter>
                <action android:name="com.heytap.mcs.action.RECEIVE_MCS_MESSAGE" />
                <action android:name="com.heytap.msp.push.RECEIVE_MCS_MESSAGE" />
            </intent-filter>
        </service> <!-- 兼容Q版本 -->

        <!--api level 31的時候,com.umeng.umsdk:vivo-umengaccs:1.1.6庫缺失android:exported,覆蓋補上Start-->
        <receiver android:name="org.android.agoo.vivo.PushMessageReceiverImpl" android:exported="true">
            <intent-filter>
                <!-- 接收push消息 -->
                <action android:name="com.vivo.pushclient.action.RECEIVE" />
            </intent-filter>
        </receiver>

Let's Call it a Day!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容