android 9 마운트 해제 가능한 앱을 미리 설치, 한 번만 설치

3199 단어 android1
이전에 코드를 수정하여 마운트 해제 가능한 사전 설치 앱을 만들었지만 고객이 한 번만 설치하라고 요구했기 때문에 뒤에는 상관없고 마운트 해제해도 다시 설치할 필요가 없습니다.
필요한 노드는 미리 설치한 후 apk 파일이 존재하고 다시 시작하면 다시 설치됩니다.
해결 방법:
시스템이 시작된 후 앱이 설치되었는지 확인하고 apk 파일이 존재하는지 확인하며 조건이 충족되면 삭제합니다.
1. 마운트 해제 가능한 앱을 미리 설치한다.
https://blog.csdn.net/cau_eric/article/details/104004350
2、시작 후 ACTION 감청BOOT_COMPLETED 브로드캐스트
https://blog.csdn.net/cau_eric/article/details/89393779 
원본에서 찾았어요. setting에 이런receiver가 있어요.
a. 수정
\packages\apps\Settings\AndroidManifest.xml

추가:

    
         
    

b. Receiver 파일 추가:
public class Mile8Receiver extends BroadcastReceiver {
    private static final String TAG = "Mile8Receiver";
	private final String apk_1 = "/vendor/priv-app/acquisitor_app-release-3.4.0.10-V69.apk";
    private final String apk_2 = "/vendor/priv-app/com.google.android.inputmethod.pinyin.apk";
    private final String apk_3 = "/vendor/priv-app/ES_File_Explorer.apk";
	private final String packageName_1 = "com.nl.android.ecgviewer";
    private final String packageName_2 = "com.google.android.inputmethod.pinyin";
    private final String packageName_3 = "com.estrongs.android.pop";
	private List packages;

    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d(TAG,"=Mile8Receiver=>>ACTION_BOOT_COMPLETED");			
			execSuCmd("mount -o remount -w /vendor");
			packages = getNullSystemPackageNames(context);
			if (isFileExist(apk_1) && isPackageInstalled(packageName_1)){
            	Log.d(TAG,"=Mile8Receiver=apk1=>>");
				execSuCmd("rm -f " + apk_1);
        	}
			if (isFileExist(apk_2) && isPackageInstalled(packageName_2)){
            	Log.d(TAG,"=Mile8Receiver=apk2=>>");
				execSuCmd("rm -f " + apk_2);
        	}
			if (isFileExist(apk_3) && isPackageInstalled(packageName_3)){
            	Log.d(TAG,"=Mile8Receiver=apk3=>>");
				execSuCmd("rm -f " + apk_3);
        	}
		
        }
    }
...
}

c. 앱이 설치되었는지 확인합니다.
private boolean isPackageInstalled(String packageName_input){
        for (String packageName : packages){
            if (packageName.equals(packageName_input)){
                return true;
            }
        }
        return false;
    }

타사 애플리케이션을 가져오는 방법:https://blog.csdn.net/cau_eric/article/details/100572601
d. apk 파일이 있는지 확인합니다.
private boolean isFileExist(String file){
        return (new File(file)).exists();
    }

기본적으로 완공되었지만, 파일을 삭제할 때read-only file 시스템 오류를 알립니다.
해결 방법:https://blog.csdn.net/cau_eric/article/details/104757888
e. su 시스템에서 명령을 실행합니다.
https://blog.csdn.net/cau_eric/article/details/98969975
 
OK!테스트 통과

좋은 웹페이지 즐겨찾기