일반 Android 사용자는 아마도 Android의 '조각화 문제'에 대한 관심을 중단한 지 오래되었을 것입니다. 하지만 이 문제는 여전히 개발자들을 괴롭히고 있습니다.
조각화는 모바일 운영 체제가 발표된 이후 문자 그대로 Android에서 논쟁의 여지가 있는 문제였습니다.
온라인 불꽃 전쟁에서 트롤이 사용하는 곤봉이 되는 것 외에도, 조각화로 인한 다양성은 이제 대체로 다음과 같은 것으로 간주됩니다. 소비자에게 순 긍정적 Android 기기의 결국, 우리는 원하는 종류의 소프트웨어가 포함된 장치 종류를 선택할 수 있는 자유가 너무 많아서 일반 소비자가 단편화에 신경 쓰기가 어렵습니다. 믿을 수 없을 정도로 다양한 Android 기기를 시각화하면 Android의 다양한 표현이 담긴 아름다운 모자이크가 생성됩니다.
그러나 하드웨어와 소프트웨어 단편화는 행복한 소프트웨어 개발자를 만드는 것이 아닙니다. 실제로는 정반대입니다. 매우 다양한 하드웨어 및 소프트웨어 구성에 걸쳐 앱을 개발하는 것은 디버깅할 때 큰 방해가 될 수 있습니다. OEM은 앱을 개발할 때 고려해야 할 중요하거나 미묘한 변경을 할 수 있지만 개별 개발자가 자신의 앱이 보편적으로 작동하는지 확인할 수 있는 쉬운 방법은 실제로 없습니다. 일반 소비자는 조각화 논쟁에 대해 오랫동안 잊어버렸지만 이 문제는 여전히 Android를 괴롭힙니다. 앱 개발자들은 그것을 짜증나게 하고 오류를 처리하는 것 외에는 할 수 있는 일이 없는 것 같습니다. 나타나다.
조각화의 안타까운 상태
특히 한 OEM은 앱을 개발할 때 발생하는 골치 아픈 문제로 많은 미움을 받습니다. 바로 삼성입니다. 개발자들은 수년 동안 삼성에 대해 호언장담을 해왔고 일부는 "안드로이드 지옥에는 삼성만의 특별한 자리가 있다"는 특히 실망스러운 버그를 설명합니다. 삼성 기기 및 지원 appcompat 라이브러리. 나는 특히 개발자들이 여전히 단편화에 관심을 갖는 이유를 훌륭하게 설명하는 Mr. Ambri의 호언장담 중 한 단락에 주목하고 싶습니다.
당신이 안드로이드 개발자라면 삼성 기기에 대한 증오심은 아마도 끝이 없을 것입니다. 삼성이 동의어인 일반 사용자 이상 바보 같은 터치위즈 그리고 과도한 블로트웨어, 당신은 선택의 여지가 없기 때문에 삼성을 경멸합니다. 삼성 때문에 엄청난 시장 점유율, 단순히 삼성 장치를 지원하지 않도록 선택할 수는 없습니다. 그리고 그것이 가장 아픈 것입니다. 이 선택이 당신에게서 빼앗겼다는 사실!
이는 안드로이드가 존재했던 시절의 호언장담도 아닙니다. 이 게시물은 작년 12월 중순에 게시되었습니다. 아직 이 문제가 공식적으로 해결되었는지 확실하지 않다는 점을 솔직하게 말씀드립니다. Ambri는 Google 검색을 통해 자신의 폭언을 우연히 발견한 사람을 위해 자신의 게시물에 수정 사항을 제공했습니다. 벌레. 당신이해야 할 일은 사용하는 것뿐입니다 프로가드 다음 한 줄의 코드를 사용하세요.
# Samsung ruining all nice things-keep class !android.support.v7.view.menu.**, !android.support.design.internal.NavigationMenu, !android.support.design.internal.NavigationMenuPresenter, !android.support.design.internal.NavigationSubMenu, android.support.** {*;}
별로 나쁘지 않은데요, 그렇죠? 하지만 문제는 이 수정 사항이 스택 오버플로에서 제외되었다는 것입니다. 오해하지 마십시오. Stack Overflow는 훌륭한 웹사이트입니다. 하지만 실제로 앱의 수정 사항을 찾는 데 이상적인 소스는 아닙니다. Stack Overflow에서 무언가를 찾으려면 Google에서 여러 번 시행착오를 겪은 후 링크를 깊이 파고드는 경우가 많습니다. 때로는 다른 사용자가 귀하가 겪었던 동일한 버그를 언급했지만 수정 사항은 보이지 않는 경우도 있습니다. 아니면 원본 포스터가 다음과 같이 주장하는 스레드를 발견했을 때 더욱 실망스럽습니다. 수정 사항을 찾았지만 다른 사람에게 수정 방법을 지시하지 않고 스레드를 포기한 지 오래되었습니다. 문제.
미묘한 조각화 문제의 예
저는 개발자는 아니지만 수년간 Tasker를 조작한 후 Android의 기능에 충분히 익숙해져서 제가 직면한 문제에 대한 솔루션을 의사 프로그래밍하기 시작했습니다. 그리고 제가 뭔가를 알아낼 수 없을 때는 다른 사람들처럼 구글에 검색합니다. 제가 예전에 쓴 글을 쓰던 중에 숨겨진 활동을 찾기 위해 휴대폰의 설정 앱을 뒤져보세요, 설명할 수 없는 다소 이상한 버그를 발견했습니다. Huawei 장치 고유의 버그입니다.
설정 앱 내에서 특정 활동(예: 앱 사용 통계가 포함된 "테스트" 메뉴)을 시작하려고 할 때마다 항상 권한 오류가 발생했습니다. 특히, 활동을 시작하기 위해 사용하던 앱에는 권한이 부족했습니다. huawei.android.permission. HW_SIGNATURE_OR_SYSTEM. 제가 테스트한 다른 장치에서는 이러한 설정 활동을 시작하는 데 고유한 권한이 필요하지 않았으며 Huawei의 Android 버전(EMUI)을 실행하는 전화기만 필요했습니다. 분석 com.android.settings 설정 앱 내의 특정 활동이 실제로 다음 중 하나를 요구하는 보호 수준 아래에 있는 것으로 나타났습니다. 서명 또는 시스템 권한.
불행하게도 이는 /system 아래에 설치된 앱이나 동일한 이름으로 서명된 앱만 의미합니다. 설정 앱과 같은 서명을 사용하면 내가 했던 방법을 사용하여 이러한 활동을 열 수 있습니다. 시도 중입니다. Google에서 답변을 찾기 위해 이 오류를 검색했을 때, (당신도 짐작했겠지만) 다음과 같은 오류를 발견했습니다. 스택 오버플로 스레드. 자신의 문제를 게시한 개발자는 나와 동일한 문제를 발견했습니다(그는 실제로 앱을 개발하는 중이었지만). 그의 문제는 그가 다음 코드를 실행하려고 시도했을 때 발생했습니다.
<span >Intentspan><span > mainIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_MAINspan><span >,span><span >nullspan><span >);span><span >mainIntentspan><span >.span><span >addCategoryspan><span >(span><span >Intentspan><span >.span><span >CATEGORY_LAUNCHERspan><span >);span><span >Intentspan><span > pickIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_PICK_ACTIVITYspan><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_TITLEspan><span >,span><span >"Pick App to Play in"span><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_INTENTspan><span >,span><span > mainIntentspan><span >);span><span >thisspan><span >.span><span >startActivityForResultspan><span >(span><span >pickIntentspan><span >,span><span > REQUEST_PICK_APPLICATIONspan><span >);span>
의도와 개발자 웹 페이지의 문자열로 판단하면 그는 사용자가 일부 미디어를 재생할 타사 앱을 선택할 수 있도록 허용하려고 한 것 같습니다. 베테랑 개발자가 제공하는 수정 사항 커먼즈웨어, 매우 간단했습니다. 사용 의지. CreateChooser 대신에 ACTION_PICK_ACTIVITY. 하지만, 왜 이 수정 사항을 구현해야 합니까? 왜 Huawei는 애초에 이 허가를 요구합니까? 왜 매우 구체적인 Google 검색을 사용하여 StackOverflow에서 답변을 찾아야 했나요?
선택의 역설
답을 찾으려면, CommonsWare가 버그 보고서를 제출했습니다. Android 버그 추적기에 Google에 문제 조사를 요청합니다. 특히 개발자는 타사 앱이 ACTION_PICK_ACTIVITY에 액세스하는 것을 제한하는 문서화되지 않은 권한 요구 사항을 금지하도록 Google에 요청했습니다. 이러한 요구 사항을 작성하여 CTS, Huawei는 이러한 변경 사항을 준수해야 합니다.
하지만 솔직히 말해서 이 버그 자체는 실제로 큰 문제가 아닙니다. 내가 사용해 본 다른 앱(예: Tasker)은 이 권한을 우회할 수 없었음에도 불구하고 요구 사항을 충족하고 설정 앱 내에서 특정 활동을 시작했지만 실망스럽지 않았습니다. 결과. 하지만 Ambri 씨의 호언장담을 기억하면서 저는 이와 같은 작은 변화가 대처하기 매우 좌절스러울 것이라는 점을 깨달았습니다. 왜냐하면 그것들은 작을지라도 의심할 여지 없이합산하다, 때로는 두통을 유발할 만큼 충분합니다. 설정 앱을 조금만 변경하면 개발자에 대한 부당한 부정적인 리뷰가 발생할 수 있습니다. 문서화가 다소 부족하여 스택 오버플로 스레드를 찾기 위해 인터넷을 샅샅이 뒤져야 했던 작은 변경 사항 중 하나입니다. 다른 장치에는 얼마나 많은 작은 버그가 있습니까?
모바일 공간에서의 경쟁 심화는 소비자에게 좋은 것으로 입증되었지만 이러한 미묘한 변화가 어떻게 나타나는지 확인한 후에는 매우 다양한 제품 라인이 개발자에게 영향을 미칠 수 있기 때문에 저는 개발자의 관점에 대해 감사하게 되었습니다. 분열. 선택 자체가 문제가 아니라 오히려 커뮤니티가 이러한 문제를 분류하는 데 충분한 노력을 기울이지 않는 것입니다. Ambri 씨가 기사에서 제안한 것처럼 아마도 Android 개발자에게는 자신만의 버전이 필요할 것입니다. caniuse.com 또는 sdkcritic.com 모든 모호한 버그를 하나의 데이터베이스에 수집합니다. 유일한 대안은 OEM이 이러한 변경 사항을 적절하게 문서화하거나 애초에 변경을 중단하도록 하는 것입니다. 좋은 결과 내길 바랄 게.
특집 이미지 크레딧: 오픈시그널