11

我最近为经常修改设备的 root 用户制作了这个应用程序。

现在我注意到应用程序的安装大小出现了非常奇怪的行为。

当我使用从 XML 文件初始化视图的常规活动时,大小为715 kb.

 @Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.main_layout);
    executeEvents = new ExecuteEvents(this);
    display = (TextView) findViewById(R.id.display);
    powermenu = (Button) findViewById(R.id.powermenu);
    turnoffscreen = (Button) findViewById(R.id.turnscreenoff);
    mapButton = (ImageButton) findViewById(R.id.mapButton);
    SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
    if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
        display.setText(getResources().getString(R.string.configured));
    mapButton.setOnClickListener(this);
    powermenu.setOnClickListener(this);
    turnoffscreen.setOnClickListener(this);
}

在我切换到创建的对话框后,设置了一个包含 XML 文件中的小部件的视图。应用程序大小现在是200kb.

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    //setContentView(R.layout.main_layout);
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.main_layout, null);
    executeEvents = new ExecuteEvents(this);
    display = (TextView) view.findViewById(R.id.display);
    powermenu = (Button) view.findViewById(R.id.powermenu);
    turnoffscreen = (Button) view.findViewById(R.id.turnscreenoff);
    mapButton = (ImageButton) view.findViewById(R.id.mapButton);
    SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
    if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
        display.setText(getResources().getString(R.string.configured));
    mapButton.setOnClickListener(this);
    powermenu.setOnClickListener(this);
    turnoffscreen.setOnClickListener(this);

    Dialog dialog = new Dialog(this);
    dialog.setContentView(view);
    dialog.setTitle(getResources().getString(R.string.app_name));
    dialog.show();
}

它减少到80kb我使用它的时候:

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    dialog = new Dialog(this);
    dialog.setContentView(R.layout.main_layout);
    executeEvents = new ExecuteEvents(this);
    display = (TextView) dialog.findViewById(R.id.display);
    powermenu = (Button) dialog.findViewById(R.id.powermenu);
    turnoffscreen = (Button) dialog.findViewById(R.id.turnscreenoff);
    mapButton = (ImageButton) dialog.findViewById(R.id.mapButton);
    SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
    if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
        display.setText(getString(R.string.configured));
    mapButton.setOnClickListener(this);
    powermenu.setOnClickListener(this);
    turnoffscreen.setOnClickListener(this);
    dialog.setTitle(getString(R.string.app_name));
    dialog.show();
    dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialogInterface) {
            dialog.dismiss();
            MainActivity.this.finish();
        }
    });
}

当我尝试使用最后一种代码样式(那个80kb)添加动画时,我还注意到应用程序大小的另一个奇怪变化。应用程序大小变得庞大1 MB。这就是我初始化动画并尝试在单击按钮时调用它的方式:

private static final ScaleAnimation animation = new ScaleAnimation(1, .95f, 1, .95f, Animation.RELATIVE_TO_SELF, (float)0.5, Animation.RELATIVE_TO_SELF, (float)0.5);//declared as global variable

在 onCreate 方法内部:

animation.setDuration(1000);
animation.setFillAfter(false);

之后我在以下位置调用它onClickListener

mapButton.startAnimation(animation);

为什么在我没有添加任何新资源而只是更改代码样式的情况下,应用程序大小会发生如此巨大的变化?我初始化对话框中出现的小部件的方式哪里有这么大的不同?当我以我添加的方式添加动画时,为什么会有巨大的差异?

跟进问题:

 @Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.main_layout);
    executeEvents = new ExecuteEvents(this);
    display = (TextView) this.findViewById(R.id.display);
    powermenu = (Button) this.findViewById(R.id.powermenu);
    turnoffscreen = (Button) this.findViewById(R.id.turnscreenoff);
    mapButton = (ImageButton) this.findViewById(R.id.mapButton);
    SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
    if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
        display.setText(getResources().getString(R.string.configured));
    mapButton.setOnClickListener(this);
    powermenu.setOnClickListener(this);
    turnoffscreen.setOnClickListener(this);
}

投机

这可能是由于导入的包或类造成的吗?animation至少对于问题的一部分来说是有意义的。

添加视图初始化的上下文会减少内存使用吗?

4

1 回答 1

9

是的,您的推测几乎是正确的,因此您可能知道所有 Java 代码首先通过 say 编译为 Java 字节码javac,然后dx将它们转换为 Dalvik 字节码,您的 dalvik 字节码文件(又名dex)打包在您的 apk 中(顺便说一句 apk大小变化不大,因为 zip 压缩有帮助)通常classes.dex,稍后当您在设备中安装 apk 时,Android 可能会针对该特定设备(又名odex)对其进行优化。

因此,要验证您的最终缓存是否dex确实发生了变化并且是造成这种大小变化的原因,例如添加动画,您可以通过解压缩 apk 或在设备内部找到它,我总是发现第二个选项更令人兴奋:

所以这是你的dex没有动画(你的80kb):

http://i.imgur.com/2JkpWS3.png

以及您的应用信息:

http://i.imgur.com/HseGJih.png

所以这是你dex的动画(你的1 MB):

http://i.imgur.com/pyrthYd.png

以及您的应用信息:

http://i.imgur.com/FSVPWAC.png

仔细看看你会发现它们确实不同,只要在你的 dalvik 字节码常量池中查看:

http://i.imgur.com/02mqaif.png

出于某种原因,我没有得到如此巨大的大小差异,但它很明显,我使用 gradle + Android Studio 构建了你的应用程序,所以我认为它们有助于和优化一些东西。

最后,您可以使用 ProGuard,但是,嘿!现在有些 k 并没有那么多,我不会担心在你的应用程序中添加一些“胖”,只要它能让它变得更好,当然总是有改进的余地,但请记住你不是在 java4k 或其他东西像那样 :)

于 2013-07-18T03:34:23.120 回答