2017-11-08 14 views
0

내 응용 프로그램이 디버깅 할 때 제대로 작동하지만 Apk 파일을 열고 Apk File을 열면이 오류가 발생하지 않습니다. 널 객체 참조에 '(java.lang.Object 상위, java.lang.Object 상위 []) java.lang.Object 상위 java.lang.reflect.Method.invoke'가상 메소드를 호출Signed Apk을 만들 때 응용 프로그램이 작동을 멈 춥니 다.

시도

내 코드

private class TaskScan extends AsyncTask<Void, Integer, List<AppsListItem>> { 

    private int mAppCount = 0; 

    @Override 
    protected void onPreExecute() { 
     if (mOnActionListener != null) { 
      mOnActionListener.onScanStarted(CleanerService.this); 
     } 
    } 

    @Override 
    protected List<AppsListItem> doInBackground(Void... params) { 
     mCacheSize = 0; 

     final List<ApplicationInfo> packages = getPackageManager().getInstalledApplications(
       PackageManager.GET_META_DATA); 

     publishProgress(0, packages.size()); 

     final CountDownLatch countDownLatch = new CountDownLatch(packages.size()); 

     final List<AppsListItem> apps = new ArrayList<>(); 

     try { 
      for (ApplicationInfo pkg : packages) { 
       mGetPackageSizeInfoMethod.invoke(getPackageManager(), pkg.packageName, 
         new IPackageStatsObserver.Stub() { 

          @Override 
          public void onGetStatsCompleted(PackageStats pStats, 
                  boolean succeeded) 
            throws RemoteException { 
           synchronized (apps) { 
            publishProgress(++mAppCount, packages.size()); 

            mCacheSize += addPackage(apps, pStats, succeeded); 
           } 

           synchronized (countDownLatch) { 
            countDownLatch.countDown(); 
           } 
          } 
         } 
       ); 
      } 

      countDownLatch.await(); 
     } catch (InvocationTargetException | InterruptedException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } 

     return new ArrayList<>(apps); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     if (mOnActionListener != null) { 
      mOnActionListener.onScanProgressUpdated(CleanerService.this, values[0], values[1]); 
     } 
    } 

    @Override 
    protected void onPostExecute(List<AppsListItem> result) { 
     if (mOnActionListener != null) { 
      mOnActionListener.onScanCompleted(CleanerService.this, result); 
     } 

     mIsScanning = false; 
    } 

    private long addPackage(List<AppsListItem> apps, PackageStats pStats, boolean succeeded) { 
     long cacheSize = pStats.cacheSize; 

     //if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      cacheSize += pStats.externalCacheSize; 
     //} 

     if (!succeeded || cacheSize <= 0) { 
      return 0; 
     } 

     try { 
      PackageManager packageManager = getPackageManager(); 
      ApplicationInfo info = packageManager.getApplicationInfo(pStats.packageName, 
        PackageManager.GET_META_DATA); 

      apps.add(new AppsListItem(pStats.packageName, 
        packageManager.getApplicationLabel(info).toString(), 
        packageManager.getApplicationIcon(pStats.packageName), 
        cacheSize)); 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return cacheSize; 
    } 
} 

이고, 다른 클래스는 내가 사용하고

private class TaskClean extends AsyncTask<Void, Void, Boolean> { 

    @Override 
    protected void onPreExecute() { 
     if (mOnActionListener != null) { 
      mOnActionListener.onCleanStarted(CleanerService.this); 
     } 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     final CountDownLatch countDownLatch = new CountDownLatch(1); 

     StatFs stat = new StatFs(Environment.getDataDirectory().getAbsolutePath()); 

     try { 
      if (canCleanInternalCache(CleanerService.this)) { 
       mFreeStorageAndNotifyMethod.invoke(getPackageManager(), 
         (long) stat.getBlockCount() * (long) stat.getBlockSize(), 
         new IPackageDataObserver.Stub() { 
          @Override 
          public void onRemoveCompleted(String packageName, boolean succeeded) 
            throws RemoteException { 
           countDownLatch.countDown(); 
          } 
         } 
       ); 
      } else { 
       countDownLatch.countDown(); 
      } 


       if (isExternalStorageWritable()) { 
        final File externalDataDirectory = new File(Environment 
          .getExternalStorageDirectory().getAbsolutePath() + "/Android/data"); 

        final String externalCachePath = externalDataDirectory.getAbsolutePath() + 
          "/%s/cache"; 

        if (externalDataDirectory.isDirectory()) { 
         final File[] files = externalDataDirectory.listFiles(); 

         for (File file : files) { 
          if (!deleteDirectory(new File(String.format(externalCachePath, 
            file.getName())), true)) { 
           Log.e(TAG, "External storage suddenly becomes unavailable"); 

           return false; 
          } 
         } 
        } else { 
         Log.e(TAG, "External data directory is not a directory!"); 
        } 
       } else { 
        Log.d(TAG, "External storage is unavailable"); 
       } 


      countDownLatch.await(); 
     } catch (InterruptedException | IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      return false; 
     } 

     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     if (result) { 
      mCacheSize = 0; 
     } 

     if (mOnActionListener != null) { 
      mOnActionListener.onCleanCompleted(CleanerService.this, result); 
     } 

     mIsCleaning = false; 
    } 

    private boolean deleteDirectory(File file, boolean directoryOnly) { 
     if (!isExternalStorageWritable()) { 
      return false; 
     } 

     if (file == null || !file.exists() || (directoryOnly && !file.isDirectory())) { 
      return true; 
     } 

     if (file.isDirectory()) { 
      final File[] children = file.listFiles(); 

      if (children != null) { 
       for (File child : children) { 
        if (!deleteDirectory(child, false)) { 
         return false; 
        } 
       } 
      } 
     } 
     file.delete(); 

     return true; 
    } 

    private boolean isExternalStorageWritable() { 
     return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); 
    } 
} 

// 코드입니다 자체 클래스

당신이 EXTERNAL_STORAGE (읽기/쓰기)를 부착
public void cleanCache() { 
    mIsCleaning = true; 
    try{ 
     new TaskClean().execute(); 
    } 
    catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 

} 
+0

나타날 수있는 가능한 널 사례를 확인하고 또한 TaskScan 및 TaskScan이 서로 의존하고 있는지 확인 여부 뭔가가 액세스 될 때 어딘가 null입니다. logcat 출력을 읽고 실패한 행을 확인한 다음 거기에서 추적 할 수 있습니다. – squeeish

+0

@squeeish 나는 간단하게 디버깅하고 실행할 때 오류가 없지만 Apk File을 만들면 오류가 발생합니다. 어떻게 추적 할 수 있습니까? – laraib

+0

logcat에서 서명 된 apk 또는 디버그 apk를 실행했는지 여부에 관계없이 장치에서 apk 파일을 실행할 때 오류가 발생한 행을 찾을 수 있습니다. – squeeish

답변

0

확인 매니페스트 권한

+0

TaskScan과 TaskClean이 서로 종속되어 있는지 확인하는 방법은 무엇입니까? – laraib

+0

AsynchTask를 사용하는 곳에서 코드를 공유 할 수 있습니까? – LordGrim

+0

게시물을 편집 했으므로 지금 확인하십시오 – laraib