草庐IT

Android Proguard 不内联

coder 2023-11-21 原文

我使用的是最新的 Android SDK (4.1),我尝试导出一个启用了 Proguard 的签名 jar。然而,在反编译优化后的 APK 后,我注意到我期望内联的方法并没有。

我知道 Proguard 运行是因为代码被正确混淆了。所以为了确认这一点,我将这个方法添加到我的 Activity 中:

private void testInlining()
{
    mConfig = null;
}

这个私有(private)方法在我的 Activity 中只被调用一次,因为它是私有(private)的,所以对于优化器来说它应该很明显只被调用一次并且应该被内联。

文档说默认情况下启用所有优化,并且 Proguard“内联方法很短或只调用一次”。

我应该给 Proguard 一个特定的标志来启用内联吗?

编辑

我的proguard配置文件包含

-optimizationpasses 5
-allowaccessmodification
-overloadaggressively
-repackageclasses ''
-dontskipnonpubliclibraryclasses

编辑

使用后

-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;}

我明白了方法没有内联的原因:

 [proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21)
 [proguard]   is invoked by    com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15)
 [proguard]   implements       com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig()
 [proguard]   is invoked by    com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175)
 [proguard]   implements       android.app.Activity: void onCreate(android.os.Bundle)
 [proguard]   is a library method.

但是我不太确定这个方法testInlining是怎么看的在方法中使用 getIvConfig这反过来又被另一种方法使用,阻止了 testInlining 上的内联在 getIvConfig .

最佳答案

最近的 Android SDK 默认禁用所有优化,请参阅 ${sdk.dir}/tools/proguard/proguard-android.txt:

-dontoptimize

替代优化配置仅禁用一些优化,请参阅 ${sdk.dir}/tools/proguard/proguard-android-optimize.txt:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*

您可以在 project.properties 中指定您喜欢的配置文件。

您可以通过添加选项 -printconfiguration 来验证 ProGuard 使用的是哪个完整配置。

一些优化已被禁用以避免旧版本 Dalvik VM 中的错误 (!code/simplification/arithmetic,!code/simplification/cast),并且一些优化可能已被禁用以避免旧版本 Dalvik VM 中的错误ProGuard (!field/*,!class/merging/*).

注意-whyareyoukeeping指的是shrinking step,将不需要的classes/fields/methods作为一个整体去掉。未删除的方法可能会在优化步骤中内联(除非使用 -keep 明确指定)。

关于Android Proguard 不内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112514/

有关Android Proguard 不内联的更多相关文章

  1. ruby-on-rails - 带有内联附件的 Rails 邮件程序错误 - 2

    我在ActionMailer中有一个非常罕见的行为,我在5个月前实现了一个邮件程序操作并且它工作正常,但昨天,由于一些奇怪的原因,它崩溃了。问题我有一个邮件布局,为了在我所有的电子邮件中使用它,我在其中渲染了一张之前由前置过滤器附加的图像Layout=app/views/layouts/email.html.erbVisionamos>......用户邮件程序=app/mailers/users.rbclassUsuariosMailer"monitoreo@visionamos.com"layout"mail"#Setemaillayoutbefore_filter:add_inli

  2. ruby - Ruby 中有条件的内联和有条件的 block 之间的区别 - 2

    今天我遇到了Ruby的内联if和阻塞if这种奇怪的行为2.0.0-p247:001>inline_if='valuewillnotsetbutnoerror'ifinline_if=>nil2.0.0-p247:002>ifblock_if2.0.0-p247:003?>block_if='forgetaboutsettingvalue,Iwillraiseanerror'2.0.0-p247:004?>endNameError:undefinedlocalvariableormethod`block_if'formain:Objectfrom(irb):2from/Users/myu

  3. ruby - 编译 Ruby 内联 C 代码 - 解决错误 - 2

    我正在尝试获取此Ruby内联C代码http://pastie.org/2825882上类。该代码在vanillaC中运行,但在这里我收到错误和警告。是什么导致了这个错误?./backtrack_inline.rb:67:error:lvaluerequiredasunary'&'operand另外,为什么会出现以下错误?./backtrack_inline.rb:73:error:toofewargumentstofunction'backtrack'检查生成的C代码(http://pastie.org/2826036)我没有发现参数有任何问题。但我也收到以下警告:./backtrac

  4. ruby-on-rails - Rails 内联附件在 gmail 中未正确显示 - 2

    谁能指出我的问题?我在我的Rails3.1应用程序邮件程序中使用内联附件。这封信还包含存储在亚马逊w3服务器上的图像。问题是gmail没有正确显示信件。我在信中有内联附件。但是Gmail将这些文件显示为附件。这封信还包含一个附加的html页面,其中包含这封信本身。所有gmail显示都是一组符号,我想这些符号是其中一个附加图像的base64版本。查看屏幕截图。由于缺乏必要的评级,我无法发布图片,所以我发布了它here.这是我的邮件程序中的代码:attachments.inline['blank']=File.read("#{Rails.root.to_s+'/app/assets/ima

  5. ruby-on-rails - 我如何在 haml 中执行内联 if 语句 - 2

    我有这个火腿%table.form_upper{:style=>"display:none;",:id=>'profile-info'}%tr{:id=>'some-row'}如果满足条件,我如何在此表上不显示任何内容,例如我知道我可以做到这一点,但我觉得必须有一种内联方式来做到这一点-ifcondtion%table.form_upper{:id=>'profile-info'}-else%table.form_upper{:style=>"display:none;",:id=>'profile-info'}%tr{:id=>'some-row'} 最佳

  6. ruby - Rexml - 带有内联文本和缩进子标签的 pretty-print - 2

    我正在使用REXML构建xml文档,并希望以特定方式输出到文本。该文档是一个CuePoint标签列表,我用Element.new和add_element生成的标签都像这样混合成一行:(stackoverflow在这里将它们分成两行,但想象一下以下内容一行):15359eventinst_5016359eventinst_50当我将它们保存到文件中时,我希望它们看起来像这样:15359eventinst_5016359eventinst_50我尝试将值2传递给.write函数以缩进它们:这会产生以下结果:xml.write($stdout,2)产生15359eventinst_50163

  7. ruby-on-rails - 添加内联类 if ...(在 1 行中) - 2

    我想将一个类添加到一个link_to只有当一个陈述为真时。"last"ifproduct==@products.last%>IF语句影响整行而不仅仅是:class部分的问题。我知道我可以用IFELSE完成它,但是是否可以在一行中完成它? 最佳答案 (product==@products.last?"last":"")%> 关于ruby-on-rails-添加内联类if...(在1行中),我们在StackOverflow上找到一个类似的问题: https://s

  8. Ruby:切换 bool 内联? - 2

    如何使用内联方法获得Ruby中bool值的相反值(我知道它被转换为0/1)?假设我有给定的实例:classVotedefreturn_oppositeself.valueendend这显然什么都不做,但我似乎找不到像opposite()之类的简单而简短的方法。是否存在这样的事情,我只是没有在文档中查看正确的位置?如果一个不存在,是否有一个非常短的三元组可以将其从1=>0或0=>1切换? 最佳答案 我喜欢用这个@object.boolean=!@object.boolean 关于Ruby:

  9. ruby-on-rails - 为 Rails 中的邮件将外部 CSS 转换为内联 CSS - 2

    我正在尝试创建一个应用程序,该应用程序将发送样式繁多的电子邮件并要求客户端在Google的Gmail之外工作。我研究了这个问题,看起来Gmail从外部文件或嵌套在“样式”标签中的CSS中删除了CSS。是否存在将样式从外部文件移动到内联样式的简单方法?需要的东西:.wide{width:100px;}.cell{display:block;}Sample并将其转换为:Sample谢谢! 最佳答案 这里有一些您可以查看的精华:premailer或premailer-rails用于railsmail_stylepremailerplus(

  10. 编译器是否对所有内联函数调用执行相同的操作? - 2

    C++编译器是否会对将两个不同的呼叫呼叫采取不同的决定?考虑这样的代码:inlinefunc(intx){returnx+(x编译器会在循环之前对呼叫和循环中的呼叫执行相同的操作?如果我们考虑了代码长度以及速度优化,则不应将循环之前的呼叫与内部的呼叫,内部的呼叫。看答案这取决于您的编译器。假设你用gcc5.4.0和-O2优化水平。内部的第一行main功能inty=func(1)+func(2)+func(3)+func(4);将根据整数文字和内部的代码在编译时间计算for循环将被内衬。但是,如果您使用另一个编译器或另一个优化级别,则结果可能会有所不同。如果您希望检查代码的组件输出,请使用编译器

随机推荐