Tôi đang cố loại bỏ các lớp không sử dụng khỏi thư viện Google Play Services
. Tôi đã tạo dự án Android hoàn toàn mới với một hoạt động trống đơn lẻ. Dự án không sử dụng mọi thứ từ thư viện Google Play Services
. Vì vậy, tôi mong đợi, khi tôi xây dựng bản phát hành (bao gồm chạy proguard trong cấu hình của tôi), tôi sẽ thấy không có sự khác biệt về kích thước nhị phân so sánh tòa nhà có/không có sự phụ thuộc play-services
. Nhưng trên thực tế, tôi thấy sự khác biệt ~ 700 KB ở kích thước apk
.Sử dụng Proguard để xóa các lớp không sử dụng trong thư viện Google Play Services
Tôi đã tìm thấy relatively complex solution, using gradle script, bao gồm việc đóng gói lại tệp play-services.jar. Ngoài ra, giải pháp này yêu cầu chỉ định rõ ràng từng gói sẽ không được sử dụng. Nhưng tôi không hiểu tại sao không proguard
thực hiện công việc này trong trường hợp của tôi?
build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
// !!! when I comment the line below, release APK is 700 KB smaller !!! //
compile 'com.google.android.gms:play-services:6.5.87'
}
proguard-rules.pro:
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.noplayservices">
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name=".ui.activities.MainActivity" android:icon="@drawable/ic_launcher">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java:
package com.test.noplayservices.ui.activities;
import android.app.Activity;
import android.os.Bundle;
import com.test.noplayservices.R;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.main_activity);
}
}
Proguard loại bỏ các lớp không sử dụng, nhưng tôi không chắc liệu nó có xóa dữ liệu 'public static' hay điều gì xảy ra với' initial initializers'. Tôi đặt cược các lớp học không được loại bỏ. Là dịch vụ google play một thư viện khổng lồ với tất cả các lớp liên quan, tôi đoán cách tiếp cận sẽ tương tự như những gì bạn nói: Chỉ cần cố gắng trích xuất các lớp bạn cần từ thư viện jar. BTW- Tôi đang sử dụng một cái lọ cũ nhỏ hơn nhiều so với những cái hiện tại, chúng tăng gấp 3 lần kích thước trong năm ngoái. – rupps
Ngoài ra, những gì bạn có thể làm là tải APK 700kb của bạn lên một trang web như http://www.decompileandroid.com/, tải APK của bạn xuống mã nguồn và xem các lớp GPS nào đã được đưa vào và cố gắng hiểu tại sao . Ít nhất bạn có thể xác định các quy tắc để loại trừ các lớp đó. Hãy nhớ để vô hiệu hóa obfuscationto rõ ràng xem các lớp học bao gồm! – rupps
bạn có thể muốn thêm 'shrinkResources true' cũng - xem [tại đây] (https://plus.google.com/u/0/+TorNorbye/posts/eHsStybrrBf) – natario