부여 된 INSTALL_PACKAGES 권한을 사용하여 자동으로 앱 설치


86

시스템에 apk를 자동으로 설치하려고합니다. 내 앱은 / system / app에 있으며 "android.permission.INSTALL_PACKAGES"권한이 성공적으로 부여되었습니다.

그러나이 권한을 사용하는 방법을 어디서도 찾을 수 없습니다. / data / app에 파일을 복사하려고했지만 성공하지 못했습니다. 또한이 코드를 사용해 보았습니다.

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(
            Uri.parse("file:///sdcard/app.apk"),
            "application/vnd.android.package-archive");
    startActivity(intent);

그러나이 코드는 표준 설치 대화 상자를 엽니 다. 권한이 부여 된 루트없이 자동으로 앱을 설치하려면 어떻게해야 android.permission.INSTALL_PACKAGES합니까?

추신 : 처음 시작할 때 폴더에서 시스템으로 많은 APK를 설치하는 앱을 작성 중입니다 (설치 마법사 교체). 펌웨어를 가볍게 만들기 위해 필요합니다.

내가 바이러스를 작성하고 있다고 생각하는 경우 : 모든 프로그램이 / data / app에 설치됩니다. 권한 Install_packages는 / system / app에 있거나 시스템 키로 서명 된 시스템 수준 프로그램에만 부여 할 수 있습니다. 그래서 바이러스는 거기에 도달 할 수 없습니다.

로 말했다 http://www.mail-archive.com/android-porting@googlegroups.com/msg06281.html 애플리케이션들이 install_packages 권한이있는 경우 설치 침묵 할 수 있습니다. 또한 패키지를 자동으로 설치하기 위해 Install_packages 권한이 필요하지 않습니다. 또한 http://www.androidzoom.com/android_applications/tools/silent-installer_wgqi.html


9
@Fosco 그가 OEM (Original Equipment Manufacturer)과 같은 장치를 만들고 있다고 가정 해 보겠습니다.
dascandy 2011 년

41
@Fosco 누가 무슨 상관이야? dascandy가 설명하는 것처럼 유효한 질문입니다. 사람들이 이와 같은 질문에 "당신은 그렇게해서는 안된다"고 대답하는 것은 일반적으로 비생산적입니다. 그런 대답으로 우리는 어떤 이해를 얻고 있습니까?
ZachM

3
비생산적이라고 말하면 .. 당신은이 파티 Zach에 2 년 조금 더 늦었습니다. 그리고 질문은 원래와는 많이 달라 보입니다.
Fosco 2014 년

2
@Fosco LOL. 또한 이것이 최신 안드로이드 OS에서 여전히 작동하고 있음을 확인할 수 있습니다.
POMATu

1
@LarsH 방금 F-Droid 앱을 설치했습니다. 그들은 자동으로 설치하지 않고 Android의 패키지 관리자를 표시합니다.
Joaquin Iurchuk

답변:


60

첫 번째 방법은 Android의 기본 PackageInstaller 를 살펴 보는 것 입니다. 원하는 방식으로 해당 앱을 수정하거나 필요한 기능을 추출하는 것이 좋습니다.


특히 PackageInstallerActivity 와 그 방법 을 살펴보면 다음 과 onClickListener같습니다.

 public void onClick(View v) {
    if(v == mOk) {
        // Start subactivity to actually install the application
        Intent newIntent = new Intent();
        ...
        newIntent.setClass(this, InstallAppProgress.class);
        ...
        startActivity(newIntent);
        finish();
    } else if(v == mCancel) {
        // Cancel and finish
        finish();
    }
}

그러면 실제 설치 프로그램이 InstallAppProgress 클래스에 있음을 알 수 있습니다. 그 클래스를 살펴보면 이것이 initView핵심 설치 프로그램 함수라는 것을 알 수 있으며 마지막으로하는 일은 PackageManagerinstallPackage함수를 호출하는 것입니다.

public void initView() {
...
pm.installPackage(mPackageURI, observer, installFlags, installerPackageName);
}

다음 단계는 추상 클래스 인 PackageManager 를 검사 하는 것입니다. installPackage(...)거기에서 기능을 찾을 수 있습니다. 나쁜 소식은 @hide로 표시되어 있다는 것입니다. 이것은 직접 사용할 수 없음을 의미합니다 (이 메서드를 호출하여 컴파일 할 수 없음).

 /**
  * @hide
  * ....
  */
  public abstract void installPackage(Uri packageURI,
             IPackageInstallObserver observer, 
             int flags,String installerPackageName); 

그러나 리플렉션을 통해이 메서드에 액세스 할 수 있습니다.

PackageManagerinstallPackage기능이 어떻게 구현 되는지에 관심이 있다면 PackageManagerService를 살펴보십시오 .

요약

를 통해 패키지 관리자 개체를 Context가져와야 getPackageManager()합니다. 그런 다음 installPackage리플렉션을 통해 함수를 호출 합니다.


2
도움! 이 기술의 결과는 다음과 같습니다. 원인 : java.lang.SecurityException : 사용자 10101과 현재 프로세스 모두 android.permission.INSTALL_PACKAGES가 없습니다. 내 앱에 해당 권한이 있지만
gregm 2011-06-30

13
앱에서 해당 권한을 요청하지만 Android는 타사 앱에 해당 권한을 부여하지 않습니다. LogCat권한 관련 로그는을 참조하십시오 .
inazaruk 2011-06-30

@inazaruk 나는 / system / app에 설치된 앱이 install_pakages를 사용할 수 있도록 자동으로 권한을 얻지 만이 게시물 에서 설명한대로 작동하지 않는 것 같습니다. 힌트를 좀 주실 수 있나요?
Zorb 2011

3
리플렉션을 통해 어떻게 installPackage를 호출 할 수 있습니까? 실제로 할 수 없습니다 Method method = aPackageManagerClass.getMethod ( "installPackage", new Class [] {Uri.class, IPackageInstallObserver.class, Integer.TYPE, String.class}); IPackageInstallObserver도 숨겨져 있으므로 누군가 여기에 반영을 수행하는 올바른 코드를 게시하여 나를 도울 수 있습니까?
Shilaghae 2013 년

7
답변의 모든 링크가 죽었습니다.
Mayur Gangurde 2017

13

ADB가 앱을 설치하는 방법을 확인했습니다. -APK
를 / data / local / tmp에 복사합니다
.- 'shell : pm install /data/local/tmp/app.apk'를 실행합니다.

나는 다음을 수행 하여이 동작을 복제하려고 시도했습니다. (PC에서 USB 케이블 사용)
adb push app.apk /sdcard/app.apk
adb shell
$ pm install /sdcard/app.apk
이것은 작동합니다. 앱이 설치되었습니다.

다른 앱을 설치해야하는 애플리케이션 (AppInstall)을 만들었습니다.
(비 뿌리 장치, 일반적으로 설치)
이 수행합니다
Runtime.getRuntime().exec("pm install /sdcard/app.apk").waitFor();
그러나 이것은 오류가 있습니다 :
java.lang.SecurityException: Neither user 10019 nor current process has android.permission.INSTALL_PACKAGES.
오류가없는 AppInstall에 의해, 오후에 의해 발생되는 것 같다.
SecurityException은 AppInstall에 의해 포착되지 않고 앱이 충돌하지 않기 때문입니다.

루팅 된 기기 (동일한 앱과 AppInstall)에서 똑같은 작업을 시도했는데 매력처럼 작동했습니다.
(또한 일반적으로 / system 또는 다른 곳에 설치되지 않음)
AppInstall은 루트 권한을 요청하지 않았습니다.
그러나 셸은 항상 해당 장치 #대신에 있기 때문 $입니다.

Btw, / system에 앱을 설치하려면 루트가 필요합니다. 맞습니까?
나는 루팅되지 않은 장치에서 adb remount를 시도하고 얻었습니다.
remount failed: Operation not permitted.
그래서 루팅되지 않은 장치 에서 / system 일을 시도 할 수 없었습니다.

결론 : 루팅 된 기기를 사용해야합니다.
도움이되기를 바랍니다. :)


나는 이것을 작동시킬 수없는 것 같다. 명령이 ADB 셸에서 잘 작동하고 프로그래밍 방식으로 실행하려고 할 때 작동하지 않는 것 같습니다.
saulpower

네, 똑같은 문제가 있습니다. 쉘에서 작동 su
하지만를

최고 관리자 권한 받기와 같이 Google 기기에서 작업하는 다른 방법이 있나요?
라 메쉬 쿠마르

최고 관리자 권한을 원하는 경우 1) 기기를 루팅하고, ​​2) 시스템 파티션에 앱을 설치하거나, ​​3) OS 자체와 동일한 키로 앱을 서명해야합니다.
FrankkieNL

1
ADB 사용자와 애플리케이션의 사용자가 서로 다른 권한을 가지고 있기 때문에 발생합니다
PHPoenX

12

최근 사용자 동의없이 설치를 구현하고 있습니다. API 레벨 21 이상을위한 키오스크 애플리케이션으로 환경을 완전히 제어 할 수있었습니다.

기본 요구 사항은 다음과 같습니다.

  • API 레벨 21 이상
  • 시스템 권한이있는 앱으로 업데이터를 설치하기위한 루트 액세스 .

다음 메소드는 InputStream에서 APK를 읽고 설치합니다.

public static boolean installPackage(Context context, InputStream in, String packageName)
            throws IOException {
        PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(packageName);
        // set params
        int sessionId = packageInstaller.createSession(params);
        PackageInstaller.Session session = packageInstaller.openSession(sessionId);
        OutputStream out = session.openWrite("COSU", 0, -1);
        byte[] buffer = new byte[65536];
        int c;
        while ((c = in.read(buffer)) != -1) {
            out.write(buffer, 0, c);
        }
        session.fsync(out);
        in.close();
        out.close();

        Intent intent = new Intent(context, MainActivity.class);
        intent.putExtra("info", "somedata");  // for extra data if needed..

        Random generator = new Random();

        PendingIntent i = PendingIntent.getActivity(context, generator.nextInt(), intent,PendingIntent.FLAG_UPDATE_CURRENT);
            session.commit(i.getIntentSender());


        return true;
    }

다음 코드는 설치를 호출합니다.

 try {
     InputStream is = getResources().openRawResource(R.raw.someapk_source);
                    installPackage(MainActivity.this, is, "com.example.apk");
     } catch (IOException e) {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
     }

모든 것이 작동하려면 INSTALL_PACKAGES권한 이 절실히 필요합니다 . 그렇지 않으면 위 코드가 조용히 실패합니다.

<uses-permission
        android:name="android.permission.INSTALL_PACKAGES" />

이 권한을 얻으려면 루트가 필요한 시스템 애플리케이션으로 APK를 설치해야합니다 (업데이터 애플리케이션을 설치 한 후에는 루트없이 작동하는 것 같습니다).

시스템 애플리케이션으로 설치하기 위해 서명 된 APK를 생성하고

adb push updater.apk /sdcard/updater.apk

다음으로 이동 system/priv-app-FS를 다시 마운트해야 함 (이것이 루트가 필요한 이유입니다)

adb shell
su
mount -o rw,remount /system
mv /sdcard/updater.apk /system/priv-app
chmod 644 /system/priv-app/updater.apk

어떤 이유로 간단한 디버그 버전에서는 작동하지 않았지만 어떤 이유로 애플리케이션 이 선택되지 않으면 logcat 에 유용한 정보가 표시됩니다 priv-app.


"어떤 이유로 간단한 디버그 버전에서는 작동하지 않았습니다."릴리스에서 작동 했습니까, 아니면 다른 "간단한"디버그 버전에서 작동 했습니까?
JM Lord

1
@JMLord 서명 된 릴리스 버전에서 작동했으며 서명 된 디버그 버전 과 서명되지 않은 디버그 버전 모두에서 작동하지 않았습니다. 서명 된 디버그 버전에서 작동하지 않는 것이 이상하지만 조사 할 시간이 없었습니다. 그럼에도 불구하고 시스템 logcat 로그는 APK가 설치되었는지 여부를 확인하는 데 매우 중요합니다.
Boris Treukhov

실제로 어떤 이유로 INSTALL_PACKAGES 권한을 얻으려면 릴리스로 설치하는 것이 중요했습니다. 앱이 priv-app의 서명 된 디버그에서 실행될 수 있지만 권한 요청이 거부되었습니다. 감사합니다!
JM Lord

@BorisTreukhov 안녕하세요 packageName 매개 변수의 용도에 대해 확인해 주시겠습니까? InputStream을 FileInputStream으로 변경했지만 다음 오류 메시지가 나타납니다. /data/app/vmdl676191029.tmp/COSU

이 명령 후에 시스템 priv 앱을 설치하는 방법은 무엇입니까?
user2323471

8

정의해야합니다

<uses-permission
    android:name="android.permission.INSTALL_PACKAGES" />

매니페스트에서 시스템 파티션 (/ system / app)에 있거나 제조업체에서 서명 한 애플리케이션이 있는지 여부에 관계없이 INSTALL_PACKAGES 권한을 갖게됩니다.

내 제안은 리플렉션을 통해 installPackages를 호출하고 패키지를 설치하고 실제 메서드를 호출하는 방법으로 jar를 내보내는 데 사용되는 1.5 호환성 수준의 작은 Android 프로젝트를 만드는 것입니다. 그런 다음 프로젝트에서 jar를 가져 오면 패키지를 설치할 준비가 된 것입니다.


5

나는 루팅 된 Android 4.2.2에서 시도 했으며이 방법은 나를 위해 작동합니다.

private void installApk(String filename) {
    File file = new File(filename); 
    if(file.exists()){
        try {   
            final String command = "pm install -r " + file.getAbsolutePath();
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
     }
}

2
문제는 루트없이 시스템 "INSTALL_PACKAGES"권한으로 앱을 설치하는 것이 었습니다. 답변에 "su"가 표시되므로 루트가 필요합니다.
POMATu

이 답변에 감사드립니다! 나는 같은 코드를 가지고 있었지만 "pm install -r"대신 "adb install -r"을 사용하고 있었고 그것은 나를 위해 작동하지 않을 것입니다. 여기에서 많은 시간을 절약했습니다!
Jeff.H dec.

@Vladmir 나는 당신의 도움이 필요합니다. 시간 좀 주 시겠어요? 나는 u에게 매우 감사 할 것입니다
twana eng

4

그 시간에 아무도 대답하지 않았기 때문에 어떻게해야할지 몰랐고이 허가에 대한 문서를 찾지 못했습니다. 그래서 나만의 해결책을 찾았습니다. 당신의 것보다 더 나쁘지만 어쨌든 이것은 해결책입니다.

/ data / app에 777 권한을 설정 한 busybox를 설치했습니다 (보안에 대해서는 신경 쓰지 않습니다). 그런 다음 앱에서 "busybox 설치"를 실행했습니다. 이것은 작동하지만 큰 보안 누출이 있습니다. 권한 777을 설정하면 루트가 필요하지 않습니다.


3
이런 코드를 사용 하셨나요? Process install; install = Runtime.getRuntime().exec("/system/bin/busybox install " + myAPK.getAbsolutePath()); int iSuccess = install.waitFor();
Someone Somewhere

4

android.content.pm.IPackageInstallObserver리플렉션으로 숨겨진 API 를 사용할 수 있습니다 .

public class PackageManagement {
    public static final int INSTALL_REPLACE_EXISTING = 0x00000002;
    public static final int INSTALL_SUCCEEDED = 1;

    private static Method installPackageMethod;
    private static Method deletePackageMethod;

    static {
        try {
            installPackageMethod = PackageManager.class.getMethod("installPackage", Uri.class, IPackageInstallObserver.class, Integer.TYPE, String.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void installPackage(PackageManager pm, Uri mPackageUri, IPackageInstallObserver observer, int installFlags, String installerPackageName) {
        try {
            installPackageMethod.invoke(pm, mPackageUri, observer, installFlags, installerPackageName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

android.content.pm.IPackageInstallObserver프로젝트로 가져 옵니다. 앱은 시스템이어야합니다. android.permission.INSTALL_PACKAGES매니페스트 파일에서 권한 을 활성화해야 합니다.


Lollipop 및 Marshamallow에서이 코드를 테스트 했습니까? 나에게 멋진 방법처럼 보인다 나는 그것을 사용하고자하는
여보 Faghihi

ICS에서 Lollipop으로 테스트했습니다
Hermann Poilpre 2016 년

볼 줄은 "앱은 시스템이어야합니다"입니다. 당신의 앱이 "시스템", 즉 당신의 앱이 시스템 권한 (기본적으로 루트)을 가지고 있다는 점을 감안하면 이것이 롤리팝 등에서 작동 할 것이라고 확신합니다. 이 경우 명령 줄 설치 프로그램을 사용할 수도 있습니다.
Lassi Kinnunen

1
installPackage 메소드를 어떻게 호출합니까? 예를 들어 IPackageInstallObserver를 어떻게 얻습니까?
phoebus

installFlags의 값은 무엇입니까?
Shivam Kumar

3

adb install 명령을 사용하여 APK를 자동으로 설치 / 업데이트 할 수 있습니다. 샘플 코드는 다음과 같습니다.

public static void InstallAPK(String filename){
    File file = new File(filename); 
    if(file.exists()){
        try {   
            String command;
            filename = StringUtil.insertEscape(filename);
            command = "adb install -r " + filename;
            Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
            proc.waitFor();
        } catch (Exception e) {
        e.printStackTrace();
        }
     }
  }

여기서 StringUtils는 무엇을 의미합니까? 해결할 수없는 오류가 있습니까?
AndroidOptimist

설명 했어야해서 미안 해요. 이것은 문자열에 대한 내 사용자 정의 클래스 이며이 방법은 해당 경로가 올바른지 확인합니다. 당신은 무시할 수
ZeeShaN 압바스에게

3
StringUtil 클래스는 무엇입니까? StringUtil.insertEscape () 메소드를 게시 할 수 있습니까?. 내가 그 줄에 주석을 달면 exec ()를 실행하는 동안 예외가 발생했습니다. 명령 : [su, -c, adb install -r /storage/sdcard0/Android/data/com.install.file 미리 감사드립니다
sandeepmaaram 2014-08-13

java.io.IOException : exec () 실행 오류. 명령 : [su, -c, adb install -r /storage/emulated/0/download/SwipeAnimation.apk] 작업 디렉토리 : null 환경 : null-오류를 설명 할 수 있나요 ..? 및 매니페스트의 모든 권한 경우
하기 Sandeep P

1
문제를 응원 후 @ZeeShaNAbbAs는 .. 덕분에 해결
하기 Sandeep P

1

전제 조건 :

APK는 앞에서 올바르게 지적한대로 시스템에서 서명해야합니다. 이를 달성하는 한 가지 방법은 AOSP 이미지를 직접 빌드하고 빌드에 소스 코드를 추가하는 것입니다.

암호:

시스템 앱으로 설치되면 패키지 관리자 방법을 사용하여 다음과 같이 APK를 설치 및 제거 할 수 있습니다.

설치:

public boolean install(final String apkPath, final Context context) {
    Log.d(TAG, "Installing apk at " + apkPath);
    try {
        final Uri apkUri = Uri.fromFile(new File(apkPath));
        final String installerPackageName = "MyInstaller";
        context.getPackageManager().installPackage(apkUri, installObserver, PackageManager.INSTALL_REPLACE_EXISTING, installerPackageName);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

제거:

public boolean uninstall(final String packageName, final Context context) {
    Log.d(TAG, "Uninstalling package " + packageName);
    try {
        context.getPackageManager().deletePackage(packageName, deleteObserver, PackageManager.DELETE_ALL_USERS);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

APK가 설치 / 제거 된 후 콜백을 받으려면 다음을 사용할 수 있습니다.

/**
 * Callback after a package was installed be it success or failure.
 */
private class InstallObserver implements IPackageInstallObserver {

    @Override
    public void packageInstalled(String packageName, int returnCode) throws RemoteException {

        if (packageName != null) {
            Log.d(TAG, "Successfully installed package " + packageName);
            callback.onAppInstalled(true, packageName);
        } else {
            Log.e(TAG, "Failed to install package.");
            callback.onAppInstalled(false, null);
        }
    }

    @Override
    public IBinder asBinder() {
        return null;
    }
}

/**
 * Callback after a package was deleted be it success or failure.
 */
private class DeleteObserver implements IPackageDeleteObserver {

    @Override
    public void packageDeleted(String packageName, int returnCode) throws RemoteException {
        if (packageName != null) {
            Log.d(TAG, "Successfully uninstalled package " + packageName);
            callback.onAppUninstalled(true, packageName);
        } else {
            Log.e(TAG, "Failed to uninstall package.");
            callback.onAppUninstalled(false, null);
        }
    }

    @Override
    public IBinder asBinder() {
        return null;
    }
}

/**
 * Callback to give the flow back to the calling class.
 */
public interface InstallerCallback {
    void onAppInstalled(final boolean success, final String packageName);
    void onAppUninstalled(final boolean success, final String packageName);
}

===> Android 8.1에서 테스트되었으며 잘 작동했습니다.


당신의 도움이 필요합니다. 시간 좀 주 시겠어요? 나는 u에게 매우 감사 할 것입니다
twana eng

당신의 도움을 원합니다. AOSP를 어떻게 만들 수 있는지 알고 싶습니다.
twana eng

0

PackageManager.installPackage 메서드를 사용하여 자동 설치용 테스트 앱을 만들었습니다.

리플렉션을 통해 installPackage 메서드를 얻고 내 src 폴더에 android.content.pm.IPackageInstallObserver 인터페이스를 만들었습니다 (android.content.pm 패키지에 숨겨져 있기 때문에).

installPackage를 실행할 때 내 앱에 android.permission.INSTALL_PACKAGES가 없지만 AndroidManifest.xml에 정의되어 있다는 문자열 표시와 함께 SecurityException이 발생했습니다.

그래서 저는이 방법을 사용할 수 없다고 생각합니다.

추신. Android SDK 2.3 및 4.0에서 테스트했습니다. 아마도 이전 버전에서 작동 할 것입니다.


4.1 및 4.0뿐만 아니라 2.1 이상의 Android 버전 (2.1 포함)에서도 작동합니다. 지금 4.0 SDK를 사용하고 있습니다. / system / app 폴더에 추가해야합니다. 그렇지 않으면 앱에 필요한 시스템 수준 (루트 아님) 권한이 없습니다. 또한이 방법으로 앱을 자동으로 삭제할 수 있으므로 삭제와 관련된 다른 질문을 확인하십시오.
POMATu

예, 작동하지만 루트 권한으로 만 작동합니다. 그리고 루팅되지 않은 기기에서는 시스템 / 앱에 앱을 설치할 수 없습니다.
Андрей Москвичёв

루트가 아니라 시스템 수준 권한이 있습니다. 펌웨어 제조업체 인 경우 / system / app에 추가 할 수 있습니다. 내 경우에는-나는 있습니다 (장치 제조업체에 내 APK를 펌웨어에 추가하도록 요청합니다). 다른 방법으로는 앱을 자동으로 설치할 수 없습니다. 그렇지 않으면 큰 보안 허점이 될 것입니다.
POMATu

보안 구멍에 대해-나는 당신에게 절대적으로 동의합니다. 이 방법이 어떤 앱에서도 작동한다면 저에게는 깜짝 놀랄 것입니다. 루팅하지 않고 / system / app에 앱을 설치하려면 어떻게해야합니까? 나는 제조자가 아닙니다.
Андрей Москвичёв 2013-02-16

1
루트 또는 리 플래싱 없이는 할 수 없습니다.
POMATu 2013

0

LD_LIBRARY_PATH=/vendor/lib:/system/lib오후 설치 ​​전에 이것을 시도하십시오 . 잘 작동한다.


0

타사 응용 프로그램은 Android 앱을 느리게 설치할 수 없습니다. 그러나 타사 응용 프로그램은 Android OS에 응용 프로그램을 설치하도록 요청할 수 있습니다.

따라서 이것을 정의해야합니다.

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file:///sdcard/app.apk", "application/vnd.android.package-archive");
startActivity(intent);

권한을 부여하고이 정의를 무시하기 위해 시스템 앱으로 설치를 시도 할 수도 있습니다. (루트 필요)

타사 앱에서 다음 명령을 실행하여 루팅 된 기기에 앱을 설치할 수 있습니다.

코드는 다음과 같습니다.

private void installApk(String filename) {
File file = new File(filename); 
if(file.exists()){
    try {   
        final String command = "pm install -r " + file.getAbsolutePath();
        Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
        proc.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }
 }
}

이 답변이 도움이 되었기를 바랍니다.


0

Android 6 이상에서 자동 설치가 가능합니다. Boris Treukhov의 답변에 제공된 기능을 사용하여 게시물의 다른 모든 것을 무시하고 루트도 필요하지 않습니다.

기기 관리자로 앱을 설치하면 백그라운드에서 업데이트를 자동으로 설치하여 전체 키오스크 모드를 사용할 수 있습니다.




-6

! / bin / bash

f=/home/cox/myapp.apk   #or $1 if input from terminal.

#backup env var
backup=$LD_LIBRARY_PATH
LD_LIBRARY_PATH=/vendor/lib:/system/lib
myTemp=/sdcard/temp.apk
adb push $f $myTemp
adb shell pm install -r $myTemp
#restore env var
LD_LIBRARY_PATH=$backup

이것은 나를 위해 작동합니다. 나는 쉘 터미널에서 우분투 12.04에서 이것을 실행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.