6

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); 
    } 
} 
+0

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

+0

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

+1

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

Trả lời

9

Từ Dịch vụ Google Play phiên bản 6.5 và xa hơn nữa bạn có thể chọn các API cá nhân mà bạn muốn sử dụng, và nhập khẩu chỉ những người thân. Có thể điều đó sẽ giúp bạn giảm kích thước APK xuống một chút. Dưới đây là danh sách:

Google+       com.google.android.gms:play-services-plus:6.5.+ 
Google Account Login   com.google.android.gms:play-services-identity:6.5.+ 
Google Activity Recognition  com.google.android.gms:play-services-location:6.5.+ 
Google App Indexing    com.google.android.gms:play-services-appindexing:6.5.+ 
Google Cast      com.google.android.gms:play-services-cast:6.5.+ 
Google Drive     com.google.android.gms:play-services-drive:6.5.+ 
Google Fit      com.google.android.gms:play-services-fitness:6.5.+ 
Google Maps      com.google.android.gms:play-services-maps:6.5.+ 
Google Mobile Ads    com.google.android.gms:play-services-ads:6.5.+ 
Google Panorama Viewer   com.google.android.gms:play-services-panorama:6.5.+ 
Google Play Game services  com.google.android.gms:play-services-games:6.5.+ 
Google Wallet     com.google.android.gms:play-services-wallet:6.5.+ 
Android Wear     com.google.android.gms:play-services-wearable:6.5.+ 
Google Actions 
Google Analytics 
Google Cloud Messaging   com.google.android.gms:play-services-base:6.5.+ 

Bạn có thể xem thêm về điều này here.

+0

Giải pháp này trong cặp vợ chồng với 'shrinkResources' như @miav đề xuất nên thực hiện công việc! Cảm ơn! –

Các vấn đề liên quan