1.
Build command failed.
Error while executing process D:\AndroidSDK\cmake\3.6.4111459\bin\cmake.exe with arguments {--build E:\NK\AndroidProject\app\.externalNativeBuild\cmake\debug\arm64-v8a --target native-lib}
ninja: error: '../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libmy-lib.so', needed by '../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libfdk-lib.so', missing and no known rule to make it
項目說明,我引用的cMake是在moudle裡面的,出現這個問題就表示連結時時候找不到對應架構的庫,是以我在modle裡面找到了這份cMakeLists.text檔案,檢視其中的内容發現沒有什麼錯誤是明顯能看到,畢竟是一大堆add..set...,于是我找到了配置ndk對應架構庫的build.gradle中發現對應的arm64-v8a這個so包并不存在build中的cmake/debug/obj中,是以我把配置的ndk架構庫删掉了arm64-v8a這個,再build就不報錯了,對應的,在build增加這個so庫我估計也能解決問題
2.
Manifest merger failed with multiple errors, see logs
項目是接手公司項目所引發的錯誤,發生這個錯誤時需要再terminal控制台中輸入gradlew processDebugManifest --stacktrace檢視,當輸入gradlew processDebugManifest --stacktrace時會出現錯誤資訊,我截了一點錯誤資訊如下:* What went wrong:
A problem occurred evaluating project ':DatePicker'.
> java.lang.UnsupportedClassVersionError: com/android/build/gradle/LibraryPlugin : Unsupported major.minor version 52.0
初看這個錯誤資訊狠疑惑,查了一下發現根本原因是JDK版本與gradle版本沒有對應上,對應的52.0的jdk對應版本應該是1.8,于是打開project Structure換上自己的jdk
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwFMRR0T3lFROdXU6hVdsdUZwZlMkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOxATN1IDNxEDOyETM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
然後重新clean一下運作,發現沒問題了
3.
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
這個問題的出現是我在android中加載h5的頁面點選圖檔選擇或者拍照出現的的,根本的原因就是在android版本7.0之後Android不再允許在app中把file://Uri暴露給其他app,因為這樣事不安全的,是以geogle提供了解決方法給我們。
解決方法:
首先在
AndroidManifest.xml
中添加provider,配置屬性,
-
是用來辨別provider的唯一辨別,在同一部手機上一個"authority"串隻能被一個app使用,沖突的話會導緻app無法安裝。android:authorities
-
必須設定成android:exported
,後面異常會講為什麼false
-
用來控制共享檔案的通路權限,也可以在java代碼中設定android:grantUriPermissions
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="{你的包名}.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
當我們配置完provider後就可以修改代碼了
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// android7.0注意uri的擷取方式改變
Uri photoOutputUri = FileProvider.getUriForFile(
context,
BuildConfig.APPLICATION_ID + ".fileProvider",
new File(mCameraFilePath));
intent2.putExtra(MediaStore.EXTRA_OUTPUT, photoOutputUri);
} else {
intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
}
異常處理
-
解決方案:java.lang.SecurityException: Provider must not be exported
必須設定成android:exported
false
-
解決方案:Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
處的AndroidManifest.xml
必須跟android:authorities
一樣mActivity.getPackageName() + ".fileprovider"