Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android4.4中通過mm編譯apk時,apk中jni 一些native方法找不到 ERROR: couldn't find native method

Android4.4中通過mm編譯apk時,apk中jni 一些native方法找不到 ERROR: couldn't find native method

編輯:關於Android編程

在Android4.4下通過mm編譯apk時,出現一些native類找不到的情況,原因是被produard優化掉了。在Android4.2中我並沒有遇到這個問題。

1. proguard是做什麼的,ProGuard是一個免費的java類文件壓縮、優化、混淆器。它探測並刪除沒有使用的類、字段、方法和屬性。它刪除沒有用的說明並使用字節碼得到最大優化。它使用無意義的名字來重命名類、字段和方法.。

ProGuard的使用是為了:

(1) 創建緊湊的代碼文檔是為了更快的網絡傳輸,快速裝載和更小的內存占用;
(2) 創建的程序和程序庫很難使用反向工程;
(3) 所以它能刪除來自源文件中的沒有調用的代碼;
(4) 充分利用java6的快速加載的優點來提前檢測和返回java6中存在的類文件。

2. 因為proguard是混淆工具,所以android的mk文件也對其支持為兩種方式:
1) 指定不需要混淆的native方法與變量的proguard.flags文件,在mk文件下增加:

如:LOCAL_PROGUARD_FLAG_FILES := $(LOCAL_PATH)/proguard.flags

proguard.flags的內容如下:

##---------------Begin: proguard configuration common for all Android apps ----------
-optimizationpasses 5


#混淆時不會產生形形色色的類名
-dontusemixedcaseclassnames

#指定不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose

-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*,!method/removal/*

#優化時允許訪問並修改有修飾符的類和類的成員
#-allowaccessmodification

#保留指定的屬性
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

#保護指定類的成員,如果此類受到保護他們會保護的更好
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers class **.R$* {
public static ;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep public class * {
public protected *;
}

-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
##---------------End: proguard configuration common for all Android apps ----------

##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
#保護給定的可選屬性
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }

# Application classes that will be serialized/deserialized over Gson
# -keep public class net.unitepower.mcd.vo.** { *; }
##---------------End: proguard configuration for Gson ----------


2) 制定編譯的工程,不要使用代碼混淆的工具進行代碼混淆
如:LOCAL_PROGUARD_ENABLED := disabled
3) 不設置,默認使用LOCAL_PROGUARD_ENABLED := full.即將該工程代碼全部混淆
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved