2016-08-23 7 views
37

私はPackageStatsを使用していますが、PackageStatsのcodeSize、cacheSize、dataSizeを印刷すると一部のデータが負になります。Android PackageStatsは負の値を返します

いくつかの質問:

  • どのようにこれは可能ですか?
  • apkのサイズが約50MBであることを考慮して、codeSizeがマイナスになるケースは何ですか?
  • 上記の情報を確実に抽出するために使用できる他の方法はありますか? Android用
  • また

は、Nそれは

  • はそれがAndroidのNのために削除されたり、それを使用するためのいくつかの方法があり、 "ないNoSuchMethodException"。だから、私を与えますか?
  • 上記のサイズを計算するのに役立つ代替手段はありますか?

コード:

PackageManager packageManager = context.getPackageManager(); 
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId"); 
int userID = (Integer) myUserId.invoke(packageManager); 

Method getPackageSizeInfo = packageManager.getClass().getDeclaredMethod("getPackageSizeInfo", String.class, int.class, 
IPackageStatsObserver.class); 
getPackageSizeInfo.invoke(packageManager, context.getPackageName(), userID, new IPackageStatsObserver.Stub() { 

    @Override 
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { 
     long codeSize = pStats.codeSize/MB; //long MB = 1024*1024; 
     long cacheSize = pStats.cacheSize/MB; 
     long dataSize = pStats.dataSize/MB; 
     long appSize = codeSize + cacheSize + dataSize; 
    }; 
} 
+0

値を表示/確認する方法やその値に対して実行される計算を含むコード例を追加できますか? – Zachary

+0

確認してください。私は1を除いて計算を実行していません。ここでは値を1024 * 1024で割り、値をMBで取得します。 – thepace

答えて

0

がそれを単にAPI 23/24にしようと、できるだけのインスタンス。

これらのexternal*プロパティは、SDカードを参照している可能性があります。

PackageStats stats = new PackageStats(context.getPackageName()); 
    long codeSize = stats.codeSize + stats.externalCodeSize; 
    long dataSize = stats.dataSize + stats.externalDataSize; 
    long cacheSize = stats.cacheSize + stats.externalCacheSize; 
    long appSize = codeSize + dataSize + cacheSize; 
+0

私はあなたに同意します。可能な限り長い場合はもう1つの方法です。 インスタンスだけではどういう意味ですか? – thepace

+0

@thepace "just instance it"とは 'invoke()'と 'onGetStatsCompleted()'のない 'new'キーワードを意味します。負の値は基本的に符号付き整数でしか使用できないため、最大値は4294967295ではなく2147483647(-2147483647は単純にエラーまたは不在の値を示しているかもしれません)...実際にコードを実行するユーザにとって重要ですがアプリケーション、ユーザープライベートおよびユーザー共有のストレージがあり、ユーザープライベート領域のサイズはさまざまです。 –

+0

正確なコマンドを共有してサイズを取得できますか(onGetStatsCompletedで指定する必要はありません) – thepace

関連する問題