Android 시스템 에서 shaareuserid 를 사용 하여 시스템 권한 을 가 져 오 는 튜 토리 얼

7207 단어 Androidshareuserid
Android 는 모든 apk 프로 세 스 에 하나의 공간 을 할당 합 니 다(예 를 들 어/data/data/패키지 이름 아래 파일 에 만 접근 할 수 있 습 니 다).일반적인 상황 에서 apk 간 에는 서로 데이터 에 접근 하 는 것 을 금지 합 니 다.Shared User id 를 통 해 같은 User id 를 가 진 여러 개의 APK 를 같은 프로 세 스에 서 실행 되도록 설정 할 수 있 습 니 다.따라서 기본적으로 서로 임의의 데이터 에 접근 할 수 있 습 니 다.다른 프로 세 스 로 실행 되 는 프로 세 스 로 설정 할 수도 있 고 다른 APK 의 데이터 디 렉 터 리 에 있 는 데이터베이스 와 파일 에 접근 할 수도 있 습 니 다.이 프로그램의 데이터 에 접근 하 는 것 처럼(IPC 메커니즘 을 사용 하여 프로 세 스 간 에,예 를 들 어 AIDL).
하나,같은 shareuserid 를 사용 하여 여러 개의 apk 가 같은 프로 세 스 로 실행 되 고 여러 개의 apk 간 데이터 접근 을 실현 합 니 다.
구현 효과:A.apk assets 디 렉 터 리 의 session.log 를/data/A 패키지 이름/디 렉 터 리 아래로 복사 합 니 다.
A.apk
2016429153254163.png (295×465)
AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.demo1"
  android:sharedUserId="com.example"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name=".MainActivity"
      android:label="@string/title_activity_main" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
 
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
 
</manifest>
B.apk(접근 자원 및 복사 실현)
MainActivity.java

package com.example.demo2;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
 
public class MainActivity extends Activity {
 
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Context context = null;
    InputStream input = null;
    OutputStream output = null;
    try {
      context = this.createPackageContext("com.example.demo1",
          Context.CONTEXT_IGNORE_SECURITY);
 
      File file = new File("/data/data/com.example.demo1/session.log");
      if (!file.exists()) {
 
        file.createNewFile();
      }
      input = context.getAssets().open("session.log");
      output = new FileOutputStream(file);
      byte[] buffer = new byte[1024];
      int readLength = 0;
      while((readLength = input.read(buffer)) != -1){
        output.write(buffer, 0, readLength);
      }
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    finally{
      try {
        if(input!=null || output!= null){
          input.close();
          output.close();
          input = null;
          output = null;
        }
      } catch (Exception e2) {
        // TODO: handle exception
      }
    }
  }
 
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
  }
 
}
AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.demo2"
  android:versionCode="1"
  android:versionName="1.0"
  android:sharedUserId="com.example"> 
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />
  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name=".MainActivity"
      android:label="@string/title_activity_main" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
 
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
 
</manifest>
A.apk,B.apk 는 같은 shareduserid:com.example 를 사용 합 니 다.
구현 효과:
2016429153341484.png (492×64)
2.shareduserid 를 통 해 시스템 권한 가 져 오기
(1)Android Manifest.xml 에 android:shared UserId="android.uid.system"추가
(2)Android.mk 파일 에 LOCAL 추가CERTIFICATE:=platform(시스템 서명 사용)
(3)소스 코드 아래 mm 컴 파일
이렇게 생 성 된 apk 는 system 권한 을 가 져 올 수 있 습 니 다.임의의 system 권한 디 렉 터 리 아래 에서 디 렉 터 리 나 파일 을 만 들 수 있 고 다른 apk 자원 에 접근 할 수 있 습 니 다.
확장
   
시스템 에 서 는 UID 를 공유 하 는 APK 로 android.uid.system 을 사용 합 니 다.먼저 manifest 노드 에 android:shared UserId="android.uid.system"을 추가 한 다음 Android.mk 에 LOCAL 을 추가 합 니 다.CERTIFICATE := platform。Settings 등 을 참고 할 수 있 습 니 다.
시스템 에 서 는 UID 를 공유 하 는 APK 로 android.uid.shared 를 사용 합 니 다.manifest 노드 에 android:shared UserId="android.uid.shared"를 추가 하고 Android.mk 에 LOCAL 을 추가 합 니 다.CERTIFICATE := shared。Launcher 등 을 참고 할 수 있 습 니 다.
시스템 에서 android.media 를 공유 UID 로 사용 하 는 모든 APK 는 manifest 노드 에 android:shared UserId="android.media"를 추가 하고 Android.mk 에 LOCAL 을 추가 합 니 다.CERTIFICATE := media。갤러리 등 을 참조 할 수 있 습 니 다.
4.문제 해결
마지막 으로 이 android:shared UserId 속성 은 apk 를 시스템 프로 세 스에 넣 을 수 있 을 뿐만 아니 라 여러 개의 APK 를 한 프로 세 스에 서 실행 하도록 설정 할 수 있 습 니 다.이렇게 하면 데 이 터 를 공유 할 수 있 고 유용 할 것 입 니 다.
AndroidMenifest.xml 에서 android:shared UserId="android.uid.system"을 볼 수 있 습 니 다.
그러나 이 문장 이 있 으 면 sd 카드 에 읽 기와 쓰기 동작 을 할 수 없습니다.예 를 들 어 SD 카드 에 새 폴 더 를 만 드 는 것 은 성공 하지 못 했 습 니 다.하지만 android:shared UserId="android.uid.system"주석 을 지우 면 SD 카드 에서 IO 작업 을 할 수 있 습 니 다.
Settings 에서 android:shared UserId="android.uid.system"은 없어 서 는 안 됩 니 다.많은 Settings 에서 응용 프로그램 이 켜 지지 않 거나 켜 자마자 잘못 보고 합 니 다.
해결 방법 1:
  
vold 모듈 의 Volume.cpp 파일
도 마 운 트 를 호출 하 는 문구 에 수정 을 해 주세요~

doMount(devicePath, path, false, false, false,1000, 1015, 0702, true)
↓
doMount(devicePath, path, false, true, false,1000, 1015, 0002, true)
컴 파일 해서 해 봐.
해결 방법 2:
SD 카드 가 작 동 하 는 기능 을 독립 시 켜 하나의 독립 된 APK 로 만 든 다음 원래 프로젝트 에서 변경 기능 을 호출 하면 된다.

좋은 웹페이지 즐겨찾기