事象の水平線

個人的ブックマーク代わりなメモ書きブログ。 地球は丸いよ。↓このへん。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop
APK Expansion でうまく動かないと思ったら、googleのソースにバグがあったのでメモ。

APK Expansion に関するwhat? how? は以下参照
Expansion Filesについて(1) - obb作成編 - キノコの自省録
Expansion Filesについて(2) - obb利用編 - キノコの自省録
Expansion Filesについて(3) - obbダウンロード編 - キノコの自省録
[android] APK Expansion Files | Drowsy Dog's Diary
[android] APK Expansion Files(2) | Drowsy Dog's Diary
Androidの拡張ファイルから動画を再生する | Kludge factory
APK Expansion Files – チラシの裏

jobb を使って作ったobbはマウントできない環境があるとかないとか。
で、無圧縮zipがいけるぽいのでやってみた。

で、LibraryとしてReferする以下のコードがbugっぽい。

public class APKExpansionSupport {
// The shared path to all app expansion files
private final static String EXP_PATH = "/Android/obb/";

static String[] getAPKExpansionFiles(Context ctx, int mainVersion, int patchVersion) {
String packageName = ctx.getPackageName();
Vector ret = new Vector();
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// Build the full path to the app's expansion files
File root = Environment.getExternalStorageDirectory();
File expPath = new File(root.toString() + EXP_PATH + packageName);

// Check that expansion file path exists
if (expPath.exists()) {
if ( mainVersion > 0 ) {
String strMainPath = expPath + File.separator + "main." + mainVersion + "." + packageName + ".obb";
File main = new File(strMainPath);
if ( main.isFile() ) {
ret.add(strMainPath);
}
}
if ( patchVersion > 0 ) {
String strPatchPath = expPath + File.separator + "patch." + mainVersion + "." + packageName + ".obb";
File main = new File(strPatchPath);
if ( main.isFile() ) {
ret.add(strPatchPath);
}
}
}
}
String[] retArray = new String[ret.size()];
ret.toArray(retArray);
return retArray;
}
これ、コードをコピペして書き換え忘れちゃいました。じゃないんでしょーか。
patch がわのFile main は名前だけの問題なんで実質関係ないですが。

これによって、バージョン違いのpatchからデータが取り出せず。という状況になりました。
で、赤文字のint mainVersion を patchVersion へ書き換えて動いたわけですが。
ちなみに、mainとpatchと両方ともzipファイルで無いとzipファイルじゃないよとか言って落ちます。

ちなみにちなみに、Accessing expansion patch files bug (and solution)なんてのが2014年に書かれているけど。直ってないんですね。いまだにEclipseでやってるんで、AndroidStudioだとSDK直ってるとかないですよね?

スポンサーサイト

PageTop
検索で出てくるのは、情報が古いものが多い。
libraryで引っかかった気がしたら、”proguard libraryName”で検索するのが速そう。

基本的なことは【AndroidでのProGuard 使い方】とか参照

以下メモ。

【Android】難読化ツールProguard設定まとめ
http://kontany.net/blog/?p=86
<<引用>>
でproguardが適用されるのは、リリースビルドされる時です。
まず、ビルドの詳細ログが見られるようにするため、設定を変更します。
[Window] → [Preference] → [Android] → [Build] → [Build output]と順に選択していき、[Verbose]を選択。


吐かれるログを見て、無事終了したらプロジェクト直下に新たに「proguard」フォルダが生成され、中には「dump.txt」「mapping.txt」「seeds.txt」「usage.txt」の計4ファイルが入っている。
エラーが出た場合は、基本的にエラーで怒られたクラス名などを-keepしてあげれば改善される。まぁ個々は頑張るしかない。
(コンソールにBuild Logが流れてるようなときは、青いPCアイコンからAndroidに切り替えて見れる@Eclipse)
console_android.png


bug?
大量に出る
Warning: com.google.common.base.Equivalence: can't find referenced class javax.annotation.Nullable

こんなやつ(おそらくcommons.codec)
<<以下参照>>
http://stackoverflow.com/questions/27423614/add-jar-file-path-added-in-library-project-in-proguard
http://d.hatena.ne.jp/rudi/20110205/1296914415
http://qiita.com/amay077/items/328cd2dd6ad6d483b7b1
以下を追加(無視)で解決らしい
-dontwarn com.google.common.**




Android で Proguard を使う(ADT17以降)
http://qiita.com/amay077/items/328cd2dd6ad6d483b7b1
<<引用>>
-libraryjars について
外部ライブラリを使っている(/libs に jar を入れてる)場合、それらを -libraryjars xxx.jar と列挙しなければならないと 思っていた が不要らしい。
-libraryjars に列挙したら最初の一つしか library jar として認識してくれなくて「なにこれ?」と思ってググったら、
Using ProGuard with Android - StackOverflow 回答日-2012/06/28
1) ProGuard manual > Troubleshooting > Note: duplicate definition of program/library class
The Android Ant/Eclipse builds already specify -injars/-libraryjars for you. If you specify them again in your configuration, ProGuard notes that they are duplicated. So don't specify -injars/-libraryjars.
libs配下は既定で定義済だから proguard-project.txt の方で再定義しなくてよいらしい




proguard with sqlcipher
<<以下参照>>
https://gist.github.com/developernotes/3040592
結局以下だけでOK
-keep class net.sqlcipher.** { *; }




proguard with conceal
<<以下参照>>
https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-facebook-conceal.pro
以下を追加でOK
# Keep our interfaces so they can be used by other ProGuard rules.
# See http://sourceforge.net/p/proguard/bugs/466/
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters

# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.proguard.annotations.DoNotStrip *;
}

-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
void set*(***);
*** get*();
}



<<参照>>
ProGuardとLogCatとAdMobが織りなす罠
結局Logcatは手で消そうかな。と思った。

PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。