Android 4.1 APKのリソースを動的にロード
3577 ワード
*** is not owned by the current user. Shared storage cannot protect your application from code injection attacks.
原因は上のログの一部Exception
この問題はAPKの関数とリソースを動的にロードすることに由来し、4.1以前のAndroidシステムでは正常に使用でき、4.1にアップグレードした後にこのExceptionが報告されることが分かった.
動的ロードとは、携帯電話のローカルにAPKパッケージがあり、ユーザーがインストールプロセスを実行する必要がなく、プログラムがパッケージを解除してAPKの関数とリソースを呼び出すことができます.ゲームコンポーネント、プラグイン、肌など、多くのシーンで使用されます.
動的ロードの1つのプロセスは、classになるAPKをパケット解除することである.dexはAPKから解凍され、javaの反射によってメソッドを呼び出すことができます.
このメソッドは、パケット解除中に必ず呼び出されます.
01
02
03
04
05
06
07
08
09
10
11
12
問題はここにあります.4.1のソースコードを見てみると、Googleはセキュリティの考慮に基づいてDexFileという関数にファイルの帰属権を検証するステップを追加したことがわかります.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
解決方法、パラメータoutputPathNameは必ずプログラム自身のプライベートアドレスを実行して、
01
このdexファイルの格納場所を取得する方法で、この問題を解決できます.
http://timcho.net/2013/01/16/android_4_1_dong_tai_jia_zai_apk_zhong_de_zi_yuan/
原因は上のログの一部Exception
この問題はAPKの関数とリソースを動的にロードすることに由来し、4.1以前のAndroidシステムでは正常に使用でき、4.1にアップグレードした後にこのExceptionが報告されることが分かった.
動的ロードとは、携帯電話のローカルにAPKパッケージがあり、ユーザーがインストールプロセスを実行する必要がなく、プログラムがパッケージを解除してAPKの関数とリソースを呼び出すことができます.ゲームコンポーネント、プラグイン、肌など、多くのシーンで使用されます.
動的ロードの1つのプロセスは、classになるAPKをパケット解除することである.dexはAPKから解凍され、javaの反射によってメソッドを呼び出すことができます.
このメソッドは、パケット解除中に必ず呼び出されます.
01
02
03
04
05
06
07
08
09
10
11
12
static
public
DexFile loadDex(String sourcePathName, String outputPathName,
int flags) throws IOException {
/*
* TODO: we may want to cache previously-opened DexFile objects.
* The cache would be synchronized with close(). This would help
* us avoid mapping the same DEX more than once when an app
* decided to open it multiple times. In practice this may not
* be a real issue.
*/
return
new
DexFile(sourcePathName, outputPathName, flags);
}
問題はここにあります.4.1のソースコードを見てみると、Googleはセキュリティの考慮に基づいてDexFileという関数にファイルの帰属権を検証するステップを追加したことがわかります.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
private
DexFile(String sourceName, String outputName, int flags) throws IOException {
if
(outputName != null) {
try
{
String parent =
new
File(outputName).getParent();
if
(Libcore.os.getuid() != Libcore.os.stat(parent).st_uid) {
//
//4.1 uid uid ,
throw
new
IllegalArgumentException(
"Optimized data directory "
+ parent
+
" is not owned by the current user. Shared storage cannot protect"
+
" your application from code injection attacks."
);
}
}
catch
(ErrnoException ignored) {
// assume we'll fail with a more contextual error later
}
}
mCookie = openDexFile(sourceName, outputName, flags);
mFileName = sourceName;
guard.open(
"close"
);
//System.out.println("DEX FILE cookie is " + mCookie);
}
解決方法、パラメータoutputPathNameは必ずプログラム自身のプライベートアドレスを実行して、
01
getDir(
"dexfile"
, 0)
このdexファイルの格納場所を取得する方法で、この問題を解決できます.
http://timcho.net/2013/01/16/android_4_1_dong_tai_jia_zai_apk_zhong_de_zi_yuan/