Chromium on Android: ContentShell 의 AndroidManifest 파일 해독

본 고 는 Content Shell 을 예 로 들 어 Manifest 파일 의 핵심 요소 성명 을 간략하게 분석 하고 후속 장 에 서 는 Content Shell 의 시작 과정 과 내부 구조 등 을 점차적으로 분석 할 것 이다.
Android Manifest 는 권한, 응용 프로그램, Activity, 콘 텐 츠 제공 자, Intent 필터, 허 용 된 배경 service 프로 세 스 이름과 수량 등 여러 정 보 를 포함 한 응용 프로그램의 기본 정 보 를 설명 합 니 다.Chromium 은 모든 플랫폼 에 하나의 케이스 프로그램 을 제공 합 니 다. Android 플랫폼 도 예외 가 아 닙 니 다. 간단 한 주소 입력 표시 줄 과 네 비게 이 션 표시 줄 만 제공 하고 가장 기본 적 인 웹 페이지 렌 더 링 기능 을 가 집 니 다. 주로 Content API 를 통 해 Chromium 커 널 을 맞 추 는 방법 을 보 여 주 려 고 합 니 다.
다음은 ContentShell 프로그램 을 만 드 는 Manifest 파일 (src/content/shell/android/shell apk/android Manifest. xml) 입 니 다.
<?xml version="1.0" encoding="utf-8"?>

<!-- Copyright (c) 2012 The Chromium Authors. All rights reserved.

     Use of this source code is governed by a BSD-style license that can be
     found in the LICENSE file.
 -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.chromium.content_shell_apk">

    <permission android:name="org.chromium.content_shell.permission.SANDBOX"
            android:protectionLevel="signature" />

    <application android:name="ContentShellApplication"
            android:icon="@mipmap/app_icon"
            android:label="Content Shell">
        <activity android:name="ContentShellActivity"
                  android:launchMode="singleTask"
                  android:theme="@android:style/Theme.Holo.Light.NoActionBar"
                  android:configChanges="orientation|keyboardHidden|keyboard|screenSize"
                  android:hardwareAccelerated="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- The following service entries exist in order to allow us to
             start more than one sandboxed process. -->

        <!-- NOTE: If you change the values of "android:process" for any of the below services,
             you also need to update kHelperProcessExecutableName in chrome_constants.cc. -->
        <service android:name="org.chromium.content.app.SandboxedProcessService0"
                 android:process=":sandboxed_process0"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService1"
                 android:process=":sandboxed_process1"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService2"
                 android:process=":sandboxed_process2"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService3"
                 android:process=":sandboxed_process3"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService4"
                 android:process=":sandboxed_process4"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService5"
                 android:process=":sandboxed_process5"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService6"
                 android:process=":sandboxed_process6"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService7"
                 android:process=":sandboxed_process7"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService8"
                 android:process=":sandboxed_process8"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService9"
                 android:process=":sandboxed_process9"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService10"
                 android:process=":sandboxed_process10"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService11"
                 android:process=":sandboxed_process11"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
        <service android:name="org.chromium.content.app.SandboxedProcessService12"
                 android:process=":sandboxed_process12"
                 android:permission="org.chromium.content_shell.permission.SANDBOX"
                 android:isolatedProcess="true"
                 android:exported="false" />
    </application>

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>

안 드 로 이 드 애플 리 케 이 션 개발 경험 이 있 는 사람들 은 이 Manifest 파일 에 대해 낯 설 지 않다. 예 를 들 어 애플 리 케 이 션, Activity, Permission 등 성명 이지 만 몇 가지 특별한 설명 이 필요 하 다.
SANdbOX 보안 권한 에 대한 설명
< permission > 성명 은 서비스 프로 세 스에 대한 보호 입 니 다. ContentShell 응용 프로그램 자체 만 서비스 프로 세 스 를 시작 할 수 있 음 을 나타 냅 니 다. 이 서비스 프로 세 스 를 시작 하 라 고 요청 한 다른 응용 프로그램 에 대해 안 드 로 이 드 시스템 은 서명 검사 에 따라 주어진 권한 을 부여 하 는 지 확인 해 야 합 니 다.위 와 같이 < 서비스 > 요 소 는 이 permission 을 가 져 야 서비스 프로 세 스 를 조작 할 수 있 는 프로그램 을 명시 적 으로 지정 하 였 습 니 다.
13 개의 < 서비스 > 요소 에 대한 설명
이 manifest 파일 의 가장 눈 에 띄 는 것 은 13 개의 < 서비스 > 요소 에 대한 성명 입 니 다.Chromium 은 다 중 프로 세 스 모델 에 구 축 된 시스템 으로 모든 페이지 가 하나의 독립 된 렌 더 링 프로 세 스 에서 실 행 됩 니 다. 모든 로 컬 자원 에 대한 접근 은 IPC (프로 세 스 간 통신) 방식 으로 브 라 우 저 프로 세 스 를 요청 해 야 합 니 다. 예 를 들 어 네트워크 자원 의 로드, 파일 시스템 의 접근, 창 UI 시스템 의 조작 등 입 니 다.렌 더 링 프로 세 스 의 주요 작업 은 페이지 의 레이아웃 과 자바 스 크 립 트 의 실행 입 니 다. 안전 을 고려 하여 신뢰 할 수 없 는 샌 드 박스 (Sandbox) 에서 실 행 됩 니 다.
Android 에서 모든 렌 더 링 프로 세 스 는 실제 적 으로 격 리 된 서비스 프로 세 스 (isolatedprocess: true) 입 니 다. 이 13 개의 < service > 요 소 는 ContentShell 을 최대 13 개의 서비스 프로 세 스, 즉 13 개의 렌 더 링 프로 세 스 만 동시에 실행 할 수 있 도록 지정 합 니 다.렌 더 링 프로 세 스 수가 상한 선 에 도 달 했 을 때 실행 중인 서비스 프로 세 스 에서 새로운 페이지 를 렌 더 링 할 것 을 선택해 야 합 니 다. 예 를 들 어 페이지 가 새로운 링크 주 소 를 열 었 습 니 다.그렇다면 합 리 적 인 서비스 프로 세 스 수 를 어떻게 확정 합 니까?실제로 Chromium 은 실행 할 때 시스템 의 물리 적 메모리 에 따라 몇 개의 서비스 프로 세 스 를 시작 할 수 있 는 지 평가 합 니 다. 시스템 에 1G 의 물리 적 내용 이 있 고 렌 더 링 프로 세 스 가 40M 을 차지한다 고 가정 하면 실제 시작 하 는 서비스 프로 세 스 수 는 512 M/40M = 12 개 입 니 다. Manifest 에서 13 개의 서비스 프로 세 스 를 설명 한 것 입 니 다.1G 의 시스템 에서 실제 실행 과정 에서 최대 12 개의 서비스 프로 세 스 만 시작 할 수 있 습 니 다.
모든 < 서비스 > 요 소 는 permission 를 org. chromium. content 로 지정 합 니 다.셸. permission. SANDBOX 는 이 지정 한 권한 을 가 진 프로그램 만 startService, bidService 또는 stopService 방법 을 실행 할 수 있 습 니 다.
이에 따라 Chromium 은 이 13 개의 < 서비스 > 요 소 를 위해 13 개의 자바 류 를 만 들 었 고 Sandboxed ProcessService [0... 12], Sandboxed ProcessService 는 android. app. Service 에 계승 되 었 다.service 프로 세 스 를 Chromium 다 중 프로 세 스 모델 에 통합 하려 면 다음 과 같은 몇 가지 문 제 를 고려 해 야 합 니 다.
  • Service 프로 세 스 를 시작/중지 합 니 다.브 라 우 저 프로 세 스 가 렌 더 링 에 하위 프로 세 스 를 만들어 야 할 때 C++ 엔 드 는 어떤 시기 에 배경 에 있 는 service 프로 세 스 를 시작 해 야 합 니까?브 라 우 저 프로 세 스 가 렌 더 링 프로 세 스 를 없 앤 후에 어떻게 service 프로 세 스 를 중단 합 니까?Service 프로 세 스 를 시작 한 후, 어떻게 Service 프로 세 스 가 Content 의 주 입구 에서 주 메시지 순환 처 리 를 시작 합 니까?
  • Service 프로 세 스 와 Browser 프로 세 스 의 연결 관리.Chromium 은 Browser 프로 세 스 와 Renderer 프로 세 스 사이 에 IPC 연결 채널 을 만들어 야 한다 고 요구 합 니 다. 이 연결 채널 을 어떻게 만 들 고 관리 합 니까?전통 적 인 리 눅 스 플랫폼 과 무엇이 다 릅 니까?
  • Service 프로 세 스 의 배분13 개의 service 프로 세 스 만 사용 할 수 있 습 니 다. 첫 번 째 렌 더 링 프로 세 스 는 Sandbox Process Service 0 을 차지 합 니 다. 이런 식 으로 유추 하지만 수량 이 지정 한 상한 선 에 이 르 렀 을 때 Chromium 은 service 프로 세 스 를 어떻게 교체 합 니까?

  • 이 같은 문제 의 답 은 ChildProcessService, ChildProcessLauncher, ChildProcessConnection 등 몇 가지 관건 적 인 유형의 실현 에 있다.후속 장 은 그들의 실현 세부 사항 을 깊이 있 게 분석 할 것 이다.

    좋은 웹페이지 즐겨찾기