以下用 最正確、符合 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 也會自動合併資源