build.gradle(Module:app)에서 compileSdkVersion, targetSdkVersion을 기존 33에서 34로 변경 후 빌드
오류 발생..
Execution failed for task ':app:processDebugResources'.
> A failure occurred while executing com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$TaskAction
> AAPT2 aapt2-4.2.2-7147631-osx Daemon #0: Unexpected error during link, attempting to stop daemon.
This should not happen under normal circumstances, please file an issue if it does.
검색 , gpt 등에서 확인해보니 gradle 버전을 최선으로 변경하고, 여러 설정 변경 후 "File > Invalidate Caches / Restart." 하라는데 모두 실패
성공한 my case 올려봄. (IDE: Android Studio Koala | 2024.1.1)
goomgoom@starnet example_copy % cordova plugin add cordova-plugin-app-exit
Installing "cordova-plugin-app-exit" for android
Failed to install 'cordova-plugin-app-exit': Error: /Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/version: Command failed with exit code 1 Error output:
node:internal/modules/cjs/loader:1215
throw err;
^
Error: Cannot find module 'properties-parser'
Require stack:
- /Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/lib/AndroidProject.js
- /Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/Api.js
- /Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/version
at Module._resolveFilename (node:internal/modules/cjs/loader:1212:15)
at Module._load (node:internal/modules/cjs/loader:1038:27)
at wrapModuleLoad (node:internal/modules/cjs/loader:212:19)
at Module.require (node:internal/modules/cjs/loader:1297:12)
at require (node:internal/modules/helpers:123:16)
at Object.<anonymous> (/Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/lib/AndroidProject.js:22:25)
at Module._compile (node:internal/modules/cjs/loader:1460:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1544:10)
at Module.load (node:internal/modules/cjs/loader:1275:32)
at Module._load (node:internal/modules/cjs/loader:1091:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'/Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/lib/AndroidProject.js',
'/Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/Api.js',
'/Users/goomgoom/AndroidStudioProjects/example_copy/platforms/android/cordova/version'
]
}
Node.js v22.3.0
at ChildProcess.whenDone (/usr/local/lib/node_modules/cordova/node_modules/cordova-common/src/superspawn.js:135:23)
at ChildProcess.emit (node:events:520:28)
at maybeClose (node:internal/child_process:1105:16)
at Socket.<anonymous> (node:internal/child_process:457:11)
at Socket.emit (node:events:520:28)
at Pipe.<anonymous> (node:net:339:12)
해결: npm install properties-parser
(properties-parser 수동으로 추가)
goomgoom@starnet android % cordova plugin add cordova-plugin-app-exit
Installing "cordova-plugin-app-exit" for android
(node:14085) [DEP0128] DeprecationWarning: Invalid 'main' field in '/Users/goomgoom/AndroidStudioProjects/example_copy/node_modules/objectorarray/package.json' of 'dist/index.js'. Please either fix that or report it to the module author
(Use `node --trace-deprecation ...` to show where the warning was created)
Adding cordova-plugin-app-exit to package.json
goomgoom@starnet android % cordova plugin ls
cordova-plugin-app-exit 0.0.1 "ExitApp"
cordova-plugin-whitelist 1.3.4 "Whitelist"
android 버전이 12이상인 기기에서 백그라운드 알림 이벤트 수신시 아래와 같이 에러가 났다.
Exception java.lang.IllegalArgumentException: com.bizentro.uniportal: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
at android.app.PendingIntent.checkFlags (PendingIntent.java:382)
at android.app.PendingIntent.getActivityAsUser (PendingIntent.java:465)
at android.app.PendingIntent.getActivity (PendingIntent.java:451)
at android.app.PendingIntent.getActivity (PendingIntent.java:415)
at com.google.firebase.messaging.CommonNotificationBuilder.createContentIntent (com.google.firebase:firebase-messaging@@21.0.1:5)
at com.google.firebase.messaging.CommonNotificationBuilder.createNotificationInfo (com.google.firebase:firebase-messaging@@21.0.1:20)
at com.google.firebase.messaging.CommonNotificationBuilder.createNotificationInfo (com.google.firebase:firebase-messaging@@21.0.1:6)
at com.google.firebase.messaging.DisplayNotification.handleNotification (com.google.firebase:firebase-messaging@@21.0.1:4)
at com.google.firebase.messaging.FirebaseMessagingService.dispatchMessage (com.google.firebase:firebase-messaging@@21.0.1:8)
at com.google.firebase.messaging.FirebaseMessagingService.passMessageIntentToSdk (com.google.firebase:firebase-messaging@@21.0.1:8)
at com.google.firebase.messaging.FirebaseMessagingService.handleMessageIntent (com.google.firebase:firebase-messaging@@21.0.1:3)
at com.google.firebase.messaging.FirebaseMessagingService.handleIntent (com.google.firebase:firebase-messaging@@21.0.1:3)
at com.google.firebase.messaging.EnhancedIntentService.lambda$processIntent$0$EnhancedIntentService
at com.google.firebase.messaging.EnhancedIntentService$$Lambda$0.run
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
at com.google.android.gms.common.util.concurrent.zza.run
at java.lang.Thread.run (Thread.java:920)
[androidx.vectordrawable:vectordrawable-animated:1.0.0] /Users/wonhochoe/Downloads/gradle-4.8.1/caches/transforms-2/files-2.1/17c854dfb65cc4cb6b6a29797e63f450/vectordrawable-animated-1.0.0/AndroidManifest.xml Warning: Package name 'androidx.vectordrawable' used in: androidx.vectordrawable:vectordrawable-animated:1.0.0, androidx.vectordrawable:vectordrawable:1.0.0.
/Users/wonhochoe/AndroidStudioProjects/android-220803/app/src/main/AndroidManifest.xml Error: Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
/Users/wonhochoe/AndroidStudioProjects/android-220803/app/src/main/AndroidManifest.xml Error: Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.
그대로 해석하면, Android 12 이상 타겟팅하고 있는 컴포넌트(Activity, service 등등) 중 인텐트 필터 포함하고 있는 애들은
android:exported
이 요소는 다른 애플리케이션의 구성요소에서 활동을 시작할 수 있는지를 설정합니다.
"true"인 경우 모든 앱에서 활동에 액세스할 수 있으며 정확한 클래스 이름으로 활동을 시작할 수 있습니다.
'false'인 경우 활동은 같은 애플리케이션의 구성요소나 사용자 ID가 같은 애플리케이션, 권한이 있는 시스템 구성요소에서만 시작될 수 있습니다. 이는 인텐트 필터가 없는 경우의 기본값입니다.
앱의 활동에 인텐트 필터가 포함되면 다른 앱에서 활동을 시작할 수 있도록 이 요소를 "true"로 설정합니다. 예를 들어 활동이 앱의 기본 활동이고 category 'android.intent.category.LAUNCHER'를 포함한 경우입니다.
이 요소가 'false'로 설정되어 있고 앱에서 활동을 시작하려고 하면 시스템에서 ActivityNotFoundException이 발생합니다.
'android.intent.category.LAUNCHER' 인텐트 필터 갖고 있는 Activity에 android: exported = false 값을 지정하면 앱이 실행 안됨
public HttpsURLConnection postHttps(Context context,String url){
HttpsURLConnection urlConnection = null;
try{
// Load CAs from an InputStream
// (could be from a resource or ByteArrayInputStream or ...)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// From https://www.washington.edu/itconnect/security/ca/load-der.crt
//인증서 경로 저장
InputStream is = context.getResources().openRawResource(R.raw.sectigo_org_ca);
InputStream caInput = new BufferedInputStream(is);
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
} finally {
caInput.close();
}
// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// Create an SSLContext that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
// Tell the URLConnection to use a SocketFactory from our SSLContext
URL toUrl = new URL(url);
urlConnection =
(HttpsURLConnection)toUrl.openConnection();
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
urlConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify("server_domain",session);
}
});
//urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());
//InputStream in = urlConnection.getInputStream();
/*InputStream in = urlConnection.getInputStream();
IOUtils.copy(in, System.out);*/
}catch (Exception e){
e.printStackTrace();
}
return urlConnection;
}
와! 이제 그 Trust anchor 도 안뜨고.. 첨부파일 다운로드도 정상적으로 되고..
역시.. 귀찮다고 시도도 안해보고 일찌감치 포기하면.. 더 많은 시간, 체력을 뺏긴다는걸 이번 경험으로 또 알게됨.
그 외 참고 사이트
SSL문제 해결기: https://modelmaker.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-SSL-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0%EA%B8%B0 인증서 정보 찾기 : https://info-lab.tistory.com/265
더 확인할 문제
특정 인증기관의 인증서(ex. setigo) 는 인증서 파일을 등록하지 않아도 접속 및 실행에 문제 없는데, 어떤 CA의 인증서는 꼭 등록해야만 앱이 실행되는 이유..