Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
ql04210214
jadx
提交
e0aedc79
J
jadx
项目概览
ql04210214
/
jadx
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jadx
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
e0aedc79
编写于
8月 15, 2022
作者:
S
Skylot
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: improve top block search for try/catch (#1633)
上级
bad78de7
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
691 addition
and
31 deletion
+691
-31
jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java
jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java
+39
-9
jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
+10
-0
jadx-core/src/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java
...c/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java
+4
-0
jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java
...src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java
+5
-5
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java
.../jadx/core/dex/visitors/blocks/BlockExceptionHandler.java
+7
-4
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockSplitter.java
...ain/java/jadx/core/dex/visitors/blocks/BlockSplitter.java
+3
-2
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/DominatorTree.java
...ain/java/jadx/core/dex/visitors/blocks/DominatorTree.java
+3
-10
jadx-core/src/main/java/jadx/core/utils/BlockUtils.java
jadx-core/src/main/java/jadx/core/utils/BlockUtils.java
+1
-1
jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch4.java
.../jadx/tests/integration/trycatch/TestNestedTryCatch4.java
+18
-0
jadx-core/src/test/smali/trycatch/TestNestedTryCatch4.smali
jadx-core/src/test/smali/trycatch/TestNestedTryCatch4.smali
+601
-0
未找到文件。
jadx-core/src/main/java/jadx/core/dex/nodes/BlockNode.java
浏览文件 @
e0aedc79
...
...
@@ -19,29 +19,59 @@ import static jadx.core.utils.Utils.lockList;
public
final
class
BlockNode
extends
AttrNode
implements
IBlock
,
Comparable
<
BlockNode
>
{
/**
* Const ID
*/
private
final
int
cid
;
/**
* ID linked to position in blocks list (easier to use BitSet)
* TODO: rename to avoid confusion
*/
private
int
id
;
/**
* Offset in methods bytecode
*/
private
final
int
startOffset
;
private
final
List
<
InsnNode
>
instructions
=
new
ArrayList
<>(
2
);
private
List
<
BlockNode
>
predecessors
=
new
ArrayList
<>(
1
);
private
List
<
BlockNode
>
successors
=
new
ArrayList
<>(
1
);
private
List
<
BlockNode
>
cleanSuccessors
;
// all dominators
/**
* All dominators, excluding self
*/
private
BitSet
doms
=
EmptyBitSet
.
EMPTY
;
// dominance frontier
/**
* Dominance frontier
*/
private
BitSet
domFrontier
;
// immediate dominator
/**
* Immediate dominator
*/
private
BlockNode
idom
;
// blocks on which dominates this block
/**
* Blocks on which dominates this block
*/
private
List
<
BlockNode
>
dominatesOn
=
new
ArrayList
<>(
3
);
public
BlockNode
(
int
id
,
int
offset
)
{
public
BlockNode
(
int
cid
,
int
id
,
int
offset
)
{
this
.
cid
=
cid
;
this
.
id
=
id
;
this
.
startOffset
=
offset
;
}
public
void
setId
(
int
id
)
{
public
int
getCId
()
{
return
cid
;
}
void
setId
(
int
id
)
{
this
.
id
=
id
;
}
...
...
@@ -188,12 +218,12 @@ public final class BlockNode extends AttrNode implements IBlock, Comparable<Bloc
return
false
;
}
BlockNode
other
=
(
BlockNode
)
obj
;
return
id
==
other
.
id
&&
startOffset
==
other
.
startOffset
;
return
cid
==
other
.
c
id
&&
startOffset
==
other
.
startOffset
;
}
@Override
public
int
compareTo
(
@NotNull
BlockNode
o
)
{
return
Integer
.
compare
(
id
,
o
.
id
);
return
Integer
.
compare
(
cid
,
o
.
c
id
);
}
@Override
...
...
@@ -203,6 +233,6 @@ public final class BlockNode extends AttrNode implements IBlock, Comparable<Bloc
@Override
public
String
toString
()
{
return
"B:"
+
id
+
':'
+
InsnUtils
.
formatOffset
(
startOffset
);
return
"B:"
+
c
id
+
':'
+
InsnUtils
.
formatOffset
(
startOffset
);
}
}
jadx-core/src/main/java/jadx/core/dex/nodes/MethodNode.java
浏览文件 @
e0aedc79
...
...
@@ -61,6 +61,7 @@ public class MethodNode extends NotificationAttrNode implements IMethodDetails,
private
List
<
RegisterArg
>
argsList
;
private
InsnNode
[]
instructions
;
private
List
<
BlockNode
>
blocks
;
private
int
blocksMaxCId
;
private
BlockNode
enterBlock
;
private
BlockNode
exitBlock
;
private
List
<
SSAVar
>
sVars
;
...
...
@@ -318,6 +319,15 @@ public class MethodNode extends NotificationAttrNode implements IMethodDetails,
public
void
setBasicBlocks
(
List
<
BlockNode
>
blocks
)
{
this
.
blocks
=
blocks
;
int
i
=
0
;
for
(
BlockNode
block
:
blocks
)
{
block
.
setId
(
i
);
i
++;
}
}
public
int
getNextBlockCId
()
{
return
blocksMaxCId
++;
}
public
BlockNode
getEnterBlock
()
{
...
...
jadx-core/src/main/java/jadx/core/dex/trycatch/TryCatchBlockAttr.java
浏览文件 @
e0aedc79
...
...
@@ -60,6 +60,10 @@ public class TryCatchBlockAttr implements IJadxAttribute {
return
throwFound
;
}
public
int
getId
()
{
return
id
;
}
public
List
<
ExceptionHandler
>
getHandlers
()
{
return
handlers
;
}
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/DotGraphVisitor.java
浏览文件 @
e0aedc79
...
...
@@ -100,7 +100,7 @@ public class DotGraphVisitor extends AbstractVisitor {
if
(
insnArr
==
null
)
{
return
;
}
BlockNode
block
=
new
BlockNode
(
0
,
0
);
BlockNode
block
=
new
BlockNode
(
0
,
0
,
0
);
List
<
InsnNode
>
insnList
=
block
.
getInstructions
();
for
(
InsnNode
insn
:
insnArr
)
{
if
(
insn
!=
null
)
{
...
...
@@ -199,7 +199,7 @@ public class DotGraphVisitor extends AbstractVisitor {
dot
.
add
(
"color=red,"
);
}
dot
.
add
(
"label=\"{"
);
dot
.
add
(
String
.
valueOf
(
block
.
getId
())).
add
(
"\\:\\ "
);
dot
.
add
(
String
.
valueOf
(
block
.
get
C
Id
())).
add
(
"\\:\\ "
);
dot
.
add
(
InsnUtils
.
formatOffset
(
block
.
getStartOffset
()));
if
(!
attrs
.
isEmpty
())
{
dot
.
add
(
'|'
).
add
(
attrs
);
...
...
@@ -230,10 +230,10 @@ public class DotGraphVisitor extends AbstractVisitor {
if
(
PRINT_DOMINATORS
)
{
for
(
BlockNode
c
:
block
.
getDominatesOn
())
{
conn
.
startLine
(
block
.
get
Id
()
+
" -> "
+
c
.
get
Id
()
+
"[color=green];"
);
conn
.
startLine
(
block
.
get
CId
()
+
" -> "
+
c
.
getC
Id
()
+
"[color=green];"
);
}
for
(
BlockNode
dom
:
BlockUtils
.
bitSetToBlocks
(
mth
,
block
.
getDomFrontier
()))
{
conn
.
startLine
(
"f_"
+
block
.
get
Id
()
+
" -> f_"
+
dom
.
get
Id
()
+
"[color=blue];"
);
conn
.
startLine
(
"f_"
+
block
.
get
CId
()
+
" -> f_"
+
dom
.
getC
Id
()
+
"[color=blue];"
);
}
}
}
...
...
@@ -273,7 +273,7 @@ public class DotGraphVisitor extends AbstractVisitor {
private
String
makeName
(
IContainer
c
)
{
String
name
;
if
(
c
instanceof
BlockNode
)
{
name
=
"Node_"
+
((
BlockNode
)
c
).
getId
();
name
=
"Node_"
+
((
BlockNode
)
c
).
get
C
Id
();
}
else
if
(
c
instanceof
IBlock
)
{
name
=
"Node_"
+
c
.
getClass
().
getSimpleName
()
+
'_'
+
c
.
hashCode
();
}
else
{
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockExceptionHandler.java
浏览文件 @
e0aedc79
...
...
@@ -171,10 +171,6 @@ public class BlockExceptionHandler {
}
}
protected
static
void
removeTmpConnections
(
MethodNode
mth
)
{
mth
.
getBasicBlocks
().
forEach
(
BlockExceptionHandler:
:
removeTmpConnection
);
}
private
static
void
removeTmpConnection
(
BlockNode
block
)
{
TmpEdgeAttr
tmpEdgeAttr
=
block
.
get
(
AType
.
TMP_EDGE
);
if
(
tmpEdgeAttr
!=
null
)
{
...
...
@@ -402,6 +398,13 @@ public class BlockExceptionHandler {
}
BlockNode
topDom
=
BlockUtils
.
getCommonDominator
(
mth
,
blocks
);
if
(
topDom
!=
null
)
{
// dominator always return one up block if blocks already contains dominator, use successor instead
if
(
topDom
.
getSuccessors
().
size
()
==
1
)
{
BlockNode
upBlock
=
topDom
.
getSuccessors
().
get
(
0
);
if
(
blocks
.
contains
(
upBlock
))
{
return
upBlock
;
}
}
return
adjustTopBlock
(
topDom
);
}
throw
new
JadxRuntimeException
(
"Failed to find top block for try-catch from: "
+
blocks
);
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/BlockSplitter.java
浏览文件 @
e0aedc79
...
...
@@ -137,8 +137,9 @@ public class BlockSplitter extends AbstractVisitor {
}
static
BlockNode
startNewBlock
(
MethodNode
mth
,
int
offset
)
{
BlockNode
block
=
new
BlockNode
(
mth
.
getBasicBlocks
().
size
(),
offset
);
mth
.
getBasicBlocks
().
add
(
block
);
List
<
BlockNode
>
blocks
=
mth
.
getBasicBlocks
();
BlockNode
block
=
new
BlockNode
(
mth
.
getNextBlockCId
(),
blocks
.
size
(),
offset
);
blocks
.
add
(
block
);
return
block
;
}
...
...
jadx-core/src/main/java/jadx/core/dex/visitors/blocks/DominatorTree.java
浏览文件 @
e0aedc79
...
...
@@ -25,23 +25,16 @@ public class DominatorTree {
List
<
BlockNode
>
sorted
=
sortBlocks
(
mth
);
BlockNode
[]
doms
=
build
(
sorted
);
apply
(
sorted
,
doms
);
mth
.
setBasicBlocks
(
sorted
);
}
private
static
List
<
BlockNode
>
sortBlocks
(
MethodNode
mth
)
{
int
blocksCount
=
mth
.
getBasicBlocks
().
size
();
BitSet
reachSet
=
new
BitSet
(
blocksCount
);
List
<
BlockNode
>
sorted
=
new
ArrayList
<>(
blocksCount
);
BlockUtils
.
dfsVisit
(
mth
,
b
->
{
sorted
.
add
(
b
);
reachSet
.
set
(
b
.
getId
());
});
if
(
reachSet
.
cardinality
()
!=
blocksCount
)
{
BlockUtils
.
dfsVisit
(
mth
,
sorted:
:
add
);
if
(
sorted
.
size
()
!=
blocksCount
)
{
throw
new
JadxRuntimeException
(
"Found unreachable blocks"
);
}
for
(
int
i
=
0
;
i
<
blocksCount
;
i
++)
{
sorted
.
get
(
i
).
setId
(
i
);
}
mth
.
setBasicBlocks
(
sorted
);
return
sorted
;
}
...
...
jadx-core/src/main/java/jadx/core/utils/BlockUtils.java
浏览文件 @
e0aedc79
...
...
@@ -697,7 +697,7 @@ public class BlockUtils {
}
/**
* Search lowest common ancestor in dominator tree for input set.
* Search
the
lowest common ancestor in dominator tree for input set.
*/
@Nullable
public
static
BlockNode
getCommonDominator
(
MethodNode
mth
,
List
<
BlockNode
>
blocks
)
{
...
...
jadx-core/src/test/java/jadx/tests/integration/trycatch/TestNestedTryCatch4.java
0 → 100644
浏览文件 @
e0aedc79
package
jadx.tests.integration.trycatch
;
import
org.junit.jupiter.api.Test
;
import
jadx.tests.api.SmaliTest
;
import
static
jadx
.
tests
.
api
.
utils
.
assertj
.
JadxAssertions
.
assertThat
;
public
class
TestNestedTryCatch4
extends
SmaliTest
{
@Test
public
void
test
()
{
disableCompilation
();
assertThat
(
getClassNodeFromSmali
())
.
code
()
.
doesNotContain
(
"?? "
);
}
}
jadx-core/src/test/smali/trycatch/TestNestedTryCatch4.smali
0 → 100644
浏览文件 @
e0aedc79
.class public Ltrycatch/TestNestedTryCatch4;
.super Landroid/app/NativeActivity;
.method private test(Landroid/content/Intent;)V
.registers 11
.annotation system Ldalvik/annotation/MethodParameters;
accessFlags = {
0x0
}
names = {
"intent"
}
.end annotation
const-string v0, "IOException while closing input stream\n"
if-nez p1, :cond_5
return-void
:cond_5
const-string v1, "intent_cmd"
.line 1740
invoke-virtual {p1, v1}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
move-result-object v1
const-string v2, "MCPE"
if-eqz v1, :cond_80
.line 1741
invoke-virtual {v1}, Ljava/lang/String;->length()I
move-result v3
if-lez v3, :cond_80
.line 1743
:try_start_15
new-instance p1, Lorg/json/JSONObject;
invoke-direct {p1, v1}, Lorg/json/JSONObject;-><init>(Ljava/lang/String;)V
const-string v0, "Command"
.line 1744
invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
move-result-object v0
const-string v1, "keyboardResult"
.line 1745
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_33
const-string v0, "Text"
.line 1746
invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1
invoke-virtual {p0, p1}, Ltrycatch/TestNestedTryCatch4;->nativeSetTextboxText(Ljava/lang/String;)V
goto/16 :goto_208
:cond_33
const-string v1, "fileDialogResult"
.line 1748
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_208
iget-wide v0, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J
const-wide/16 v3, 0x0
cmp-long v5, v0, v3
if-eqz v5, :cond_208
const-string v0, "Result"
.line 1749
invoke-virtual {p1, v0}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
move-result-object v0
const-string v1, "Ok"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_5d
.line 1750
iget-wide v0, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J
const-string v5, "Path"
invoke-virtual {p1, v5}, Lorg/json/JSONObject;->getString(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1
invoke-virtual {p0, v0, v1, p1}, Ltrycatch/TestNestedTryCatch4;->nativeOnPickImageSuccess(JLjava/lang/String;)V
goto :goto_62
.line 1753
:cond_5d
iget-wide v0, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J
invoke-virtual {p0, v0, v1}, Ltrycatch/TestNestedTryCatch4;->nativeOnPickImageCanceled(J)V
.line 1755
:goto_62
iput-wide v3, p0, Ltrycatch/TestNestedTryCatch4;->mFileDialogCallback:J
:try_end_64
.catch Lorg/json/JSONException; {:try_start_15 .. :try_end_64} :catch_66
goto/16 :goto_208
:catch_66
move-exception p1
.line 1759
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "JSONObject exception:"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Lorg/json/JSONException;->toString()Ljava/lang/String;
move-result-object p1
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-static {v2, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
return-void
.line 1765
:cond_80
invoke-virtual {p1}, Landroid/content/Intent;->getAction()Ljava/lang/String;
move-result-object v1
.line 1766
invoke-virtual {p1}, Landroid/content/Intent;->getType()Ljava/lang/String;
const-string/jumbo v3, "xbox_live_game_invite"
.line 1768
invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
if-eqz v3, :cond_b0
const-string/jumbo v0, "xbl"
.line 1771
invoke-virtual {p1, v0}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
move-result-object p1
.line 1772
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v3, "[XboxLive] Received Invite "
invoke-virtual {v0, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-static {v2, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 1776
invoke-virtual {p0, v1, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V
goto/16 :goto_208
:cond_b0
const-string v3, "android.intent.action.VIEW"
.line 1779
invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v3
if-nez v3, :cond_c0
const-string v3, "org.chromium.arc.intent.action.VIEW"
invoke-virtual {v3, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_208
.line 1780
:cond_c0
invoke-virtual {p1}, Landroid/content/Intent;->getScheme()Ljava/lang/String;
move-result-object v1
.line 1781
invoke-virtual {p1}, Landroid/content/Intent;->getData()Landroid/net/Uri;
move-result-object p1
if-nez p1, :cond_cb
return-void
:cond_cb
const-string v3, "minecraft"
.line 1787
invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
move-result v3
if-nez v3, :cond_1f9
const-string v3, "minecraftedu"
invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
move-result v3
if-eqz v3, :cond_dd
goto/16 :goto_1f9
:cond_dd
const-string v3, "file"
.line 1795
invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
move-result v3
const-string v4, "&"
if-eqz v3, :cond_108
.line 1798
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String;
move-result-object p1
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
const-string v0, "fileIntent"
invoke-virtual {p0, v0, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V
goto/16 :goto_208
:cond_108
const-string v3, "content"
.line 1800
invoke-virtual {v3, v1}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
move-result v1
if-eqz v1, :cond_208
.line 1803
new-instance v1, Ljava/io/File;
invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String;
move-result-object v3
invoke-direct {v1, v3}, Ljava/io/File;-><init>(Ljava/lang/String;)V
invoke-virtual {v1}, Ljava/io/File;->getName()Ljava/lang/String;
move-result-object v1
.line 1804
new-instance v3, Ljava/io/File;
new-instance v5, Ljava/lang/StringBuilder;
invoke-direct {v5}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {p0}, Ltrycatch/TestNestedTryCatch4;->getApplicationContext()Landroid/content/Context;
move-result-object v6
invoke-virtual {v6}, Landroid/content/Context;->getCacheDir()Ljava/io/File;
move-result-object v6
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
const-string v6, "/"
invoke-virtual {v5, v6}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v5, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v5}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v1
invoke-direct {v3, v1}, Ljava/io/File;-><init>(Ljava/lang/String;)V
.line 1806
invoke-virtual {p0}, Ltrycatch/TestNestedTryCatch4;->getContentResolver()Landroid/content/ContentResolver;
move-result-object v1
.line 1810
:try_start_142
invoke-virtual {v1, p1}, Landroid/content/ContentResolver;->openInputStream(Landroid/net/Uri;)Ljava/io/InputStream;
move-result-object v1
:try_end_146
.catch Ljava/io/IOException; {:try_start_142 .. :try_end_146} :catch_1df
.line 1818
:try_start_146
new-instance v5, Ljava/io/FileOutputStream;
invoke-direct {v5, v3}, Ljava/io/FileOutputStream;-><init>(Ljava/io/File;)V
const/high16 v6, 0x100000
new-array v6, v6, [B
.line 1824
:goto_14f
invoke-virtual {v1, v6}, Ljava/io/InputStream;->read([B)I
move-result v7
const/4 v8, -0x1
if-eq v7, v8, :cond_15b
const/4 v8, 0x0
.line 1825
invoke-virtual {v5, v6, v8, v7}, Ljava/io/OutputStream;->write([BII)V
goto :goto_14f
.line 1828
:cond_15b
invoke-virtual {v5}, Ljava/io/OutputStream;->close()V
const-string v5, "contentIntent"
.line 1831
new-instance v6, Ljava/lang/StringBuilder;
invoke-direct {v6}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {p1}, Landroid/net/Uri;->getPath()Ljava/lang/String;
move-result-object p1
invoke-virtual {v6, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v6, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v3}, Ljava/io/File;->getAbsolutePath()Ljava/lang/String;
move-result-object p1
invoke-virtual {v6, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v6}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-virtual {p0, v5, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V
:try_end_17d
.catch Ljava/io/IOException; {:try_start_146 .. :try_end_17d} :catch_18b
.catchall {:try_start_146 .. :try_end_17d} :catchall_189
.line 1842
:try_start_17d
invoke-virtual {v1}, Ljava/io/InputStream;->close()V
:try_end_180
.catch Ljava/io/IOException; {:try_start_17d .. :try_end_180} :catch_182
goto/16 :goto_208
:catch_182
move-exception p1
.line 1845
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
goto :goto_1b1
:catchall_189
move-exception p1
goto :goto_1c3
:catch_18b
move-exception p1
.line 1833
:try_start_18c
new-instance v4, Ljava/lang/StringBuilder;
invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V
const-string v5, "IOException while copying file from content intent\n"
invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Ljava/io/IOException;->toString()Ljava/lang/String;
move-result-object p1
invoke-virtual {v4, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v4}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-static {v2, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
:try_end_1a4
.catchall {:try_start_18c .. :try_end_1a4} :catchall_189
.line 1837
:try_start_1a4
invoke-virtual {v3}, Ljava/io/File;->delete()Z
:try_end_1a7
.catch Ljava/lang/Exception; {:try_start_1a4 .. :try_end_1a7} :catch_1a7
.catchall {:try_start_1a4 .. :try_end_1a7} :catchall_189
.line 1842
:catch_1a7
:try_start_1a7
invoke-virtual {v1}, Ljava/io/InputStream;->close()V
:try_end_1aa
.catch Ljava/io/IOException; {:try_start_1a7 .. :try_end_1aa} :catch_1ab
goto :goto_208
:catch_1ab
move-exception p1
.line 1845
new-instance v1, Ljava/lang/StringBuilder;
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
:goto_1b1
invoke-virtual {v1, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Ljava/io/IOException;->toString()Ljava/lang/String;
move-result-object p1
invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-static {v2, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
goto :goto_208
.line 1842
:goto_1c3
:try_start_1c3
invoke-virtual {v1}, Ljava/io/InputStream;->close()V
:try_end_1c6
.catch Ljava/io/IOException; {:try_start_1c3 .. :try_end_1c6} :catch_1c7
goto :goto_1de
:catch_1c7
move-exception v1
.line 1845
new-instance v3, Ljava/lang/StringBuilder;
invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V
invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v1}, Ljava/io/IOException;->toString()Ljava/lang/String;
move-result-object v0
invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-static {v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
.line 1847
:goto_1de
throw p1
:catch_1df
move-exception p1
.line 1813
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v1, "IOException while opening file from content intent\n"
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {p1}, Ljava/io/IOException;->toString()Ljava/lang/String;
move-result-object p1
invoke-virtual {v0, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object p1
invoke-static {v2, p1}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I
return-void
.line 1788
:cond_1f9
:goto_1f9
invoke-virtual {p1}, Landroid/net/Uri;->getHost()Ljava/lang/String;
move-result-object v0
.line 1789
invoke-virtual {p1}, Landroid/net/Uri;->getQuery()Ljava/lang/String;
move-result-object p1
if-nez v0, :cond_205
if-eqz p1, :cond_208
.line 1792
:cond_205
invoke-virtual {p0, v0, p1}, Ltrycatch/TestNestedTryCatch4;->nativeProcessIntentUriQuery(Ljava/lang/String;Ljava/lang/String;)V
:cond_208
:goto_208
return-void
.end method
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录