android 舊版 sdk 的 Manifest 控制 package 修改辧法

以下用 最正確、符合 AGP 8 / Android SDK 34+ / Gradle 8+ 的方式 來解釋與解決你的錯誤。


❗你的錯誤訊息(重點)

Incorrect package="de.blinkt.openvpn" found in source AndroidManifest.xml
Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported.
Recommendation: remove package="de.blinkt.openvpn" from the source AndroidManifest.xml

這代表你目前使用的 Android Gradle Plugin(AGP 8.0+)已完全 不允許在每個 module 的 AndroidManifest.xml 指定 package=


📌 為什麼會這樣?

AGP 8 之後,Google 改成新的規則:

AndroidManifest.xml 不能再寫 package="" 來定義 namespace。
必須在 build.gradle 中定義 namespace

也就是:

以前(舊版 SDK)

Manifest 控制 package:

<manifest package="de.blinkt.openvpn">

現在(SDK 34 / AGP 8)

Manifest 不再允許 package
你需要改為:

android {
    namespace "de.blinkt.openvpn"
}

並且 移除 Manifest 的 package 屬性。


🎯 正確解決方式(適用 Cake-VPN、vpnLib module)

步驟 1:修改 vpnLib 的 build.gradle

找到:

vpnLib/build.gradle

加入:

android {
    namespace "de.blinkt.openvpn"
}

步驟 2:刪除 AndroidManifest.xml 的 package

你的原本內容:

<manifest package="de.blinkt.openvpn" />

請改為:

<manifest />

或乾脆改成:

<manifest />

也沒差(因為 library module 的 manifest 通常是空的)。


✔ 完整對照(修改前 / 修改後)

🔴 修改前(會報錯)

vpnLib/src/main/AndroidManifest.xml

<manifest package="de.blinkt.openvpn">
</manifest>

vpnLib/build.gradle

android {
    // 沒有 namespace → 錯誤
}

🟢 修改後(正確,可編譯)

vpnLib/src/main/AndroidManifest.xml

<manifest/>

vpnLib/build.gradle

android {
    namespace "de.blinkt.openvpn"
}

❗注意:library module 的 namespace 必須與其 Java package 一致

因為 vpnLib 裡所有 Java 檔都是:

package de.blinkt.openvpn;

所以 library module namespace 必須是:

de.blinkt.openvpn

否則:

  • R 無法對應
  • Build 會噴錯
  • 依賴會錯亂

🎉 最終效果

完成後:

  • Gradle 不再抱怨
  • manifest 乾淨、符合 AGP 8 標準
  • R 的 namespace 正常生成
  • vpnLib 中可以使用:
de.blinkt.openvpn.R.string.xxx
  • app module 也會自動合併資源

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *